Mercury (мова програмування)

Мова програмування функціональної логіки
У Вікіпедії є статті про інші значення цього терміна: Mercury (значення).
Mercury
ПарадигмаЛогічна, функціональна, об'єктно-орієнтована[джерело?]
Дата появи8 квітня 1995
ТворціЗолтан Шомодьї
РозробникУніверситет Мельбурна
Останній реліз
Система типізаціїСильна, статична, поліморфна
Основні реалізаціїMelbourne Mercury Compiler
Під впливом відProlog, Hope, Haskell
Мова реалізаціїMercury
ПлатформаIA-32, x86-64, ARM, SPARC64, Java, CLI
ЛіцензіяКомпілятор GPL,
Стандартна бібліотека LGPL
Звичайні розширення файлів.m
Репозиторій вихідного кодуgithub.com/Mercury-Language/mercury
Вебсайтwww.mercurylang.org

Mercury — це мова функціонально-логічного програмування, створена для реального використання. Перша версія була розроблена в університеті Мельбурна, факультеті комп'ютерних наук, Фергусом Гендерсоном, Томасом Конвейем і Золтаном Шомодьї, під керівництвом Шомодьї. Вона була випущена 8 квітня 1995 року.

Mercury — це суто декларативна логічна мова програмування. Вона пов'язана як з Prolog, так і з Haskell.[1]Вона має сильну, статичну, поліморфну систему типізації, а також сильну систему режимів і детермінізму.

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

Огляд

Mercury базується на логічній мові програмування Prolog. Вона має той самий синтаксис і ті самі базові поняття, такі як алгоритм вибіркової лінійної резолюції з визначеними твердженнями (ВЛВ). Її можна розглядати як чисту підгрупу Prolog з сильними типами та режимами. Тому її часто порівнюють з попередником за функціоналом та ефективністю виконання.

Мова розроблена з використанням принципів програмної інженерії. На відміну від оригінальних реалізацій Prolog, вона має окрему фазу компіляції, а не безпосередньо інтерпретується. Це дозволяє виявити набагато ширший спектр помилок ще до запуску програми. Вона має сувору систему статичної типізації і режимів[1] та систему модулів.

Використовуючи інформацію, отриману під час компіляції (наприклад, тип і режим), програми, написані на Mercury, зазвичай працюють значно швидше, ніж еквівалентні програми, написані на Prolog.[2][3] Її автори стверджують, що Mercury — найшвидша логічна мова у світі, з великим відривом.[1]

Mercury — це чисто декларативна мова, на відміну від Prolog, оскільки у ній відсутні позалогічні оператори Prolog, такі як ! (зріз) і імперативний ввід/вивід (I/O). Це дозволяє проводити розширений статичний аналіз коду і оптимізацію програм, включаючи збирання сміття під час компіляції,[4] але це може ускладнити вираження певних програмних конструкцій (наприклад, перемикання між кількома варіантами, зі значенням за замовчуванням[сумнівно — обговорити]). Хоча Mercury і допускає нечистий функціонал, він слугує переважно для виклику коду іншої мови. Весь нечистий код повинен бути явно позначений. У Mercury, операції, які зазвичай вважаються нечистими (такі як ввід/вивід) виражаються за допомогою чистих конструкцій з використанням лінійних типів пропуском фіктивного значення world через весь відповідний код.

Серед відомих програм, написаних на Mercury, можна назвати компілятор Mercury та форматор Prince XML. Компанія ODASE також використовує Mercury для розробки своєї онтологічно-орієнтованої платформи для розробки програмного забезпечення., ODASE.[5]

Back-end

Mercury має декілька back-end, які дозволяють компілювати код Mercury на декілька мов, зокрема:

Рівень виробництва

  • Низькорівневий C для GNU Compiler Collection (GCC), оригінального back-end Mercury
  • Високорівневий C
  • Java
  • C#

Минуле

Mercury також має іншомовний інтерфейс, що дозволяє пов'язувати код іншими мовами (залежить від обраного back-end) з кодом Mercury. Можливі наступні мови:

Back-end Іноземна мова(и)
C (обидва рівні) C
Java Java
Erlang Erlang
IL Common Intermediate Language (CIL) або C#

З іншими мовами можна взаємодіяти, викликаючи їх з цих мов. Однак це означає, що іншомовний код, можливо, доведеться писати кілька разів для різних backend, інакше переносимість між backend'ами буде втрачена.

Найчастіше використовується оригінальний back-end на низькорівневому C.

Приклади

Привіт, світе!:

:- module hello.
 :- interface.
 :- import_module io.
 :- pred main(io::di, io::uo) is det.

 :- implementation.
 main(!IO) :-
 	io.write_string("Привіт, світе!\n", !IO).

Обчислення 10-го числа Фібоначчі (найлегшим способом):[6]

:- 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).
        % Натомість можна використовувати 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 року.

Часто також існує періодичний знімок системи розробки release of the day (ROTD)

Підтримка IDE та редакторів

  • Розробники надають підтримку для Vim
  • Бібліотека Flycheck для Emacs
  • Доступний плагін для Eclipse IDE
  • Доступний плагін для NetBeans IDE

Див. також

  • Curry, інша функціонально-логічна мова
  • Alice, діалектна мова Standard ML
  • Logtalk, об'єктноорієнтоване розширення мови Prolog, яке компілюється до мови Prolog
  • Oz/Mozart, мультипарадигмальна мова
  • Visual Prolog, мова, сильно типізоване об'єктноорієнтоване розширення Prolog з новим синтаксисом

Примітки

  1. а б в The Mercury Project — Motivation
  2. The Mercury Project — Benchmarks
  3. Шомодьї, Золтан; Гендерсон, Фергус; Конвей, Томас (Жовтень–Грудень 1996). Алгоритм виконання Mercury: ефективна мова програмування з чисто декларативною логікою. Journal of Logic Programming. Mercurylang.org. 29 (1–3): 17—64. CiteSeerX 10.1.1.46.9861. doi:10.1016/S0743-1066(96)00068-4. Процитовано 30 серпня 2008.
  4. Мазур, Ненсі (Травень 2004). Compile-time garbage collection for the declarative language Mercury (PDF) (Дипломна робота). Katholieke Universiteit Leuven.
  5. ODASE
  6. Адаптовано з Ralph Becket's Mercury tutorial

Посилання

  • Офіційний сайт
  • п
  • о
  • р
Рівень
Низькорівневі
Високорівневі
Загального
призначення
Серверні
Запитів до баз
даних[суперечливо 1]
Розмітки та векторної
графіки[суперечливо 1]
Синхронні[en]
  • Lustre
Символьних та
чисельних обчислень
Квантових обчислень
Логічні
  • Mercury
  • Prolog
Академічні
Езотеричні
  1. а б Немає загальноприйнятого рішення, чи вважати усі ці мови саме мовами програмування