我开始学习Standard ML,现在尝试使用New Jersey编译器的Standard ML。

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

例如,在C语言中,
$ gcc hello_world.c -o helloworld
然后运行helloworld二进制文件。

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

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

最佳答案

MosMLMLton都可以创建独立的二进制文件。 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/

10-12 16:49