我开始学习标准ML,现在我尝试使用新泽西标准ML编译器.
现在我可以使用交互式循环,但是如何将源文件编译为独立的可执行文件?
例如,在C中,人们可以写
$ gcc hello_world.c -o helloworld
然后运行helloworld二进制文件.
我阅读了SML NJ编译管理器的文档,但它没有任何明确的例子.
另外,是否有另一个SML编译器(允许独立二进制创建)可用?
Jes*_*erg 39
无论MosML和MLton也有posibility创建独立的二进制文件.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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
要生成堆映像,您可以使用: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 ()
Run Code Online (Sandbox Code Playgroud)
然后你可以编译它mlton foo.sml,它将生成一个名为"foo"的可执行文件.当你运行它时,它会产生这样的结果:
./foo
4
this is the main function
Run Code Online (Sandbox Code Playgroud)
请注意,这只是一个文件,当您有多个文件时,您需要使用MLB(ML Basis文件),这是MLtons项目文件,或者您可以使用cm文件,然后通过 mlton projectr.mlb