Парадигма | Логическая, функциональная, объектно-ориентированная |
---|---|
Разработано | Золтан Сомоги |
Разработчик | Мельбурнский университет |
Впервые появился | 8 апреля 1995 г. ; 25 лет назад ( 1995-04-08 ) |
Стабильный выпуск | 20.06.1 / 3 ноября 2020 г. ; 55 дней назад ( 2020-11-03 ) |
Печатная дисциплина | Сильный, статичный, полиморфный |
Язык реализации | Меркурий |
Платформа | IA-32, x86-64, ARM, Sparc64, Java, CLI, Erlang / OTP |
Операционные системы | Кроссплатформенность : Unix, Linux, macOS, Solaris, FreeBSD, OpenBSD, Windows, Android. |
Лицензия | Компилятор GPL, стандартная библиотека LGPL |
Расширения имени файла | .m |
Веб-сайт | www.mercurylang.org |
Основные реализации | |
Компилятор Melbourne Mercury | |
Под влиянием | |
Пролог, Надежда, Haskell |
Mercury - это функционально-логический язык программирования, предназначенный для использования в реальном мире. Первая версия была разработана на факультете компьютерных наук Мельбурнского университета Фергусом Хендерсоном, Томасом Конвеем и Золтаном Сомоги под руководством Сомоги и выпущена 8 апреля 1995 года.
Mercury - это язык программирования с чисто декларативной логикой. Это связано как с Прологом, так и с Haskell. Он имеет сильную, статическую, полиморфную систему типов, а также сильную систему модуляции и детерминизма.
Официальная реализация Melbourne Mercury Compiler доступна для большинства Unix и Unix-подобных платформ, включая Linux, macOS и Windows.
Mercury основан на языке логического программирования Prolog. Он имеет тот же синтаксис и те же основные концепции, такие как алгоритм выборочного линейного разрешения определенных предложений (SLD). Его можно рассматривать как чистое подмножество Prolog с сильными типами и режимами. Таким образом, его часто сравнивают со своим предшественником по функциям и эффективности во время выполнения.
Язык разработан с использованием принципов программной инженерии. В отличие от оригинальных реализаций Prolog, он имеет отдельную фазу компиляции, а не интерпретируется напрямую. Это позволяет обнаруживать гораздо более широкий спектр ошибок перед запуском программы. Он имеет строгую статическую систему типов и режимов и модульную систему.
Используя информацию, полученную во время компиляции (например, тип и режим), программы, написанные на Mercury, обычно работают значительно быстрее, чем эквивалентные программы, написанные на Prolog. Его авторы с большим отрывом заявляют, что Mercury - самый быстрый логический язык в мире.
В отличие от Пролога, Mercury является чисто декларативным языком, поскольку в нем отсутствуют дополнительные логические операторы Пролога, такие как (вырезать) и императивный ввод / вывод (I / O). Это позволяет оптимизировать анализ статической программы и оптимизацию программ, в том числе во время компиляции сборки мусора, но это может сделать определенные программные конструкции (например, коммутатором в течение ряда опций, с по умолчанию) труднее выразить. (Хотя Mercury действительно допускает нечистую функциональность, это служит в основном способом вызова кода на иностранном языке. Весь нечистый код должен быть явно отмечен.) Операции, которые обычно были бы нечистыми (например, ввод / вывод ), выражаются с использованием чистых конструкций в Mercury с использованием линейные типы, пропуская фиктивное мировое значение через весь соответствующий код. !
Известные программы, написанные на Mercury, включают компилятор Mercury и форматировщик Prince XML. Компания-производитель программного обеспечения Mission Critical IT также использует Mercury с 2000 года для разработки корпоративных приложений и своей платформы разработки программного обеспечения ODASE на основе онтологий.
Mercury имеет несколько бэкэндов, которые позволяют компилировать код Mercury на несколько языков, в том числе:
Mercury также имеет интерфейс на иностранном языке, позволяющий связывать код на других языках (в зависимости от выбранной серверной части) с кодом Mercury. Возможны следующие иностранные языки:
Бэкэнд | Иностранные языки) |
---|---|
C (оба уровня) | C |
Ява | Ява |
Erlang | Erlang |
IL | Общий промежуточный язык (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-го числа Фибоначчи (наиболее очевидным способом):
:- 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 =lt; 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).
Релизы названы в соответствии с годом и месяцем выпуска. Текущая стабильная версия - 20.06 (30 июня 2020 г.). Предыдущие выпуски имели номера 0,12, 0,13 и т. Д., А время между стабильными выпусками может достигать 3 лет.
Часто существует также выпуск моментальных снимков (ROTD), состоящий из последних функций и исправлений ошибок, добавленных в последний стабильный выпуск.