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

How to compile and execute a stand-alone SML-NJ executable

我看到了另一个答案link,但我不明白basis.cm是什么,它有什么用?

你问了两个问题。

What is basis.cm and what's it's use?

这是Basis library。它允许使用内置函数。

How to compile and execute a stand-alone SML-NJ executable

假设您遵循了 Jesper Reenberg 关于如何执行堆映像的教程,为了让 SML/NJ 生成独立的可执行文件,您需要做的下一件事是转换此堆映像。假设应该能够使用 heap2exec 来执行此操作,这是一种获取堆映像的工具,例如在我的系统上生成的 .x86-linux 文件,并生成一个可以组装和 linked.

的 .asm 文件

不幸的是,这个工具不是很好维护,所以你必须

  1. 转到 the smlnj.org page and fix the download-link by removing 'www.' (this page and the SourceForge page 不包含关于参数计数的相同解释或假设,并且页面的下载 link 都不起作用)。
  2. 下载并解压缩此工具,并修复 'build' 脚本,使其指向您的 ml-build 工具
  3. 通过将 [inf, outf] 更改为 [_, inf, outf]
  4. 来修复工具的参数使用
  5. 运行 ./build 在我的系统上生成 'heap2asm.x86-linux'
  6. 例如,为了为heap2asm程序本身生成.asm文件,运行

    sml @SMLload heap2asm.x86-linux heap2asm.x86-linux heap2asm.s
    
  7. 此时,很遗憾,我无法生成可以运行的可执行文件。例如。如果您 运行 gcc -c heap2asm.sld heap2asm.o,您会收到缺少 _start 标签的警告。即使您将现有的 _sml_heap_image 标签重命名为 _start,生成的可执行文件也会出现段错误。也就是这里好像少了一段运行time环境正常下发的入口代码

  8. 此时,丢弃 SML/NJ 并使用 MLton 生成独立二进制文件。