Подтвердить что ты не робот

SML-NJ, как скомпилировать автономный исполняемый файл

Я начинаю изучать стандартный ML, и теперь я пытаюсь использовать стандартный ML компилятора New Jersey.

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

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

$ gcc hello_world.c -o helloworld

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

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

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

4b9b3361

Ответ 1

Оба MosML и MLton также имеют возможность создавать автономные двоичные файлы. MosML через команду mosmlc и MLton через команду mlton.

Обратите внимание, что MLton не имеет интерактивного цикла, но является компилятором оптимизации всей программы. Что в основном означает, что для компиляции требуется довольно много времени, но в свою очередь генерирует невероятно быстро SML-программы.

Для SML/NJ вы можете использовать функцию CM.mk_standalone, но это не рекомендуется в Руководстве пользователя CM на стр. 45. Вместо этого они рекомендуют использовать команду 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