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

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

现在我可以使用交互式循环,但我怎样才能将源文件编译为独立的可执行文件?

例如,在C中,可以只写

$ gcc hello_world.c -o helloworld

然后运行helloworld二进制。

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

另外,还有另一个SML编译器(允许独立的二进制创build)可用吗?

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

请注意,MLton没有交互循环,但是是一个整体程序优化编译器。 基本上意味着编译需要花费相当长的一段时间,反过来又会产生令人难以置信的快速 SML程序。

对于SML / NJ,您可以使用CM.mk_standalone函数,但在CM用户手册第45页中不build议这样做,而是build议您使用ml-build命令。 这将生成一个SML / NJ堆图像。 必须使用@SMLload参数运行堆映像,或者可以使用heap2exec程序,并授予您拥有支持的系统。 如果你不这样做,我会build议你使用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映像,您可以使用: ml-build test.cm Test.main test-image ,然后通过sml @SMLload test-image.XXXXX arg1 arg2 "this is one argument"运行它sml @SMLload test-image.XXXXX arg1 arg2 "this is one argument"其中XXXXX是您的体系结构。

如果你在某个时候决定MLton,那么你不需要有任何主要的function。 它在顶层评估所有的东西,所以你可以创build一个主函数,并通过这样的东西来调用它:

 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项目文件MLB(MLBisis文件),或者你可以使用cm文件,然后用mlton projectr.mlb编译它