我开始学习Standard ML,现在尝试使用New Jersey编译器的Standard ML。
现在可以使用交互式循环,但是如何将源文件编译为独立可执行文件?
例如,在C语言中,$ gcc hello_world.c -o helloworld
然后运行helloworld二进制文件。
我阅读了SML NJ Compilation Manager的文档,但没有任何清晰的示例。
另外,是否有另一个SML编译器(允许独立的二进制创建)可用?
最佳答案
MosML和MLton都可以创建独立的二进制文件。 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
请注意,这只是一个文件,当您有多个文件时,要么需要使用MLtons项目文件即MLB(ML基础文件),要么可以使用cm文件,然后通过
mlton projectr.mlb
对其进行编译关于sml - SML-NJ,如何编译独立可执行文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5053149/