我查看了http://referencesource.microsoft.com/的源代码,看来所有的源代码都在C#中。
我还查看了新C#编译器平台(Roslyn)的源代码,它也在C#中。怎么可能? C#语言编译器是用C#编写的吗?还是我错过了一些明显的东西?如果C#编译器是用C#编写的,那么它是如何工作的?
答案 0 :(得分:215)
原始的C#编译器不是用C#编写的,而是用C和C ++编写的。新的Roslyn编译器是用C#编写的,但最初是用旧的编译器编译的。一旦新的编译器完成,它就能够编译自己的源代码:这称为bootstrapping。
答案 1 :(得分:31)
编译器是实用程序 - 它们将编程语言文本转换为机器代码。如果编程语言描述恰好是编译器的软件......
编译器还可以为其他架构生成机器代码。例如,Apple使用基于Intel的服务器机架编译iOS。编译器不必运行它生成的ARM代码,只需将其写入磁盘即可。
编译器2.0必须用1.0可以处理的语言编写,但它肯定可以创建具有更新功能的编译器2.0,例如优化。然后,您可以使用编译器2.0重新编译源代码,并为自己制作更好的版本。同样,编译器并不知道它自己制作了另一个版本。
如果我们回到时间的迷雾中,那么我们确实达到了我们没有编译器的程度 - 高级语言的第一次迭代。然后我们必须拿出铅笔和操作码书,然后在装配中写下第一本书。我们是如何编写第一个汇编程序的?直接输入机器代码,可能是在穿孔纸带上,或者是在前面板上翻转开关。
答案 2 :(得分:14)
编译器就像任何其他程序一样。关于它没有任何神奇或特殊的东西。它需要一些输入并产生一些输出。在这种特殊情况下,输入恰好是C#,输出恰好是CIL,但这与输入是一系列纳税申报并且输出是报告没有区别。
答案 3 :(得分:0)
您可以使用任何可用的语言编写一种语言并为其创建一个新的编译器。现在我们可以将这个程序称为 C# Compiler V 1.0,它能够读取和编译任何带有当前保留字集的 C# 代码。现在,你说,我想介绍一个以前不存在的新功能,比如 where 语句。好的,您使用 C# Compiler V 1.0,它显然在任何地方都没有 where 语句,并将代码编译成新版本的 C# Compiler V 2.0。
您可能会在这里问:但是等等,C# Compiler V 1.0 中没有where 语句。现在,编译器是如此的野兽,它可以完成一项非常具体的工作,无论如何,您不需要超过 C# 所能提供的 20%。当然,考虑像 yield 这样的新功能有时会很棘手,但是除非 yield 用更简单的术语表示,否则无论如何您都无法轻松实现它编译您使用的语言。
一旦您的 C# Compiler V 2.0 被创建,即使您不需要 where 语句并且它甚至可能没有在 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 编译器。
在您这样做之前,因为您的新编译器可以理解新语法,您有权调整编译器代码本身并添加任何可以编译到其中的内容,如果您认为它会改进任何内容。但是,新语法改进编译器本身的可能性很小。