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

52

我开始学习标准ML,并尝试使用New Jersey标准ML编译器。

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

例如在C中,我们可以这样写:

$ gcc hello_world.c -o helloworld

然后运行helloworld二进制文件。

我查阅了SML NJ Compilation Manager文档,但它没有任何清晰的示例。

此外,是否有其他标准ML编译器(可以创建独立的二进制文件)可用?

1个回答

47

无论是MosML还是MLton都可以创建独立的二进制文件。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

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基础文件),它是MLton的项目文件,或者你可以使用cm文件,然后通过mlton projectr.mlb进行编译。

13
谢谢,这非常有帮助。不幸的是,我找到的所有“入门”手册都没有简单的编译示例,而是假设使用顶层循环。 - S.J.
1
抱歉,在Windows上构建失败,错误为:找不到XYZ_XXX_BOOTLIST - xiang
今天它不再工作了:XYZ_XXX_smlfile.sml:1.38-1.84 错误:运算符和操作数不一致 [类型不匹配] 运算符域:string * (string * string list -> OS.Process.status) 操作数: string * (string * string list -> int) - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接