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

Cri*_*nSO 144 c# compiler-construction roslyn

我查看了http://referencesource.microsoft.com/上的源代码,看来所有源代码都在C#中.

我还查看了新的C#编译器平台(Roslyn)的源代码,它也在C#中.怎么可能?C#语言编译器是用C#编写的吗?还是我错过了一些明显的东西?如果C#编译器是用C#编写的,那么它是如何工作的?

Tho*_*que 221

原始的C#编译器不是用C#编写的,而是用C和C++编写的.新的Roslyn编译器是用C#编写的,但最初是用旧的编译器编译的.一旦新的编译器完成,它就能够编译自己的源代码:这称为bootstrapping.

  • 没有必要更改"原始编译器"将修改新版本 (10认同)
  • @ThomasLevesque自托管是引导捆绑的最终结果. (3认同)
  • 因此,当必须对"原始编译器"进行更改时,是否必须使用旧编译器编译*(用C,C++编写)*? (2认同)
  • @SriramSakthivel,编译器的代码不能使用new关键字,至少直到有一个编译器可以理解它们的时候才可以使用。您始终使用较旧版本的编译器来构建新版本。 (2认同)

小智 32

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

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

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

如果我们回到时间的迷雾中,那么我们确实达到了一个我们没有编译器的地步 - 高级语言的第一次迭代.然后我们必须拿出铅笔和操作码书,然后在装配中写下第一本书.我们是如何编写第一个汇编程序的?直接输入机器代码,可能是在穿孔纸带上,或在前面板上翻转开关.

  • 纸带只是通过纸张上的孔翻转开关.:-) (9认同)
  • 作为存储技术的纸带将永远不会起飞.它太复杂且容易出错,而且如果读卡器出现短路,它会很容易烧坏,这会完全破坏你的程序. (2认同)

Jör*_*tag 15

编译器就像任何其他程序一样.关于它没有任何神奇或特殊的东西.它需要一些输入并产生一些输出.在这种特殊情况下,输入恰好是C#,输出恰好是CIL,但这与输入是一系列纳税申报并且输出是报告没有区别.

  • 它是不同的 - 它更容易, - ). (10认同)
  • @PeterSchneider:人们喜欢将编译器作为神话般的魔法生物,但最后,它们只是将输入转换为输出的程序.几乎这个星球上的每个程序都会解析一些输入,尝试理解它,然后把它变成一些输出.从某种意义上说,每个输入都是用某种语言编写的程序,每个程序都是编译器. (3认同)
  • 我完全同意.我只想说税法是一个可怕的混乱.相比之下,形式语言通常以适合自动化的方式定义.这使得简单的编译器比处理税收的程序更容易编写.虽然Eric Lippert可能会乞求不同意C#编译器,参见 http://blogs.msdn.com/b/ericlippert/archive/2010/02/04/how-many-passes.aspx.从单程C编译器走了很长一段路. (3认同)