ML
ML (Meta Language) — семейство строгих языков функционального программирования с развитой полиморфной системой типов и параметризуемыми модулями. ML преподаётся во многих западных университетах (в некоторых даже как первый язык программирования).
Сильно типизированный язык со статическим контролем типов и аппликативным выполнением программ. Отличие его от других языков заключается в том, что программист не должен объявлять типы данных — для этого существует специальный механизм вывода типа данных результирующих выражений. Этот механизм вывода типов делает возможным перегрузку и сопоставление с образцом на основе унификации, почти как в языке Prolog, однако без необходимости (постоянного) контроля типов выражений. Более привычные компоненты ML — сборка мусора, встроенные средства поддержки исключений, модульность.
Основные достоинства ML — высокая верифицируемость программ, простота отладки, потенциал для крайне высокой оптимизации, уникальная краткость записи.
Основные недостатки — сложность синтаксиса, непривычность принятых соглашений и ограничений, практическая невозможность макротрансформаций.
Как и в языке LISP, программа на ML состоит из определений нескольких функций. Каждая функция имеет статически определенные типы аргументов и возвращаемого значения. Поскольку ML является аппликативным языком, то хранение переменных в нем осуществляется иначе, чем в языках С или FORTRAN. Изменение значений переменных запрещено («однократные присвоения»). Внутреннее содержимое структурных объектов, списков и строк не может быть изменено в принципе, либо требует предварительного объявления мутируемых полей (в [o]caml). Это упрощает оптимизацию, отладку и сборку мусора, основанную на поколениях (generational garbage collection). Для имитации присвоений программист может применять объект ref — контейнер с одним модифицируемым полем. Функциональное выполнение программы на ML подразумевает, что параметры функций передаются по значению, составляющие сложных объектов (размещенные в куче) при этом не копируются, являясь разделяемыми.
Комментарии в ML обозначаются следующим образом: (* … *). ML позволяет создавать записи и абстрактные типы данных, а также создавать и обрабатывать исключения. Возможности ввода-вывода в ML не очень велики, что обусловлено областью его применения — большинству исследователей не требуется обрабатывать многочисленные базы данных с использованием сложных форматов. Синтаксис этого языка необычайно запутан, превосходя сложностью даже синтаксис C++.
Имеет диалекты: Standard ML, CaML Light и Objective CaML (последний является в том числе объектно-ориентированным языком программирования).
ИсторияПравить
Язык ML (MetaLanguage) является аппликативным языком, программы на этом языке пишутся примерно так же, как на языке С или Pascal. Однако это аппликативный язык с улучшенной концепцией типов данных. ML поддерживает полиморфизм и, с помощью своей системы типов, абстракции данных. Основные структуры этого языка относительно компактны, особенно в сравнении с таким языком, как Ada. Но его возможность расширять типы данных обеспечивает ему большую мощь в случае написания сложных программ. ML включает создание и обработку исключительных ситуации (исключений), императивное и функциональное программирование, основанные на правилах спецификации, и большую часть концепций, представленных в других языках программирования. Если бы потребовалось выбрать один-единственный язык для изучения многих концепций языков программирования, то ML оказался бы наиболее подходящим кандидатом, пока не встал бы вопрос о коммерческой живучести. Роберт Милнер ML завоевал большую популярность в исследовательских кругах и в области компьютерного образования. Доступность механизма определения типов данных на уровне исходной программы — то свойство ML, которое выгодно отличает его от других распространенных языков программирования. Однако коммерческих приложений, написанных на языке ML, практически нет; до сих пор он остается всего лишь инструментом при проведении теоретических исследований в области информатики и широко используется в образовании.
ML был разработан группой программистов во главе с Робертом Милнером. Этот язык был задуман как механизм для построения (при помощи компьютера) формальных доказательств в системе логики для вычислимых функций, разработанной в середине 70-х гг. в Эдинбурге (Edinburgh Logic for Computable Functions). Но оказалось, что ML также полезен и в области символьных вычислений. В 1983 г. язык был пересмотрен, дополнен такими концепциями, как модули, и стал называться «стандартный ML» (Standard ML). Хотя обычно он реализуется как интерпретируемый язык, сравнительно легко можно создать и использовать его компилируемую версию. Первые компиляторы ML появились в 1984 г.
К концу 80-х гг. Standard ML уже распространился в среде исследователей языков программирования. Одна из популярных версий ML была разработана Дэвидом Аппелем (David Appel) из Принстонского университета и Дэвидом Маккуином (David McQueen) из AT&T Bell Telephone Laboratories. Именно эта версия использовалась для проверки примеров программ на ML, которые приведены в нашей книге.