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


148

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

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


12
许多编译器都是使用其编译语言编写的-Google自举以了解更多信息。
Paul Roub 2014年

19
我认为原始编译器是用C ++编写的。
PoweredByOrange 2014年

44
好了,可以用另一个锤子锻造一个锤子。它的先前版本...
Eugene Sh。

10
您发布的链接是指向Framework库的源代码的链接,而不是指向编译器的链接。
史蒂夫

Answers:


229

最初的C#编译器不是用C#编写的,而是用C和C ++编写的。新的Roslyn编译器是用C#编写的,但最初是使用旧的编译器进行编译的。完成新的编译器后,便可以编译自己的源代码:这称为bootstrapping


2
因此,当必须对“原始编译器”进行更改时,是否必须使用旧的编译器(用C,C ++编写)进行编译?
CriketerOnSO 2014年

10
无需更改“原始编译器”,即会修改较新的版本
别名2014年

1
@CriketerOnSO,新的编译器将替换旧的编译器,因此无需修改旧的编译器。但是,如果MS愿意这样做,他们将像以前一样用C ++编译器重新编译旧的编译器。
Thomas Levesque 2014年

3
@ThomasLevesque自托管是引导的最终结果。
arx 2014年

2
@SriramSakthivel,编译器的代码不能使用new关键字,至少直到有一个编译器能够理解它们时才可以使用new关键字。您始终使用较旧版本的编译器来构建新版本。
Thomas Levesque 2015年

32

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

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

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

如果我们回到了时间的迷雾中,那么我们确实会达到没有编译器的地步,这是高级语言的第一个迭代。然后,我们必须拿出铅笔和操作码书,并在汇编中编写第一本。我们如何编写第一个汇编器?直接输入机器代码(可能在打孔的纸带上),或在前面板上轻按开关。


9
纸带只是通过纸上的孔来翻转开关。:-)
Zan Lynx 2014年

2
纸带作为一种存储技术将永远不会腾飞。它太复杂且容易出错,而且如果阅读器短路,则很容易燃烧,这将完全破坏您的程序。
CVn 2014年

16

编译器只是一个程序,与其他任何程序一样。没有什么神奇或特别的东西。它需要一些输入并产生一些输出。在这种特殊情况下,输入恰好是C#,输出恰好是CIL,但这与输入是一系列纳税申报表和输出是报告没什么不同。


10
这是不同的-容易得多,-)。
彼得-恢复莫妮卡2014年

3
@PeterSchneider:人们喜欢将编译器当作神话般的神奇生物,但最终,它们只是将输入转换为输出的程序。地球上几乎每个程序都会解析一些输入,尝试使其有意义,然后将其转换为某些输出。从某种意义上说,每个输入都是用某种语言编写的程序,每个程序都是编译器。
约尔格W¯¯米塔格

3
我完全同意。我只想说税法是一团糟。相比之下,形式化语言通常以适合自动化的方式很好地定义。可以说,一个简单的编译器可能比处理税收的程序更容易编写。尽管埃里克·利珀特(Eric Lippert)可能会不同意C#编译器,但请参见。blogs.msdn.com/b/ericlippert/archive/2010/02/04/…。从一遍C编译器走了很长一段路。
彼得-恢复莫妮卡2014年

1
@PeterSchneider:啊,对不起,我误解了180°:-D您的评论
约尔格W¯¯米塔格

我最喜欢这个答案,因为它最直接地解决了OP的想法。它清除了“所有强大”编译器周围的雾气。
阿萨夫征费2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.