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

Другие вопросы по тегам