从源代码编译Ocaml时,它使用/boot/ocamlc
编译.ml
文件。
所以ocaml使用ocamlc本身来构建自己。第一个ocamlc
文件来自哪里?如何在没有ocamlc
的情况下编译第一个/boot/ocamlc
二进制文件?
答案 0 :(得分:4)
很久以前,一些古人用OCaml以外的语言编写了第一个OCaml编译器。它将OCaml编译为虚拟机的字节码。然后,这些古人在OCaml中重写了编译器,并使用第一个OCaml编译器编译第二个(用OCaml编写)。这给了他们一个OCaml编译器的字节码表示。这基本上就是boot / ocamlc中的内容。
如果使用OCaml以外的语言编写虚拟机实现(比方说C),则可以在任何具有C编译器的计算机上构建和运行VM,并在其上运行字节码OCaml编译器。因此,您可以在任何具有C编译器的系统上使用OCaml实现。
实际上,这个用C编码的虚拟机存在并被称为ocamlrun。
如果您过早不小心使用新功能,可以修改第二个OCaml编译器(在OCaml中编码)并添加新功能。您只需使用之前的OCaml编译器重新编译它,然后再使用它自己重新编译它(以利用任何改进)。完成这两个编译后,您可以开始使用新功能来实现编译器本身。
由于您可以稍后以这种方式扩展和改进编译器,因此通常首先使用编译器来获取最终目标语言的一小部分。这样你就不必用原始语言做太多的工作。在你得到一个用OCaml编码的工作编译器之后,你将抛弃原始编译器,所以没有必要让它变得比必要的更复杂。
如果您不想使用boot / ocamlc,似乎您必须从头开始用您可用的其他语言编写自己的OCaml到字节码编译器。您仍然可以使用ocamlrun运行字节码。
通常很难回头找到原始的bootstrap编译器(用其他语言编写,可能是今天OCaml的一小部分)。但也许它出现在某个地方......