Меркурий (язык программирования)
Парадигма | Логический , функциональный , объектно-ориентированный [ нужна ссылка ] |
---|---|
Разработано | Золтан Шомоджи |
Разработчик | Университет Мельбурна |
Впервые появился | 8 апреля 1995 г |
Стабильная версия | 22.01.8 [1]
/ 8 сентября 2023 г |
Дисциплина набора текста | Сильный , статичный , полиморфный |
Язык реализации | Меркурий |
Платформа | IA-32 , x86-64 , Arm , SPARC 64, Java , CLI |
ТЫ | Кроссплатформенность : Unix , Linux , macOS , Solaris , FreeBSD , OpenBSD , Windows , Android. |
Лицензия | GPL- компилятор, LGPL Стандартная библиотека |
Расширения имен файлов | .м |
Веб-сайт | www |
Основные реализации | |
Мельбурнский Меркурий Компилятор | |
Под влиянием | |
Пролог , Хоуп , Хаскель |
Mercury — это язык функционального логического программирования, созданный для реального использования. Первая версия была разработана на факультете компьютерных наук Мельбурнского университета Фергусом Хендерсоном, Томасом Конвеем и Золтаном Сомоджи под руководством Сомоджи и выпущена 8 апреля 1995 года.
Mercury — чисто декларативный логический язык программирования . Это связано как с Прологом , так и с Haskell . [2] Он имеет строгую, статическую, полиморфную систему типов , а также строгую систему режимов и детерминизма.
Официальная реализация, Melbourne Mercury Compiler, доступна для большинства Unix и Unix-подобных платформ, включая Linux , macOS и Windows .
Обзор
[ редактировать ]Mercury основан на языке логического программирования Prolog . Он имеет тот же синтаксис и те же основные концепции, такие как алгоритм выборочного линейного разрешения определенных предложений (SLD). Его можно рассматривать как чистое подмножество Пролога со строгими типами и режимами. Таким образом, его часто сравнивают со своим предшественником по функциям и эффективности во время работы.
Язык разработан с использованием принципов программной инженерии . В отличие от исходных реализаций Пролога, он имеет отдельную фазу компиляции , а не прямую интерпретацию. Это позволяет обнаружить гораздо более широкий спектр ошибок перед запуском программы. Он имеет строгую статическую систему типов и режимов. [2] и модульная система.
Используя информацию, полученную во время компиляции (например, тип и режим), программы, написанные на Mercury, обычно работают значительно быстрее, чем эквивалентные программы, написанные на Прологе. [3] [4] Его авторы утверждают, что Mercury с большим отрывом является самым быстрым логическим языком в мире. [2]
Mercury — чисто декларативный язык, в отличие от Пролога , поскольку в нем отсутствуют экстралогические операторы Пролога, такие как !
(вырез) и императивный ввод/вывод (I/O). Это обеспечивает расширенный статический анализ и оптимизацию программ во время компиляции , включая сбор мусора . [5] но он может создавать определенные программные конструкции (например, переключение нескольких опций со значением по умолчанию). [ сомнительно – обсудить ] ) труднее выразить. Хотя Mercury и допускает нечистую функциональность, он служит главным образом для вызова кода на иностранном языке. Весь нечистый код должен быть явно помечен. Операции, которые обычно являются нечистыми (например, ввод/вывод ), в Mercury выражаются с использованием чистых конструкций с использованием линейных типов путем пропускания фиктивного мирового значения через весь соответствующий код.
Известные программы, написанные на Mercury, включают компилятор Mercury и форматтер Prince XML . Компания-разработчик программного обеспечения ODASE также использовала Mercury для разработки своей платформы разработки программного обеспечения, ориентированной на онтологии, ODASE. [6]
Серверные части
[ редактировать ]Mercury имеет несколько серверных частей, которые позволяют компилировать код Mercury на несколько языков, в том числе:
Уровень производства
[ редактировать ]- Низкоуровневый C для GNU Compiler Collection (GCC), исходной серверной части Mercury.
- Высокий уровень C
- Ява
- С#
Прошлое
[ редактировать ]- Язык ассемблера через серверную часть GCC
- Адити, дедуктивная система баз данных, также разработанная в Мельбурнском университете . Mercury-0.12.2 — последняя версия, поддерживающая Aditi. [ нужна ссылка ]
- Общий промежуточный язык (CIL) для .NET Framework
- Эрланг
Mercury также имеет интерфейс на иностранных языках, позволяющий связывать код на других языках (в зависимости от выбранной серверной части) с кодом Mercury. Возможны следующие иностранные языки:
Серверная часть | Иностранный язык(и) |
---|---|
C (оба уровня) | С |
Ява | Ява |
Эрланг | Эрланг |
ТО | Общий промежуточный язык (CIL) или C# |
Затем можно подключиться к другим языкам, вызвав их с этих языков. Однако это означает, что код на иностранном языке, возможно, придется писать несколько раз для разных серверных частей, иначе переносимость между серверными модулями будет потеряна.
Наиболее часто используемая серверная часть — это исходная низкоуровневая серверная часть C.
Примеры
[ редактировать ] :- module hello.
:- interface.
:- import_module io.
:- pred main(io::di, io::uo) is det.
:- implementation.
main(!IO) :-
io.write_string("Hello, World!\n", !IO).
Вычисление 10-го числа Фибоначчи (самым очевидным способом): [7]
:- module fib.
:- interface.
:- import_module io.
:- pred main(io::di, io::uo) is det.
:- implementation.
:- import_module int.
:- func fib(int) = int.
fib(N) = (if N =< 2 then 1 else fib(N - 1) + fib(N - 2)).
main(!IO) :-
io.write_string("fib(10) = ", !IO),
io.write_int(fib(10), !IO),
io.nl(!IO).
% Could instead use io.format("fib(10) = %d\n", [i(fib(10))], !IO).
!IO
это «переменная состояния», которая является синтаксическим сахаром для пары переменных, которым при компиляции присваиваются конкретные имена; например, приведенное выше обесцвечено до чего-то вроде:
main(IO0, IO) :-
io.write_string("fib(10) = ", IO0, IO1),
io.write_int(fib(10), IO1, IO2),
io.nl(IO2, IO).
График релизов
[ редактировать ]Схема именования стабильных выпусков составляла от 0,1 до 0,13 для первых тринадцати стабильных выпусков. В феврале 2010 года проект Mercury решил назвать каждую стабильную версию, используя год и месяц выпуска. Например, 10.04 относится к выпуску, выпущенному в апреле 2010 года.
Также часто существует периодический снимок текущего выпуска системы разработки (ROTD).
Поддержка IDE и редактора
[ редактировать ]- Разработчики обеспечивают поддержку Vim
- Библиотека Flycheck для Emacs
- Доступен плагин для Eclipse IDE.
- Доступен плагин для IDE NetBeans.
См. также
[ редактировать ]- Карри , еще один язык функциональной логики.
- Алиса , диалект языка стандартного машинного обучения.
- Logtalk — язык, объектно-ориентированное расширение Пролога, которое компилируется в Пролог.
- Оз/Моцарт , мультипарадигмальный язык
- Visual Prolog — язык, строго типизированное объектно-ориентированное расширение Пролога с новым синтаксисом.
Ссылки
[ редактировать ]- ^ «Выпуск 22.01.8» . 8 сентября 2023 г. Проверено 18 сентября 2023 г.
- ^ Jump up to: а б с Проект «Меркурий» — Мотивация
- ^ Проект Меркурий - Контрольные показатели
- ^ Сомоджи, Золтан; Хендерсон, Фергюс; Конвей, Томас (октябрь – декабрь 1996 г.). «Алгоритм исполнения Меркурия: эффективный чисто декларативный логический язык программирования» . Журнал логического программирования . 29 (1–3). Mercurylang.org: 17–64. CiteSeerX 10.1.1.46.9861 . дои : 10.1016/S0743-1066(96)00068-4 . Проверено 30 августа 2008 г.
- ^ Мазур, Нэнси (май 2004 г.). Сборка мусора во время компиляции для декларативного языка Mercury (PDF) (Диссертация). Католический университет Левена.
- ^ ОДАСЭ
- ^ Адаптировано из руководства Ральфа Беккета по Меркурию.