用C#写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#编译器,先有鸡还是先有蛋相关推荐
- 蛋鸡问题,先有鸡还是先有蛋。顺便回答第一个编译器是怎么来的。(思考使人伟大)
生活中存在着一些自举的例子,这些例子常被拿来做为思维狡辩的工具,它们确实也起到了让普通人思维混乱的作用. 问题如下: 1. 蛋鸡问题,鸡可以生蛋,蛋可以孵出鸡,那么到底先有鸡还是先有蛋? 2. 人 ...
- 用 C# 编写 C# 编译器,先有鸡还是先有蛋?
前段时间翻译了一篇文章 微软是如何重写 C# 编译器并使它开源的,文章讲了微软用 C# 重写 C# 编译器的坎坷路,引发了一些童鞋的思考:用 C# 编写 C# 编译器(Roslyn),那么 C# 编译 ...
- 学了编译原理能否用 Java 写一个编译器或解释器?
16 个回答 默认排序 RednaxelaFX JavaScript.编译原理.编程 等 7 个话题的优秀回答者 282 人赞同了该回答 能.我一开始学编译原理的时候就是用Java写了好多小编译器和 ...
- 精读《手写 SQL 编译器 - 错误提示》
1 引言 编译器除了生成语法树之外,还要在输入出现错误时给出恰当的提示. 比如当用户输入 select (name,这是个未完成的 SQL 语句,我们的目标是提示出这个语句未完成,并给出后续的建议: ...
- 精读《手写 SQL 编译器 - 文法介绍》
1 引言 文法用来描述语言的语法规则,所以不仅可以用在编程语言上,也可用在汉语.英语上. 2 精读 我们将一块语法规则称为 产生式,使用 "Left → Right" 表示任意产生 ...
- 从零写一个编译器(完结):总结和系列索引
前言 这个系列算作我自己的学习笔记,到现在已经有十三篇了,加上这篇一共十四篇.一步一步的从词法分析到语法分析.语义分析,再到代码生成,准备在这一篇做一个总结收尾和一个这个系列以前文章的索引. (另外, ...
- 从零写一个编译器(三):语法分析之几个基础数据结构
项目的完整代码在 C2j-Compiler 写在前面 这个系列算作为我自己在学习写一个编译器的过程的一些记录,算法之类的都没有记录原理性的东西,想知道原理的在龙书里都写得非常清楚,但是我自己一开始是不 ...
- 从零写一个编译器(一):输入系统和词法分析
项目的完整代码在 C2j-Compiler 前言 从半抄半改的完成一个把C语言编译到Java字节码到现在也有些时间,一直想写一个系列来回顾整理一下写一个编译器的过程,也算是学习笔记吧.就从今天开始动笔 ...
- 编译器入门 语法分析器 java_从零开始写个编译器吧 - Parser 语法分析器
Parser(语法分析器)的编写相对于 Tokenizer (词法分析器)要复杂得多,因此,在编写之前可能也会铺垫得更多一些.当然,本系列旨在"写出"一个编译器,所以理论方面只会简 ...
最新文章
- RapidFramework使用Oracle的步骤
- 为什么我的电脑上安装不上python-python安装不上
- JAVA String 相加编译器发生了什么?
- 脑植入芯片实现脑机交互,脑神经链会如星链般放大马斯克的光环吗
- Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例
- django-解决-修改过的模型类不能被正常迁移的解决办法
- 【Flink】FLink 反序列化空指针 java.lang.String.<init> SimpleStringSchema
- 【打印代码+好好理解+子串问题】LeetCode 76. Minimum Window Substring
- 你知道 Google X 神秘实验室创始人的故事么?
- Java工程师必备资料,整合1G多jar包,网速慢也没关系,关注获取更多资源
- html实现简易影院购票,打造属于自己的私人影院,竟然这么简单!
- 最新高德地图使用——申请key、显示地图
- rust阿尔法辅助_和平精英阿尔法辅助器
- 搜狗新闻语料文本分类实践
- 机械臂D-H参数法分析
- unity android 触屏,Unity 移动端触摸屏操作
- IT培训机构那些让人恶心的招生手法
- 解决MySQL CPU占用100%的经验总结 转
- 网易云的特色与优势?|网易云
- Canvas实现高性能的频谱瀑布图音频频谱图
热门文章
- 征信报告记录有误,如何向金融机构申请异议处理?
- 便签app下载 手机便签app推荐下载
- 英文中1-100表达
- 推荐凉菜-凉拌木耳黄瓜花生米
- filemanager简单应用
- 努比亚android版本游戏彩蛋,更畅快游戏 努比亚红魔手机获系统更新
- seo提交工具_SEO:教您新网站的优化方法有哪些?
- 当实体类无法引用,有没有任何问题的时候,报红报错无法启动
- sumproduct()学习
- EPSON RX8010SJ RTC 调试笔记之六, 计时更新中断功能 (Time Update Interrupt Function)