OCaml 作为编译目标

OCaml as a compilation target

我正在 OCaml 中实现 ISO/IEC 13211-1:1995 兼容的 Prolog 系统。

对于代码生成(a.k.a.JIT)部分 I ...

该方法有些粗糙,但作为概念验证已经足够好了。

最近,我想到编译成 OCaml 字节码 可以 成为替代方案1.

所以我的实际问题有两个方面:

  1. 如何将 OCaml 字节码编译为本机代码?

  2. 是否有用于 emitting/handling 字节码的 OCaml 库?


1 也不错,因为这将允许使用 js_of_ocaml.

嗯,虽然从技术上讲可以将字节码编译为 C,然后再编译为本机代码,例如 project doing this,但我建议不要使用字节码作为目标。首先,字节码不太稳定而且没有文档记录。接下来,您会发现发出字节码更加困难,因为您将执行 ocamlc 编译器的工作。再次回到稳定性问题,您的项目会很快比特腐烂并且维护起来会非常痛苦,因为对字节码的每次更改都会破坏您的代码,您将不得不为不同版本支持多个分支或放弃对旧版本的支持编译器的版本。

最后,发出 ml 将使您可以选择使用字节码和本机代码,只需选择合适的编译器即可。您还可以使用 js_of_ocaml 或任何其他后端。此外,从历史上看,ML 和 OCaml 专门设计为代码生成的目标,特别是为了证明辅助的需要,例如 Coq 和 F*,他们使用 ML 而不是字节码。

Are there OCaml libraries for emitting/handling bytecode?

有一些编译器内部工具,我通常将其用作参考实现(而不是字节码的缺失文档),请参阅 tools folder, e.g., this is the bytecode disassembler