50

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

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

例如,在 C 中,可以只写

$ gcc hello_world.c -o helloworld

然后运行 ​​helloworld 二进制文件。

我阅读了 SML NJ Compilation Manager 的文档,但没有任何明确的示例。

另外,是否有另一个 SML 编译器(允许独立创建二进制文件)可用?

4

1 回答 1

46

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

请注意,MLton 没有交互式循环,而是一个全程序优化编译器。这基本上意味着编译需要相当长的时间,但反过来它会生成非常快的SML 程序。

对于 SML/NJ,您可以使用该CM.mk_standalone功能,但 CM 用户手册第 45 页不建议这样做。相反,他们建议您使用 ml-build 命令。这将生成一个 SML/NJ 堆映像。堆映像必须使用 @SMLload 参数运行,或者您可以使用heap2exec程序,前提是您拥有受支持的系统。如果您不这样做,那么我建议您改用 MLton。

以下可用于生成有效的 SML/NJ 堆映像:

测试厘米:

Group is 
        test.sml

        $/basis.cm

测试.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,那么您不需要任何主要功能。它评估顶层的所有内容,因此您可以创建一个主函数并通过以下方式调用它:

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

于 2011-02-22T01:25:20.880 回答