SML-NJ,如何编译独立的可执行文件

时间:2011-02-19 19:55:04

标签: sml smlnj

我开始学习标准ML,现在我尝试使用新泽西标准ML编译器。

现在我可以使用交互式循环,但是如何将源文件编译为独立的可执行文件?

例如,在C中,可以写

$ gcc hello_world.c -o helloworld

然后运行helloworld二进制文件。

我阅读了SML NJ编译管理器的文档,但它没有任何明确的例子。

另外,是否有其他SML编译器(允许独立二进制创建)?

1 个答案:

答案 0 :(得分:38)

MosMLMLton都可以创建独立的二进制文件。 MosML通过mosmlc命令和MLton通过mlton命令。

请注意,MLton没有交互式循环,但它是一个完整程序优化编译器。这基本上意味着编译需要相当长的时间,但反过来它会生成incredibly fast个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,那么你不需要任何主要功能。它会评估顶层的所有内容,因此您可以创建一个main函数并通过以下方式调用它:

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 <编译它/ p>