用 C# 编写 C# 编译器,先有鸡还是先有蛋?
前段时间翻译了一篇文章 微软是如何重写 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 自己编译的。
最新文章
- POJ 2386 题解
- 【jquery】flexiGrid新增功能的方式
- 编写Java应用程序。首先定义一个描述银行账户的Account类,包括成员变 量“账号”和“存款余额”,成员方法有“存款”、“取款”和“余额查询”。其次, 编写一个主类,在主类中测试Account类的功能
- Java多线程干货系列(1):Java多线程基础
- hive和ORACLE语法对比
- mysql 大小写 整理
- 注册表法修改IE8安全级别的方法
- javascript 内置对象
- Compactness问题
- hashTable(哈希表)的基本用法
- Java基础知识强化之IO流笔记59:打印流
- Catharanthus roseus(长春花碱)的生物合成
- QT_opengl_gluPerspective没有定义的处理方法
- Solr入门指南
- C#调用AForge实现摄像头录像
- windows配置ssh免密登录linux
- Codeforces Round #529 (Div. 3) F.Make It Connected
- 20135202闫佳歆--week6 分析Linux内核创建一个新进程的过程——实验及总结
- Mxnet 查看模型params的网络结构
- Nginx 分析access日志文件
热门文章
- HTTP协议简介详解 HTTP协议发展 原理 请求方法 响应状态码 请求头 请求首部 java模拟浏览器客户端服务端
- Zabbix3.0基础教程之一:系统监控,zabbix安装与基本配置
- javascript基础修炼(9)——MVVM中双向数据绑定的基本原理
- [转]react 部署在ngnix上(windows环境)
- 【转载】ASP.NET中Server.MapPath方法获取网站根目录总结
- [日常] nginx记录post数据
- JavaScript_01简介,基本语法,运算符
- Java学习笔记——i++与++i问题
- angular路由为空重定向到指定路由
- java新知识系列 五