用 C# 编写 C# 编译器,先有鸡还是先有蛋?
2018-10-15 00:18
537 查看
前段时间翻译了一篇文章 微软是如何重写 C# 编译器并使它开源的,文章讲了微软用 C# 重写 C# 编译器的坎坷路,引发了一些童鞋的思考:用 C# 编写 C# 编译器(Roslyn),那么 C# 编译器本身是由谁来编译的?C# 语言编写了 C# 编译器,而 C# 语言又是由 C# 编译器编译的,这不就是先有鸡还是先有蛋的问题吗?
虽然(博客园)文章下方评论中提出这类问题的人不多(注:除了公众号,我的技术文章一般也会隔天在博客园发布),但我相信有这类疑问的人肯定不少。这个问题提得很好,会产生这个疑问说明你是个善于思考的人,有思辨能力;如果你又恰好看到了我这篇文章,得到了你要的答案,那么这就是我写文章的意义。
看到童鞋们的评论,我并没有立即回复,因为这个问题确实不好回答。但作为 .NET 忠实的布道老者(请允许我装逼一回),我还是觉得有必要给大家解释一下。
首先,编译器 Roslyn 确实是自己编译自己,它的每个版本都是由该版本的上一个版本来编译的。那么 Roslyn 最初的第一个版本是由什么来编译的呢?
这里就要提到了个计算机科学中的一个概念:Bootstrapping Compiler,中文叫自举编译器。它的目的是实现自己编译自己。编译器为了达到自己编译自己的目的,它第一个版本必须由其它编程语言来实现,而它的第一个版本通常是非常简单和基础的版本。
很多编程语言发展成熟后都会用该语言本身来编写自己的编译器,比如 C# 和 Go 语言。
C# 编译器 Roslyn 的第一个版本是由其它语言来编译的。具体是什么语言我不确定,我觉得应该是用 C++ 写的(因为老的 C# 编译器用的是 C++),我还没查到,如果你知道,麻烦留言告诉我。
如果 Roslyn 的第一个版本是由 C++ 来编写的,那么 C++ 编译器的第一个版本又是由什么来编写的呢?如果不是 C 语言那很可能就是直接用机器语言来编写的了,机器语言是操作系统可以直接运行的指令,自然不需要编译器来翻译。
所以,但凡自举编译器是由高级语言来编写的,它的第一个版本一定是由其它语言来编写的,追溯它最初的祖先,一定是用机器语言来编写的。
2018-10-14 续
关于 C# 编译器 Roslyn 的第一个版本是用什么编译的,我在 Medium 留言问了 C# 语言负责人 Mads Torgersen:
他的回答是:
至此,文中的怀疑得到了确认。也就是说 Roslyn 最初的第一版是用老的 C# 编译器编译的(老的编译器是用 C++ 编写的),之后都是用 Roslyn 自己编译的。
相关文章推荐
- 用C#编写的代码经C#编译器后,并非生成本地代码而是生成托管代码
- C# WinFrom 编写正则表达式验证类
- TensorFlowSharp入门使用C#编写TensorFlow人工智能应用
- C#编写TensorFlow人工智能应用
- C#中编写多线程应用程序
- 从零开始编写自己的C#框架(9)——数据库设计与创建
- ICE专题:使用C#编写ICE分布式应用程序
- vc++中编写Dll,在C#(WPF)中引用
- 使用反射和codeDom实现C#插件开发(4)主程序开发之main函数编写
- 定义string类型 编译器还是报错
- C#String.Split (string[], StringSplitOptions)中的StringSplitOptions是什么意思,看了msdn还是不懂?
- c# 动态调用.net编写的webservices接口
- 在C#中编写多线程应用程序(转载)
- 用XML编写EXCEL文件,XML的写法注意事项,可以C#+xslt导出Excel
- IronPython引用C#编写的Dll的几个方式
- 编写一些代码,确定一个变量是有符号数还是无符号数(c专家编程摘录)
- Swifter C#之inline还是不inline,这是个问题
- C#中如何调用C++编写的DLL
- Silverlight 2.0 用VB好还是用C#好
- 表单提交数据的方式 怎么在服务器获取 服务器控件 html服务器控件 提交服务器之前的验证 前台网页编写c#代码