【问题标题】:SML-NJ, how to compile standalone executableSML-NJ,如何编译独立的可执行文件
【发布时间】:2011-02-22 09:25:20
【问题描述】:

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

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

例如,在 C 中,可以直接写

$ gcc hello_world.c -o helloworld

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

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

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

【问题讨论】:

    标签: sml smlnj


    【解决方案1】:

    MosML 和MLton 都可以创建独立的二进制文件。 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 files),即MLtons项目文件,或者您可以使用cm文件然后通过mlton projectr.mlb编译它

    【讨论】:

    • 谢谢,这很有帮助。不幸的是,我发现的所有“入门”手册都没有简单的示例可供编译,而是假设使用顶级循环。
    • 对不起,我在 Windows 上构建失败并出现错误:找不到XYZ_XXX_BOOTLIST
    猜你喜欢
    • 1970-01-01
    • 2012-07-03
    • 1970-01-01
    • 2012-01-04
    • 2011-03-18
    • 2010-12-20
    • 2012-08-01
    • 2011-05-26
    • 1970-01-01
    相关资源
    最近更新 更多