software.wikisort.org - Язык_программирования

Search / Calendar

MLton (произносится «ми́ллтон»[1]) — кроссплатформенный полнопрограммно-оптимизирующий компилятор языка программирования Standard ML (SML). Как и большинство остальных реализаций Standard ML, написан на самом Standard ML (за исключением рантайм-системы, написанной на Си) и распространяется с открытыми исходными кодами под лицензией в стиле BSD.


Характеристики


Обеспечивает очень высокую производительность программ на Standard ML: на мелких программах по скорости лишь незначительно отстаёт от Си/C++[2]; на более крупных, за счёт полнопрограммной оптимизации на основе глобального анализа потока управления программы, способен превосходить их. Порождает самостоятельные исполнимые файлы компактного размера. Производительность в MLton обеспечивается даже при интенсивном использовании механизмов абстракции SML (параметрического полиморфизма, функций высшего порядка, функторов), что позволяет использовать язык как для быстрого прототипирования, так и в крупномасштабном программировании[en], не требуя от программиста искать баланс между абстракцией и эффективностью. Прирост скорости кода в сравнении с другими реализациями SML на разных тестах составляет от нескольких раз до нескольких порядков[3].

Сопровождается очень богатой документацией, в том числе описанием трюков с нетривиальным использованием языка. На сайте проекта можно найти почти полный список ссылок на существующую научную и учебную литературу по Standard ML[4]. Достаточно строго соответствует Определению языка и спецификации Базисной библиотеки. Имеется четыре отклонения от Определения, которые авторы не планируют корректировать, а наоборот, классифицируют как исправление дефектов в самом Определении.

Имеет тонкий и быстрый FFI[en], обеспечивающий полное двустороннее взаимодействие с языком Си (вплоть до взаимной рекурсии); а также генератор привязок[en] NLFFI (No-Longer-Foreign Function Interfaceрус. интерфейс к отныне-более-не-чужеродным функциям), позволяющий встраивать заголовочные файлы Си прямо в проект на SML и использовать прямые вызовы функций Си в программах на SML[5].

Поддерживает множество нативных платформ (x86, IA-64, AMD64, SPARC, ARM, PowerPC/PowerPC64, DEC Alpha, HPPA, S390) и разнообразных операционных систем, в том числе различных Unix-like-систем (Debian, Fedora, *BSD). Под Windows требует Cygwin или MinGW (по состоянию на 2014 год), родной порт входит в планы разработчиков. Имеет дополнительные бэк-энды в Си, C--, LLVM; ранее имел в своём составе бэк-энд в байт-код, но его поддержку прекратили, так как он не снискал популярности.


Реализация


Эффективность и компактность программ MLton обеспечивает за счёт:

Подход к оптимизации, применённый в MLton, разительно отличается от традиционного[2]. Обычные компиляторы языков с поддержкой сущностей высших порядков выполняют оптимизации непосредственно над AST, полученном после разбора грамматики и вывода типов, после чего осуществляют преобразование замыканий[en] и низкоуровневые оптимизации. В MLton же порядок работы упрощённо выглядит так. Сперва выполняется дефункторизация и мономорфизация, в результате чего код представляется на промежуточном языке со значительно упрощённой, по сравнению с SML, системой типов, но с поддержкой функций высшего порядка. Затем следует дефункционализация и код на промежуточном языке первого порядка, состоящем только из определений верхнего уровня (SSA). И лишь затем на полученном плоском коде применяются более традиционные оптимизации (замена хвостовой рекурсии на плоскую итерацию, распространение констант, удаление мёртвого кода, выбор представления и прочее), а также плоское представление замыканий. Такая цепочка даёт выигрыш и для пользователей компилятора, и для его разработчиков:

Всего же MLton использует восемь промежуточных языков[8], в том числе нарушающих безопасность ради производительности (в отличие, например, от компилятора TILT[9], не поступающегося безопасностью до самого машинного кода), и несколько десятков проходов.


Расширения


MLton предлагает ряд нестандартных библиотек:

и многое другое[11].

Существуют экспериментальные расширения самого MLton:


История, философия, разработчики


В апреле 1997 года Стивен Уикс (англ. Stephen Weeks) разработал дефункторизатор для SML/NJ[en], сразу показавший прирост скорости от 2 до 6 раз. В августе того же года была начата разработка оптимизирующего компилятора, который на тот момент назывался smlc. К октябрю был реализован мономорфизатор. За следующие полтора года smlc стал полностью независимым компилятором и был переименован в MLton, первый релиз которого состоялся в марте 1999 года. К 2005 году MLton показывал превосходные характеристики производительности программ[3].

