Mercury – это новый функционально-логический язык программирования со строгой типизацией, системой режимов аргументов и детерминизмом предикатов. Синтаксис частично унаследован от Пролога, система типов похожа на Haskell.
Не пугайтесь, на самом деле, Mercury является эволюционным продолжением логического подхода, принятого в языке Пролог, но при этом лишенным многих недостатков классического Пролога.
Исторически сложилось, что гегемоном в логическом программировании является язык Пролог с классическим, так называемым, эдинбургским синтаксисом.
Несмотря на то, что логический подход очень удобен для решения большого класса задач, особенно связанных с искусственным интеллектом, а так же позволяет гораздо легче описать решение сложных задач, широкого распространения Пролог не получил. В настоящее время логическое программирование находится в упадке. Логический подход практически не используется в обычном, коммерческом программировании. Это связано с тем, что классический Пролог является интерпретируемым безтиповым языком, что наряду с низкой производительностью дает трудности с отладкой программ.
Так же, для ограничения перебора разработчикам Пролога пришлось включать в него некоторые недекларативные возможности, например, отсечения и циклы по неуспеху. В итоге при написании оптимизированной программы утрачивается вся красота декларативного подхода, и возникают серьезные трудности с пониманием кода и отладкой. Фактически Пролог не является чисто декларативным языком, он имеет императивные особенности, то есть многие части кода зависят от порядка следования целей в предикате.
Для внедрения логического подхода в практическое программирование надо решить несколько проблем. Разработчикам уже давно стало ясно, что без внесения изменений в классический устаревший синтаксис не обойтись, иначе Пролог так и останется игрушкой для университетских преподавателей и средством создания всего лишь прототипов программ.
Во-первых, нужно было что-то делать с типизацией, поэтому все современные логические языки содержат систему типов. Во-вторых, было бы очень неплохо перейти от интерпретации к компиляции программ, и наконец, надо решить главную проблему логического подхода – низкую производительность.
Разработчики Mercury сделали свой язык чисто декларативным, полностью убрав из него все императивные возможности. Ввели развитую систему типов, режимы аргументов, категории детерминизма предикатов и условные операторы. Оказалось, что такой подход имеет право на существование и, несмотря на некоторые трудности с организацией ввода-вывода, дает высокопроизводительный код. Причем оптимизация программы в этом случае производится автоматически самим компилятором, а не программистом, избавляя его от необходимости продумывания последовательности выполнения алгоритма.
Кстати, название Mercury, данное в честь бога скорости Меркурия, отражает направленность на получение быстро работающих программ. Фактически Mercury по многим тестам в разы опережает по производительности современные реализации Пролога.
Плюс, в Mercury разработчикам удалось объединить в одной парадигме логический и функциональный подход программирования. А так же бонусом является способность компилятора находить многие логические ошибки, за счет чего код программы становится более надежным.
Компилятор Mercury открыт и бесплатен (распространяется по лицензии GPL), работает на всех современных операционных системах. Особенностью языка является то, что он способен транслировать код во многие популярные языки программирования: C, Java, Erlang, IL для платформы .NET.