stringtranslate.com

Меркурий (язык программирования)

Mercury — это язык функционального логического программирования , созданный для реального использования. Первая версия была разработана на факультете компьютерных наук Мельбурнского университета Фергусом Хендерсоном, Томасом Конвеем и Золтаном Сомоджи под руководством Сомоджи и выпущена 8 апреля 1995 года.

Mercury — чисто декларативный логический язык программирования. Это связано как с Прологом , так и с Haskell . [2] Он имеет строгую, статическую, полиморфную систему типов , а также строгую систему режимов и детерминизма.

Официальная реализация, Melbourne Mercury Compiler, доступна для большинства Unix и Unix-подобных платформ, включая Linux , macOS и Windows .

Обзор

Mercury основан на языке логического программирования Prolog . Он имеет тот же синтаксис и те же основные концепции, такие как алгоритм выборочного линейного разрешения определенных предложений (SLD). Его можно рассматривать как чистое подмножество Пролога со строгими типами и режимами. Таким образом, его часто сравнивают со своим предшественником по функциям и эффективности во время работы.

Язык разработан с использованием принципов программной инженерии . В отличие от исходных реализаций Пролога, он имеет отдельную фазу компиляции , а не прямую интерпретацию. Это позволяет обнаружить гораздо более широкий спектр ошибок перед запуском программы. Он имеет строгую статическую систему типов и режимов [2] , а также систему модулей.

Используя информацию, полученную во время компиляции (например, тип и режим), программы, написанные на Mercury, обычно работают значительно быстрее, чем эквивалентные программы, написанные на Прологе. [3] [4] Его авторы утверждают, что Mercury с большим отрывом является самым быстрым логическим языком в мире. [2]

Mercury — чисто декларативный язык, в отличие от Пролога , поскольку в нем отсутствуют экстралогические операторы Пролога, такие как !(cut) и императивный ввод/вывод (I/O). Это обеспечивает расширенный статический анализ программы и ее оптимизацию , включая сбор мусора во время компиляции , [5] , но это может затруднить выражение определенных программных конструкций (таких как переключение нескольких параметров со значением по умолчанию [ сомнительнообсудить ] ). . Хотя Mercury и допускает нечистую функциональность, он служит главным образом для вызова кода на иностранном языке. Весь нечистый код должен быть явно помечен. Операции, которые обычно являются нечистыми (например, ввод/вывод ), в Mercury выражаются с использованием чистых конструкций с использованием линейных типов путем пропускания фиктивного мирового значения через весь соответствующий код.

Известные программы, написанные на Mercury, включают компилятор Mercury и форматтер Prince XML . Компания-разработчик программного обеспечения ODASE также использовала Mercury для разработки своей платформы разработки программного обеспечения, ориентированной на онтологии, ODASE. [6]

Серверные части

Mercury имеет несколько серверных частей, которые позволяют компилировать код Mercury на несколько языков, в том числе:

Уровень производства

Прошлое

Mercury также имеет интерфейс на иностранных языках, позволяющий связывать код на других языках (в зависимости от выбранной серверной части) с кодом Mercury. Возможны следующие иностранные языки:

Затем можно подключиться к другим языкам, вызвав их с этих языков. Однако это означает, что код на иностранном языке, возможно, придется писать несколько раз для разных серверных частей, иначе переносимость между серверными модулями будет потеряна.

Наиболее часто используемая серверная часть — это исходная низкоуровневая серверная часть C.

Примеры

Привет, мир :

 :-  модуль  привет .  :-  интерфейс .  :-  import_module  io .  :-  pred  main ( io : :di ,  io : :uo )  — это  det . :-  выполнение .  основной (! IO )  : -  io . write_string ( "Привет, Мир!\n" ,  ! IO ).

Вычисление 10-го числа Фибоначчи (наиболее очевидным способом): [7]

 :-  модуль  фиб .  :-  интерфейс .  :-  import_module  io .  :-  pred  main ( io : :di ,  io : :uo )  — это  det .  :-  выполнение .  :-  import_module  int . :-  func  fib ( int )  =  int .  fib ( N )  =  ( если  N  =<  2,  то  1  иначе  fib ( N  -  1 )  +  fib ( N  -  2 )). основной (! IO )  : -  io . write_string ( "fib(10) = " ,  ! IO ),  io . write_int ( фиб ( 10 ),  ! IO ),  io . нл (! ИО ).  % Вместо этого можно использовать io.format("fib(10) = %d\n", [i(fib(10))], !IO).

!IOэто «переменная состояния», которая является синтаксическим сахаром для пары переменных, которым при компиляции присваиваются конкретные имена; например, приведенное выше обесцвечено до чего-то вроде:

 основной ( IO0 ,  IO )  :-  io . write_string ( "fib(10) = " ,  IO0 ,  IO1 ),  io . write_int ( фиб ( 10 ),  IO1 ,  IO2 ),  io . nl ( IO2 ,  IO ).

График релизов

Схема именования стабильных выпусков составляла от 0,1 до 0,13 для первых тринадцати стабильных выпусков. В феврале 2010 года проект Mercury решил назвать каждую стабильную версию, используя год и месяц выпуска. Например, 10.04 относится к выпуску, выпущенному в апреле 2010 года.

Также часто существует периодический снимок текущей версии системы разработки (ROTD).

Поддержка IDE и редактора

Смотрите также

Рекомендации

  1. ^ «Выпуск 22.01.8». 8 сентября 2023 г. Проверено 18 сентября 2023 г.
  2. ^ abc Проект Меркурий - Мотивация
  3. ^ Проект Меркурий - Контрольные показатели
  4. ^ Сомоджи, Золтан; Хендерсон, Фергюс; Конвей, Томас (октябрь – декабрь 1996 г.). «Алгоритм выполнения Меркурия: эффективный чисто декларативный логический язык программирования». Журнал логического программирования . 29 (1–3). Mercurylang.org: 17–64. CiteSeerX 10.1.1.46.9861 . дои : 10.1016/S0743-1066(96)00068-4 . Проверено 30 августа 2008 г. 
  5. ^ Мазур, Нэнси (май 2004 г.). Сборка мусора во время компиляции для декларативного языка Mercury (PDF) (Диссертация). Католический университет Левена.
  6. ^ ОДАСЭ
  7. ^ Адаптировано из руководства Ральфа Беккета по Меркурию.

Внешние ссылки