Меркурий 115ф программирование базы товаров

Mercury-это чистый логический язык программирования, предназначенный для создания больших. Быстрых и надежных программ. Синтаксис Меркурия основан на синтаксисе пролога. Но семантически эти два языка очень различны из-за чистоты Меркурия. Его типа. Режима. Детерминизма и модульных систем.

  • Меркурий чисто декларативен: предикаты и функции в Меркурии не имеют нелогичных побочных эффектов.

    Mercury выполняет ввод/вывод через встроенные и библиотечные предикаты. Которые принимают старое состояние мира и некоторые другие параметры и возвращают новое состояние мира и, возможно. Некоторые другие результаты.

    Язык требует. Чтобы входной аргумент, представляющий старое состояние мира. Был последней ссылкой на старое состояние мира. Что позволяет деструктивно обновлять состояние мира. Язык также требует. Чтобы ввод-вывод выполнялся только в тех частях программы, где обратное отслеживание не требуется.

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

  • Меркурий — это строго типизированный язык.

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

    
    

    Они также должны объявить сигнатуры типов предикатов. Которые они определяют, например

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

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

  • Меркурий-сильно модифицированный язык.

    Программист должен объявить состояние экземпляра аргументов предикатов в момент вызова предиката и в момент успешного выполнения предиката. В настоящее время реализовано только подмножество предполагаемой системы режимов. Это подмножество фактически требует. Чтобы аргументы были либо полностью входными (заземленными в момент вызова и в момент успеха). Либо полностью выходными (свободными в момент вызова и заземленными в момент успеха).

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

     :- режим добавления(in. In. :- режим добавления(out, out, in). 

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

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

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

  • Меркурий обладает сильной системой детерминизма.

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

     :- режим добавления(in. In - det. :- режим добавления(out, out, in) является мульти. :- pred factorial(int::in. Int::out) - это det. 

    Компилятор попытается доказать заявление программиста о детерминизме, используя простой, предсказуемый набор правил. Который кажется достаточным на практике (проблема в целом неразрешима).

    Если он не может этого сделать. Он отвергает программу.

    Как и в случае с типами и режимами. Проверка детерминизма улавливает множество программных ошибок во время компиляции. Это особенно полезно. Если некоторые детерминированные предикаты (det) имеют предложение для каждого символа функции в типе одного из своих входных аргументов. И этот тип изменяется; вы получите ошибки детерминизма для всех этих предикатов. Говорящие вам ввести код для покрытия случая. Когда входной аргумент привязан к недавно добавленному символу функции.

  • Меркурий имеет модульную систему.

    Программы состоят из одного или нескольких модулей. Каждый модуль имеет раздел интерфейса, содержащий объявления типов, функций и предикатов, экспортируемых из модуля. И раздел реализации. Содержащий определения экспортируемых сущностей. А также определения типов и предикатов. Локальных для модуля. Тип, имя которого экспортируется. Но определение которого не является. Может управляться только предикатами в определяющем модуле; именно так Mercury реализует абстрактные типы данных. Для предикатов и функций, которые не экспортируются, Mercury поддерживает автоматический вывод типа. Режима и детерминизма.

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

  • Ртуть очень эффективна

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

  • Компилятор Mercury написан на самом Mercury. Он был загружен с помощью NU-Prolog и SICStus Prolog. Это было возможно потому. Что после удаления деклараций программы Mercury синтаксис оставшейся части программы в основном совместим с синтаксисом Prolog.

    Компилятор Mercury компилирует программы Mercury на языке Си. Который он использует в качестве портативного ассемблера. Система может использовать некоторые расширения GNU C для языка C. Если они доступны: возможность объявлять глобальные регистровые переменные. Возможность принимать адреса меток и возможность использовать встроенный ассемблер. Используя эти расширения, он генерирует код, который значительно лучше. Чем все предыдущие известные нам системы пролога. Однако система не нуждается в этих расширениях и будет работать в их отсутствие.