Для использования с классом я буду преподавать, я ищу быстрый интерпретатор компилятора или байт-кода для Стандарта ML. Я ищу быстрое время компиляции; любое разумное время выполнения сделает. Премия, если модель компиляции является простой и четкой. Студенты в классе будут также использовать MLton для генерации хороших двоичных файлов, но MLton не спешит компилировать и существуют времена, когда студентам нужно что-то, с чем они могут взаимодействовать.
Вот то, что я уже знаю:
Стандартный ML Нью-Джерси имеет интерактивный read-eval-print-loop, но его правила компиляции являются немного странными, и это немного медленно. Однако, это может быть ведущий соперник.
Московский ML раньше был идеален, но он все еще не был осовременен со Стандартной Базисной Библиотекой 2004 года. Самый неудачный, потому что в дополнение к его многим другим прекрасным свойствам, Москва ML также имеет интерактивную систему справочной информации — но я не могу причинить своим студентам компилятор, библиотеки которого делают что-то другое от того, что говорит вся онлайн-документация.
Poly/ML мог бы хорошо отвечать всем требованиям, за исключением того, что, смотря на документацию онлайн, я не могу выяснить, как заставить это компилировать. Это могло бы быть в порядке.
В данный момент выглядит, как будто или SML/NJ или Poly/ML были бы лучшим компромиссом. Это были много лет, с тех пор как я сделал любую серьезную работу в Стандарте ML, и я буду приветствовать информацию о других компиляторах или какая из этих альтернатив является, по вашему опыту, самой быстрой для взаимодействия и самое легкое, чтобы учиться использовать.
Poly / ML кажется немного быстрее, чем SML / NJ. Например, компилируя HaMLet (примерно 25850 строк SML с комментариями) с помощью Poly / ML, SML / NJ и MLton, я получаю следующее:
[mtf@fenrir hamlet-1.3.1.polyml]$ /usr/bin/time make with-poly
...
2.92 real 2.31 user 0.55 sys
[mtf@fenrir hamlet-1.3.1.smlnj]$ /usr/bin/time make with-smlnj
...
11.98 real 11.08 user 0.78 sys
[mtf@fenrir hamlet-1.3.1.mlton]$ /usr/bin/time make with-mlton
...
24.51 real 21.04 user 3.05 sys
Разница между Poly / ML и SML / NJ не столь ярко выражен при компиляции MLton (примерно 175 779 строк SML с комментариями):
[mtf@fenrir mlton.polyml]$ /usr/bin/time make polyml-mlton
...
117.67 real 112.12 user 4.87 sys
[mtf@fenrir mlton.smlnj]$ /usr/bin/time make smlnj-mlton
...
123.31 real 116.24 user 6.38 sys
[mtf@fenrir mlton.mlton]$ /usr/bin/time make mlton-compile
...
238.44 real 232.01 user 5.49 sys
Поскольку REPL, Poly / ML и SML / NJ почти эквивалентны. Я считаю, что сообщения об ошибках от SML / NJ немного лучше; они, как правило, имеют более конкретные местоположения источников. Конечно, при использовании в качестве REPL исходные местоположения SML / NJ находятся в терминах stdIn
, для которых номера строк не очень полезны.
Если ваши ученики когда-либо собираются использовать REPL или компилировать однофайловые программы, то я могу предположить, что либо Poly / ML, либо SML / NJ будут служить вашим целям. Оба предоставляют функцию использования в SML . Многофайловые программы, вероятно, лучше всего обслуживаются диспетчером компиляции SML / NJ или базисной системой ML от MLton; Poly / ML предоставляет еще одну систему компиляции (
PolyML.make
), но я никогда ее не использовал.
Какие трудности у вас возникают при компиляции Poly / ML? Начиная с версии 5.0, Poly / ML поддерживает простую ./ configure; делать ; make install
build. Использование Poly / ML 5.X для компиляции автономного исполняемого файла требует использования PolyML.export
и вызова компилятора C, но это довольно хорошо описано в примечаниях к выпуску версии 5.0.
Существует LLVM-порт Moscow ML. Я пока не знаю, пригоден ли он для всех целей, но в отношении скорости он должен быть лучше, чем старый camlrunm.
Возможно, вам стоит потратить время на перенос функции, которая, по вашему мнению, отличается от кода в документации. Я уверен, что московские сопровождающие ML оценят это.
Я не нашел разницы в документации, которая поставляется с Moscow ML и реальной реализацией, но я не делал больших проектов на Standard ML. Я думаю, было бы полезно, если бы вы привели пример, где документация по Moscow ML отличается от реализации. Это также могло бы меня заинтересовать.