首页 文章

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

提问于
浏览
40

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

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

例如,在C中,人们可以写

$ gcc hello_world.c -o helloworld

然后运行helloworld二进制文件 .

我阅读了SML NJ编译管理器的文档,但它没有任何明确的例子 .

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

1 回答

  • 35

    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
    

    请注意,这只是一个文件,当您有多个文件时,您需要使用MLB(ML Basis文件),这是MLtons项目文件,或者您可以使用cm文件,然后通过 mlton projectr.mlb 进行编译

相关问题