在ocaml源码中,`/boot/ocamlc`文件是从哪里来的?

In the ocaml source, where does the `/boot/ocamlc` file come from?

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

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

OCaml 历史悠久,并不总是 OCaml。它曾经是 CAML,甚至可能更早是其他东西。不管怎样,如果你把所有这些语言都称为 OCaml 的早期形式,那么故事大概是这样的。 (注意:我当时不在场,但我曾经或多或少地以这种方式构建了一个编译器。)

很久以前,一些古人用OCaml以外的语言编写了第一个OCaml编译器。它将 OCaml 编译为虚拟机的字节码。这些古人随后用 OCaml 重写了编译器,并使用第一个 OCaml 编译器编译了第二个(用 OCaml 编写)。这为他们提供了 OCaml 编译器的字节码表示。这基本上就是 boot/ocamlc.

中的内容

如果您使用 OCaml 以外的语言(例如 C 语言)编写虚拟机实现,您可以在任何带有 C 编译器的机器上构建和 运行 虚拟机,运行字节码 OCaml 编译器就可以了。所以你在任何带有 C 编译器的系统上都有一个有效的 OCaml 实现。

事实上,这个用 C 编写的虚拟机存在并称为 ocaml运行。

如果您注意不要过早使用新功能,您可以修改第二个 OCaml 编译器(用 OCaml 编码)并添加新功能。您只需使用以前的 OCaml 编译器重新编译它,然后再次使用自身重新编译它(以利用任何改进)。在这两个编译之后,您可以开始使用新功能来实现编译器本身。

由于以后可以通过这种方式扩展和改进编译器,因此通常从最终目标语言的一小部分编译器开始。这样您就不必用原始语言做那么多的工作。在你得到一个用 OCaml 编码的工作编译器后,你将扔掉原来的编译器,所以让它变得比必要的更复杂是没有意义的。

如果您不想使用 boot/ocamlc,似乎您必须使用您可用的其他语言从头开始编写您自己的 OCaml 到字节码的编译器。您仍然可以使用 ocaml运行.运行 字节码运行。

通常很难回头找到原始的 bootstrap 编译器(用其他语言编写,可能是当今 OCaml 的一个非常小的子集)。但也许它就在某处....