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]
Mercury має декілька back-end, які дозволяють компілювати код Mercury на декілька мов, зокрема:
- Низькорівневий C для GNU Compiler Collection (GCC), оригінального back-end Mercury
- Високорівневий C
- Java
- C#
- Мова асемблера через back-end GCC
- Aditi, дедуктивна система баз даних, також розроблена в університеті Мельбурна. Mercury-0.12.2 — це остання версія, яка підтримує Aditi.[джерело?]
- Common Intermediate Language (CIL) для .NET Framework
- Erlang
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)
- Розробники надають підтримку для Vim
- Бібліотека Flycheck для Emacs
- Доступний плагін для Eclipse IDE
- Доступний плагін для NetBeans IDE
- Curry, інша функціонально-логічна мова
- Alice, діалектна мова Standard ML
- Logtalk, об'єктноорієнтоване розширення мови Prolog, яке компілюється до мови Prolog
- Oz/Mozart, мультипарадигмальна мова
- Visual Prolog, мова, сильно типізоване об'єктноорієнтоване розширення Prolog з новим синтаксисом
- ↑ а б в The Mercury Project — Motivation
- ↑ The Mercury Project — Benchmarks
- ↑ Шомодьї, Золтан; Гендерсон, Фергус; Конвей, Томас (Жовтень–Грудень 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.
- ↑ Мазур, Ненсі (Травень 2004). Compile-time garbage collection for the declarative language Mercury (PDF) (Дипломна робота). Katholieke Universiteit Leuven.
- ↑ ODASE
- ↑ Адаптовано з Ralph Becket's Mercury tutorial