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

Compiler construction 在ocaml源代码中,`/boot/ocamlc`文件来自哪里?,compiler-construction,ocaml,Compiler Construction,Ocaml,从源代码编译Ocaml时,它使用/boot/ocamlc编译.ml文件 所以ocaml使用ocamlc本身来构建自己。第一个ocamlc文件来自哪里?如果没有/boot/ocamlc,如何编译第一个ocamlc二进制文件?OCaml历史悠久,并不总是OCaml。它曾经是CAML,甚至可能更早,它是另一种东西。无论如何,如果你把所有这些语言都称为OCaml的早期形式,故事大概是这样的。(注意:我当时不在场,但有一次我确实或多或少地以这种方式构建了一个编译器。) 很久以前,一些古人用OCaml以外的

从源代码编译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编译器的机器上构建和运行VM,并在其上运行字节码OCaml编译器。因此,您可以在任何带有C编译器的系统上使用OCaml实现

事实上,这个用C编码的虚拟机是存在的,叫做ocamlrun

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

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

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


通常很难返回并找到原始的引导编译器(用其他语言编写,可能是为今天的OCaml的一小部分编写的)。但也许它就在某处……

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运行字节码


通常很难返回并找到原始的引导编译器(用其他语言编写,可能是为今天的OCaml的一小部分编写的)。但也许它就在某个地方……

你应该给它命名为“古代”,这都是Xavier Leroy的作品,它始于commit。对不起,我想给它起个神话效果。Xavier Leroy出奇出色的作品没有被轻视的意思。你应该给“古代”起个名字,这都是Xavier Leroy的作品,它开始于commit。对不起,我想要的是神话效果。Xavier Leroy令人惊讶的出色作品没有受到轻视。