用 C# 编写 C# 编译器,先有鸡还是先有蛋?

Posted 极客精神

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用 C# 编写 C# 编译器,先有鸡还是先有蛋?相关的知识,希望对你有一定的参考价值。

前段时间翻译的一篇文章 ,文章讲了微软用C#重写C#编译器的坎坷路,引发了一些童鞋的思考:用C#编写C#编译器(Roslyn),那么C#编译器本身是由谁来编译的?C#语言编写了C#编译器,而C#语言又是由C#编译器编译的,这不就是先有鸡还是先有蛋的问题吗?

看到童鞋们的评论,我并没有立即回复,因为这个问题确实不好回答。但作为 .NET 忠实的布道老者(请允许我装逼一回),我还是觉得有必要给大家解释一下。

首先,编译器Roslyn确实是自己编译自己,它的每个版本都是由该版本的上一个版本来编译的。那么Roslyn最初的第一个版本是由什么来编译的呢?

这里就要提到了个计算机科学中的一个概念:Bootstrapping Compiler,中文叫自举编译器。它的目的是实现自己编译自己。编译器为了达到自己编译自己的目的,它第一个版本必须由其它编程语言来实现,而它的第一个版本通常是非常简单和基础的版本。

很多编程语言发展成熟后都会用该语言本身来编写自己的编译器,比如C#和Go语言。

C#编译器Roslyn的第一个版本是由其它语言来编译的。具体是什么语言我不确定,我觉得应该是C++,我还没查到,如果你知道,麻烦留言告诉我。

如果Roslyn的第一个版本是由C++来编写的,那么C++编译器的第一个版本又是由什么来编写的呢?如果不是C语言那很可能就是直接用机器语言来编写的了,机器语言是操作系统可以直接运行的指令,自然不需要编译器来翻译。

所以,但凡编译器是由高级语言来编写的,它的第一个版本一定是由其它语言来编写的,追溯它最初的祖先,一定是用机器语言来编写的。

以上是关于用 C# 编写 C# 编译器,先有鸡还是先有蛋?的主要内容,如果未能解决你的问题,请参考以下文章

谁在 OS 中调度调度程序——这不是先有鸡还是先有蛋的场景吗?

GWT RPC 序列化和循环引用——先有鸡还是先有蛋的问题

[Java]先有Class还是先有Object?

JS 究竟是先有鸡还是有蛋,Object与Function究竟谁出现的更早,Function算不算Function的实例等问题杂谈

Linux最初的版本是怎么由源代码变为系统的?

YDKJS:作用域与闭包