前段时间翻译了一篇文章 微软是如何重写 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 自己编译的。

最新文章

  1. POJ 2386 题解
  2. 【jquery】flexiGrid新增功能的方式
  3. 编写Java应用程序。首先定义一个描述银行账户的Account类,包括成员变 量“账号”和“存款余额”,成员方法有“存款”、“取款”和“余额查询”。其次, 编写一个主类,在主类中测试Account类的功能
  4. Java多线程干货系列(1):Java多线程基础
  5. hive和ORACLE语法对比
  6. mysql 大小写 整理
  7. 注册表法修改IE8安全级别的方法
  8. javascript 内置对象
  9. Compactness问题
  10. hashTable(哈希表)的基本用法
  11. Java基础知识强化之IO流笔记59:打印流
  12. Catharanthus roseus(长春花碱)的生物合成
  13. QT_opengl_gluPerspective没有定义的处理方法
  14. Solr入门指南
  15. C#调用AForge实现摄像头录像
  16. windows配置ssh免密登录linux
  17. Codeforces Round #529 (Div. 3) F.Make It Connected
  18. 20135202闫佳歆--week6 分析Linux内核创建一个新进程的过程——实验及总结
  19. Mxnet 查看模型params的网络结构
  20. Nginx 分析access日志文件

热门文章

  1. HTTP协议简介详解 HTTP协议发展 原理 请求方法 响应状态码 请求头 请求首部 java模拟浏览器客户端服务端
  2. Zabbix3.0基础教程之一:系统监控,zabbix安装与基本配置
  3. javascript基础修炼(9)——MVVM中双向数据绑定的基本原理
  4. [转]react 部署在ngnix上(windows环境)
  5. 【转载】ASP.NET中Server.MapPath方法获取网站根目录总结
  6. [日常] nginx记录post数据
  7. JavaScript_01简介,基本语法,运算符
  8. Java学习笔记——i++与++i问题
  9. angular路由为空重定向到指定路由
  10. java新知识系列 五