SML-NJ, как скомпилировать автономный исполняемый файл
Я начинаю изучать Standard ML, и теперь я пытаюсь использовать Standard ML компилятора Нью-Джерси.
Теперь я могу использовать интерактивный цикл, но как мне скомпилировать исходный файл в автономный исполняемый файл?
В C, например, можно просто написать
$ gcc hello_world.c -o helloworld
а затем запустите бинарный helloworld.
Я прочитал документацию по SML NJ Compilation Manager, но у него нет четких примеров.
Кроме того, есть ли другой компилятор SML (который позволяет создавать автономные двоичные файлы)?
1 ответ
И MosML, и MLton также могут создавать автономные двоичные файлы. MosML через команду mosmlc и MLton через команду mlton.
Обратите внимание, что MLton не имеет интерактивного цикла, но является оптимизатором компиляции всей программы. Что в основном означает, что компиляция занимает довольно много времени, но, в свою очередь, генерирует невероятно быстрые программы SML.
Для SML/NJ вы можете использовать CM.mk_standalone
функции, но это не рекомендуется на странице 45 Руководства пользователя CM. Вместо этого они рекомендуют использовать команду ml-build. Это создаст образ кучи SML/NJ. Образ кучи должен быть запущен с параметром @SMLload, или вы можете использовать программу heap2exec, если у вас есть поддерживаемая система. Если вы этого не сделаете, я бы посоветовал вам использовать MLton.
Следующее может быть использовано для создания правильного образа кучи SML/NJ:
test.cm:
Group is
test.sml
$/basis.cm
test.sml:
structure Test =
struct
fun main (prog_name, args) =
let
val _ = print ("Program name: " ^ prog_name ^ "\n")
val _ = print "Arguments:\n"
val _ = map (fn s => print ("\t" ^ s ^ "\n")) args
in
1
end
end
И для создания образа кучи вы можете использовать: ml-build test.cm Test.main test-image
а затем запустить его sml @SMLload test-image.XXXXX arg1 arg2 "this is one argument"
где XXXXX - это ваша архитектура.
Если в какой-то момент вы решите использовать MLton, вам не нужно иметь никаких основных функций. Он оценивает все на верхнем уровне, так что вы можете создать основную функцию и вызывать ее примерно так:
fun main () = print "this is the main function\n"
val foo = 4
val _ = print ((Int.toString 4) ^ "\n")
val _ = main ()
Тогда вы можете скомпилировать его mlton foo.sml
который произведет исполняемый файл с именем "foo". Когда вы запустите его, он выдаст это как результат:
./foo
4
this is the main function
Обратите внимание, что это только один файл, когда у вас есть несколько файлов, вам нужно либо использовать MLB (файлы ML Basis), которые являются файлами проекта MLtons, либо вы можете использовать файлы cm, а затем скомпилировать их mlton projectr.mlb