在ocaml源中,`/ boot / ocamlc`文件来自哪里?

时间:2017-03-10 07:34:21

标签: compiler-construction ocaml

从源代码编译Ocaml时,它使用/boot/ocamlc编译.ml文件。

所以ocaml使用ocamlc本身来构建自己。第一个ocamlc文件来自哪里?如何在没有ocamlc的情况下编译第一个/boot/ocamlc二进制文件?

1 个答案:

答案 0 :(得分:4)

OCaml历史悠久,并不总是OCaml。它曾经是CAML,可能更早,它是其他东西。无论如何,如果你只是将所有这些语言称为OCaml的早期形式,那么这个故事大概就是这样的。 (注意:我不在那里,但我曾经或多或少地用这种方式构建了一个编译器。)

很久以前,一些古人用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的一小部分)。但也许它出现在某个地方......