编译原理入门课:实现一个表达式解析计算器(前言)

栏目: 服务器 · 编程工具 · 发布时间: 5年前

内容简介:首先要聊聊我为什么想要写一篇编译原理的入门课。熟悉我的人可能会知道,我喜欢把复杂难懂的东西拆解成简单易理解的东西,无论是在代码的设计上,还是在知识的分享上。另外我也是个实用主义者,写出来的代码光好看没有什么卵用,必须要有实际的用途,它才是有价值的代码。所以写这样一个系列的博客,主要有两个目的:所谓编译器前端,主要是指词法分析、语法分析这一类解析的过程,负责把我们写的代码翻译成计算机可以理解的格式。编译器后端,主要负责把前端解析得到的中间代码进行优化,生成CPU可以运行的二进制代码。编译器后端的知识,需要对汇

首先要聊聊我为什么想要写一篇编译原理的入门课。熟悉我的人可能会知道,我喜欢把复杂难懂的东西拆解成简单易理解的东西,无论是在代码的设计上,还是在知识的分享上。另外我也是个实用主义者,写出来的代码光好看没有什么卵用,必须要有实际的用途,它才是有价值的代码。所以写这样一个系列的博客,主要有两个目的:

  1. 拆解编译原理里一部分入门级别的基础知识,用最少的篇幅讲解编译器前端的大致工作原理
  2. 实现一个可以解析并计算简单数学表达式的库,让需要的人可以使用它完成一些计算功能

所谓编译器前端,主要是指词法分析、语法分析这一类解析的过程,负责把我们写的代码翻译成计算机可以理解的格式。编译器后端,主要负责把前端解析得到的中间代码进行优化,生成CPU可以运行的二进制代码。编译器后端的知识,需要对汇编、计算机组成原理之类的知识有一定了解,才能更好的理解。所以我在这里不太打算深入讲解编译器后端的知识,想要全面了解编译原理的同学可以参考别的教程进行学习。

推荐书籍

曾经尝试学习过编译原理的同学,可能会深有感触,抱着书啃起来很枯燥,很容易从入门到放弃。编译原理的三大著名书籍人称龙书、虎书、鲸书,具体书名大家自己搜一下就很容易找到。我们比较熟悉的一本应该就是下图这个龙书——《编译原理》,普及最广应该是因为翻译得比较好吧。书里说的大部分是理论知识,很可能看完三四章后,了解了很多编译器中的概念和方法,但是想要自制个编译器就会觉得无从下手。不过这不会影响它的地位,想深入学习编译原理肯定还是离不开它的,建议对编译器感兴趣的同学先从博客入门,入门后如果觉得想要更深入,再买一本《编译原理》回去啃也不迟。

编译原理入门课:实现一个表达式解析计算器(前言)

推荐博客及开源库

首推一个lotabout大佬的《 手把手教你构建 C 语言编译器 》系列博客。博客从构建虚拟机开始,然后逐步的介绍词法分析再到语法分析,围绕着已经构建好的虚拟机一步步构造编译器。从构造编译器的过程上来说,大概是下图这样:

编译原理入门课:实现一个表达式解析计算器(前言)

lotabout大佬的教程总结起来有以下特点:

  1. 编译器完整:包含编译器前端和编译器后端,对了解编译器完整工作流程有很大帮助

  2. 功能丰富:支持变量,条件和循环语句等复杂功能

  3. 较为深入:对虚拟机设计的讲解,以及对应虚拟机的代码生成逻辑都讲得较为深入。这个有好有坏,好处当然是大家能学到的东西更多,坏处就是对于不了解CPU和汇编的同学来说太难理解

  4. 中期无法运行:教程中期几篇的结尾都会有“本章的代码还无法正常运行”。这是必然的,编译器必须完成完整的流程才能运行,在虚拟机的基础上没有完成生成代码的逻辑,肯定会无法运行。这就可能让中间的学习过程有一定的断层

推荐的开源库首先也是推荐lotabout大佬博客对应的GitHub开源库: write-a-C-interpreter 。光对着代码干啃很累,有对应的博客当然还是学起来更快的。

然后推荐的是 Fabrice Bellard 大神的 otcc ,这应该是最迷你的 C语言 编译器了,迷你但五脏俱全,甚至于可以做到自举(自举就是自己可以编译自己)。它是当年Fabrice Bellard参加国际混淆(混乱)C语言代码大赛的获奖作品,可以编译 C语言的子集 。当然我们阅读代码的时候请阅读 非混淆版本 的,不然你的大脑可能得跟计算机一样才能看懂写得是什么……

想再深入学习代码就试着看 TinyCC 吧,是Fabrice Bellard基于otcc扩展写出来的 完整的C语言 编译器,号称最快最小。这个级别的代码,反正我已经看不懂了……

本入门课

我这里要写的入门课,一开始就说了不包含编译器后端,所以这里不能叫它编译器,只能叫做解释器或者说计算器。和大部分的编译原理课不同,我会先写出来可以运行的最小单元,然后一边展开知识范围一边迭代,让解释器可以支持更多的功能。大概的过程会是这样:

编译原理入门课:实现一个表达式解析计算器(前言)

是不是更像是一个软件的常规迭代过程些?入门课会有以下特征:

  1. 只含编译器前端,功能只有简单计算,简化了要学习的内容
  2. 始终可以运行,持续迭代新功能

目录会如下:

(一)用最简单的语法分析器解析加减法

(二)递归解析中怎么处理运算符优先级

(三)简单错误处理逻辑以及负数的解析

(四)用词法解析处理多位数字和空白符

(五)解析ID型词法和函数调用语法

(六)用函数表来优化函数解析的逻辑

后面还可能会补充其他内容,要看看大家对什么内容/功能感兴趣,还要等我的懒癌被治好。

入门课对应的代码都会开源放在GitHub: SlimeExpressionC

想要更多的功能/教学可以在我的博客里留言,或者到对应的开源库下面去提issue,也热烈欢迎你们提MR或者fork出去自己玩。今天就先水到这里。

编译原理入门课:实现一个表达式解析计算器(前言)


以上所述就是小编给大家介绍的《编译原理入门课:实现一个表达式解析计算器(前言)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

走进搜索引擎

走进搜索引擎

梁斌 / 电子工业出版社 / 2007-1 / 49.80元

《走进搜索引擎》由搜索引擎开发研究领域年轻而有活力的科学家精心编写,作者将自己对搜索引擎的深刻理解和实际应用巧妙地结合,使得从未接触过搜索引擎原理的读者也能够轻松地在搜索引擎的大厦中邀游一番。《走进搜索引擎》作为搜索引擎原理与技术的入门书籍,面向那些有志从事搜索引擎行业的青年学生、需要完整理解并优化搜索引擎的专业技术人员、搜索引擎的营销人员,以及网站的负责人等。《走进搜索引擎》是从事搜索引擎开发的......一起来看看 《走进搜索引擎》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试