前段时间翻译的一篇文章 微软是如何重写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. 蛋鸡问题,先有鸡还是先有蛋。顺便回答第一个编译器是怎么来的。(思考使人伟大)

    生活中存在着一些自举的例子,这些例子常被拿来做为思维狡辩的工具,它们确实也起到了让普通人思维混乱的作用. 问题如下: 1.  蛋鸡问题,鸡可以生蛋,蛋可以孵出鸡,那么到底先有鸡还是先有蛋? 2.  人 ...

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

    前段时间翻译了一篇文章 微软是如何重写 C# 编译器并使它开源的,文章讲了微软用 C# 重写 C# 编译器的坎坷路,引发了一些童鞋的思考:用 C# 编写 C# 编译器(Roslyn),那么 C# 编译 ...

  3. 学了编译原理能否用 Java 写一个编译器或解释器?

    16 个回答 默认排序​ RednaxelaFX JavaScript.编译原理.编程 等 7 个话题的优秀回答者 282 人赞同了该回答 能.我一开始学编译原理的时候就是用Java写了好多小编译器和 ...

  4. 精读《手写 SQL 编译器 - 错误提示》

    1 引言 编译器除了生成语法树之外,还要在输入出现错误时给出恰当的提示. 比如当用户输入 select (name,这是个未完成的 SQL 语句,我们的目标是提示出这个语句未完成,并给出后续的建议: ...

  5. 精读《手写 SQL 编译器 - 文法介绍》

    1 引言 文法用来描述语言的语法规则,所以不仅可以用在编程语言上,也可用在汉语.英语上. 2 精读 我们将一块语法规则称为 产生式,使用 "Left → Right" 表示任意产生 ...

  6. 从零写一个编译器(完结):总结和系列索引

    前言 这个系列算作我自己的学习笔记,到现在已经有十三篇了,加上这篇一共十四篇.一步一步的从词法分析到语法分析.语义分析,再到代码生成,准备在这一篇做一个总结收尾和一个这个系列以前文章的索引. (另外, ...

  7. 从零写一个编译器(三):语法分析之几个基础数据结构

    项目的完整代码在 C2j-Compiler 写在前面 这个系列算作为我自己在学习写一个编译器的过程的一些记录,算法之类的都没有记录原理性的东西,想知道原理的在龙书里都写得非常清楚,但是我自己一开始是不 ...

  8. 从零写一个编译器(一):输入系统和词法分析

    项目的完整代码在 C2j-Compiler 前言 从半抄半改的完成一个把C语言编译到Java字节码到现在也有些时间,一直想写一个系列来回顾整理一下写一个编译器的过程,也算是学习笔记吧.就从今天开始动笔 ...

  9. 编译器入门 语法分析器 java_从零开始写个编译器吧 - Parser 语法分析器

    Parser(语法分析器)的编写相对于 Tokenizer (词法分析器)要复杂得多,因此,在编写之前可能也会铺垫得更多一些.当然,本系列旨在"写出"一个编译器,所以理论方面只会简 ...

最新文章

  1. RapidFramework使用Oracle的步骤
  2. 为什么我的电脑上安装不上python-python安装不上
  3. JAVA String 相加编译器发生了什么?
  4. 脑植入芯片实现脑机交互,脑神经链会如星链般放大马斯克的光环吗
  5. Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例
  6. django-解决-修改过的模型类不能被正常迁移的解决办法
  7. 【Flink】FLink 反序列化空指针 java.lang.String.<init> SimpleStringSchema
  8. 【打印代码+好好理解+子串问题】LeetCode 76. Minimum Window Substring
  9. 你知道 Google X 神秘实验室创始人的故事么?
  10. Java工程师必备资料,整合1G多jar包,网速慢也没关系,关注获取更多资源
  11. html实现简易影院购票,打造属于自己的私人影院,竟然这么简单!
  12. 最新高德地图使用——申请key、显示地图
  13. rust阿尔法辅助_和平精英阿尔法辅助器
  14. 搜狗新闻语料文本分类实践
  15. 机械臂D-H参数法分析
  16. unity android 触屏,Unity 移动端触摸屏操作
  17. IT培训机构那些让人恶心的招生手法
  18. 解决MySQL CPU占用100%的经验总结 转
  19. 网易云的特色与优势?|网易云
  20. Canvas实现高性能的频谱瀑布图音频频谱图

热门文章

  1. 征信报告记录有误,如何向金融机构申请异议处理?
  2. 便签app下载 手机便签app推荐下载
  3. 英文中1-100表达
  4. 推荐凉菜-凉拌木耳黄瓜花生米
  5. filemanager简单应用
  6. 努比亚android版本游戏彩蛋,更畅快游戏 努比亚红魔手机获系统更新
  7. seo提交工具_SEO:教您新网站的优化方法有哪些?
  8. 当实体类无法引用,有没有任何问题的时候,报红报错无法启动
  9. sumproduct()学习
  10. EPSON RX8010SJ RTC 调试笔记之六, 计时更新中断功能 (Time Update Interrupt Function)