C # 编译器是用哪种语言编写的?

我在 http://referencesource.microsoft.com/中查看了源代码,似乎所有的源代码都是 C # 。

我还查看了新的 C # 编译器平台(Roslyn)的源代码,它也是用 C # 编写的。这怎么可能?C # 语言编译器是用 C # 编写的吗?还是我漏掉了什么显而易见的东西?如果 C # 编译器是用 C # 编写的,那么它是如何工作的?

23385 次浏览

最初的 C # 编译器不是用 C # 编写的,而是用 C 和 C + + 编写的。新的 Roslyn 编译器是用 C # 编写的,但最初是用旧的编译器编译的。一旦新的编译器完成,它就能够编译自己的源代码: 这就是所谓的 自力更生

编译器是实用程序——它们将编程语言文本转换为机器代码。如果编程语言描述的软件恰好是一个编译器... ..。

编译器还可以为其他体系结构生成机器代码。例如,苹果使用基于英特尔的服务器机架编译 iOS。编译器不必运行它生成的 ARM 代码,只需将其写入磁盘即可。

编译器2.0必须用编译器1.0能够处理的语言编写,但是它当然可以创建具有优化等新特性的编译器2.0。然后,您可以使用编译器2.0重新编译源代码,并制作一个更好的版本。同样,编译器不知道它正在创建自己的另一个版本。

如果我们回到足够久远的过去,那么我们确实到达了一个没有编译器的地步——高级语言的第一次迭代。然后我们必须拿出铅笔和操作码书,用汇编语言写出第一本。我们是如何编写第一个汇编程序的?直接输入机器代码,可能在穿孔纸带,或翻转前面板上的开关。

编译器就像其他程序一样是一个程序。它没有什么神奇或特别之处。它接受一些输入并产生一些输出。在这种特殊情况下,输入恰好是 C # ,输出恰好是 CIL,但这与输入是一系列报税表,输出是一份报告没有什么不同。

您可以使用任何可用的语言编写一种语言,并为其创建一个新的编译器。现在这个程序我们可以称之为 C # Compiler V1.0,它能够读取和编译任何带有当前保留字集的 C # 代码。现在,你可能会说,我想介绍一个以前不存在的新特性,比如 哪里语句。好的,您使用 C # Compiler V 1.0,它显然没有 哪里语句,并将代码编译成新版本的 C # Compiler V 2.0。

您可能会问: 但是等等,C # Compiler V1.0中没有 哪里语句。现在,一个编译器是如此的野兽,以至于它可以完成一项非常特定的工作,而对于这项工作,你不需要超过 C # 所能提供的20% 。当然,考虑像 投降这样的新特性有时是很棘手的,但是除非用更简单的术语表示 投降,否则无论使用什么编译语言,您都无法轻松地实现它。

一旦你的 C # Compiler V 2.0被创建,即使你不需要 哪里语句,甚至在 C # Compiler V 2.0的代码中也不会使用它,你仍然可以用你的新编译器重新编译它,这个 C # Compiler V 2.0是从 C # Compiler V 2.0的代码中产生的 C # Compiler V 2.0是你的新 C # Compiler V 2.0编译器。

在你这样做之前,因为你的新编译器可以理解新的语法,你有权调整编译器代码本身,并添加任何可以编译到它,如果你认为它会改善任何东西。但是,新语法改进编译器本身的可能性很小。