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