Описание тега mercury

Mercury - это чисто декларативный логический / функциональный язык. Он имеет сильную, статическую, полиморфную систему типов, а также системы сильных мод и детерминизма. Система типов аналогична системе типов Haskell, а синтаксис является производным от Prolog.

Проект Меркурий

Mercury - это чисто декларативный язык логического / функционального программирования. Это язык очень высокого уровня, который позволяет программистам сосредоточиться на проблеме, а не на деталях низкого уровня, таких как управление памятью. В отличие от других языков высокого уровня, Mercury разработан для создания больших, надежных и эффективных программных систем командами программистов. Как следствие, программирование в Ртуть имеет различное чувство, чем программирование в большинстве других языков высокого уровня.

Основные особенности

У Mercury есть несколько ключевых функций, которые придают ему уникальный, хотя и знакомый (программистам Prolog) вид. Для получения дополнительной информации обратитесь к вводной документации.

Чисто декларативный

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

Строго типизированный

Система типов Mercury основана на многосортной логике с параметрическим полиморфизмом, очень похожей на системы типов современных функциональных языков, таких как ML и Haskell. Программисты должны объявлять типы, которые им нужны, используя такие объявления, как

:- type list(T)
    --->    [] 
    ;       [T | list(T)].  

:- type maybe(T)
    --->    yes(T)
    ;       no.

Программисты должны объявить сигнатуры типов определяемых ими предикатов, например

:- pred append(list(T), list(T), list(T)).

Компилятор определяет типы всех переменных, для которых нет объявления в программе. Об ошибках типа сообщается во время компиляции.

Сильно модифицируется

Программист должен объявить режим каждого параметра предиката. Режим параметра описывает изменение состояния экземпляра переменной, которая передается в качестве аргумента предикату. У предиката может быть более одного режима. Например, добавление обычно используется как минимум в этих двух режимах:

:- mode append(in, in, out).
:- mode append(out, out, in).

inрежимы вводятся в предикат. Переменная, переданная какin аргумент обоснован до и после звонка. out режимы выводятся из предиката, переменная передается как out аргумент свободен до вызова, но заземлен после вызова.

Если предикат имеет только один режим, информация о режиме может быть указана в объявлении предиката.

:- pred factorial(int::in, int::out).

Сильный детерминизм

Для каждого режима каждого предиката программист должен объявить, будет ли предикат успешным: ровно один раз (det), не более одного раза (semidet), хотя бы один раз (multi) или произвольное количество раз (nondet). Эти объявления прикрепляются к объявлениям режима следующим образом:

:- mode append(in, in, out) is det.
:- mode append(out, out, in) is multi.

:- pred factorial(int::in, int::out) is det.

Модульная система

Программы состоят из одного или нескольких модулей. У каждого модуля есть раздел интерфейса, который содержит объявления для типов, функций и предикатов, экспортируемых из модуля, и раздел реализации, содержащий определения экспортируемых сущностей, а также определения типов и предикатов, которые являются локальными для модуля.

Программирование высшего порядка

Mercury позволяет программировать с замыканиями, каррированием и лямбда-выражениями.

Сильная проверка ошибок

Системы типов, режимов и детерминизма требуют, чтобы программист делал утверждения о своих программах. Эти утверждения проверяются компилятором, это может сделать невозможными различные распространенные ошибки программирования. Например, чистая программа Mercury (программа, содержащая только код Mercury) никогда не может разыменовать указатель NULL.

Очень эффективный

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

Несколько бэкэндов

Mercury может компилироваться в C высокого уровня и C низкого уровня (эффективно используя C как переносимый ассемблер). Он также может компилироваться в Java, C# и Erlang, обеспечивая полные возможности FFI для всех поддерживаемых целей.

Сообщество

Домашняя страница Меркьюри, "Проект Меркурий", является центром сообщества. Оттуда вы можете найти документацию, получить доступ к спискам рассылки) (а также их архивам) и получить доступ к системе отслеживания ошибок. Также есть канал IRC, хотя он может немного замедлить время отклика. (Сообщество Mercury невелико, но оно дружелюбно и полезно, когда соединяется.)