SML-NJ, как скомпилировать автономный исполняемый файл - PullRequest
44 голосов
/ 19 февраля 2011

Я начинаю изучать Standard ML, и теперь я пытаюсь использовать Standard ML компилятора Нью-Джерси.

Теперь я могу использовать интерактивный цикл, но как мне скомпилировать исходный файл в автономный исполняемый файл?

В C, например, можно просто написать

$ gcc hello_world.c -o helloworld

и затем запустите двоичный файл helloworld.

Я прочитал документацию по SML NJ Compilation Manager, но у него нет четких примеров.

Кроме того, есть ли другой компилятор SML (который позволяет создавать автономные двоичные файлы)?

1 Ответ

39 голосов
/ 22 февраля 2011

Оба 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), который является проектом MLtonsфайлы или вы можете использовать файлы cm, а затем скомпилировать их по mlton projectr.mlb

...