С самого начала разработка велась с упором на производительность за счёт глобальной оптимизации программ.[13]

Разработчики MLton диктуют прочтение названия своего компилятора как «ми́ллтон», по аналогии со словом «мельница» (англ. mill)[1] — вероятно, шутливо подразумевая «перемалывание программ на ML», что отражает применение агрессивных методик преобразования[en] и рафинирования[en] программ.

Проектом MLton руководят четыре человека:

Немалый вклад также внесли многие другие люди[14].

В 2013 году проект MLton входил в программу Google Summer of Code[15][16].

Разработчики MLton являются активными участниками совета по successor ML. В 2014 году двое из них были удостоены премии «NSF CISE Research Infrastructure (CRI)»[17] «за позиционирование MLton для исследований языка нового поколения».


Критика и сравнение с альтернативами


MLton обеспечивает быстродействие программ на уровне Си/C++, вне зависимости от использованного стиля программирования.

Недостатки напрямую вытекают из применения глобального анализа и множества этапов преобразований:


Сравнение с OCaml


И OCaml, и MLton порождают программы высокого быстродействия[19], нередко способные соперничать с программами на Си и C++, портированы на множество платформ (хотя список не идентичен) и сопровождаются обширной документацией. Это делает актуальным вопрос об их отличиях[20]:

Также здесь следует отметить некоторые различия между компиляторами, тесно связанные с различиями между самими языками:


См. также



Примечания


  1. «MLton» Pronounce. Дата обращения: 13 ноября 2014. Архивировано 13 ноября 2014 года.
  2. Weeks - Whole-Program Compilation in MLton, 2006.
  3. MLton Performance. Дата обращения: 13 ноября 2014. Архивировано 13 ноября 2014 года.
  4. References. Дата обращения: 10 декабря 2014. Архивировано 14 декабря 2014 года.
  5. No-Longer-Foreign, 2001.
  6. Inline. Дата обращения: 21 ноября 2014. Архивировано 29 ноября 2014 года.
  7. Contify. Дата обращения: 13 ноября 2014. Архивировано 13 ноября 2014 года.
  8. MLton’s Intermediate Languages. Дата обращения: 13 ноября 2014. Архивировано 13 ноября 2014 года.
  9. TILT (TIL-Two) compiler Архивировано 9 мая 2008 года.
  10. MLRISC. Дата обращения: 18 ноября 2014. Архивировано 23 сентября 2015 года.
  11. MLton’s Extensions. Дата обращения: 13 ноября 2014. Архивировано 2 января 2015 года.
  12. Multi-MLton. Дата обращения: 13 ноября 2014. Архивировано 13 ноября 2014 года.
  13. MLton History. Дата обращения: 13 ноября 2014. Архивировано 13 ноября 2014 года.
  14. MLton Credits. Дата обращения: 13 ноября 2014. Архивировано 13 ноября 2014 года.
  15. Google Summer of Code 2013 (GSoC/GCI Archive). Дата обращения: 14 сентября 2016. Архивировано 23 июня 2016 года.
  16. MLton in Google Summer of Code 2013 (on MLton page). Дата обращения: 14 сентября 2016. Архивировано 23 сентября 2016 года.
  17. MLton compiler page.
  18. MLton Drawbacks. Дата обращения: 13 ноября 2014. Архивировано 13 ноября 2014 года.
  19. The Breakfast Post. SML and OCaml: So, why was the OCaml faster? (англ.). Дата обращения: 16 сентября 2016. Архивировано 21 сентября 2016 года.
  20. Сравнение MLton и OCaml. Дата обращения: 13 ноября 2014. Архивировано 13 ноября 2014 года.
  21. The Caml Hump: ocamldefun (недоступная ссылка). Calcul Statique des Applications de Modules Parametres. Julien Signoles. JFLA 2003. (2010). Дата обращения: 10 декабря 2014. Архивировано 4 ноября 2015 года. — Defunctorizer for OCaml
  22. Chailloux, Manoury, Pagano, "Developing with OCaml", 2007.

Ссылки





Текст в блоке "Читать" взят с сайта "Википедия" и доступен по лицензии Creative Commons Attribution-ShareAlike; в отдельных случаях могут действовать дополнительные условия.

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

2019-2025
WikiSort.org - проект по пересортировке и дополнению контента Википедии