

手把手教你构建 C 语言编译器(9)- 总结
source link: https://lotabout.me/2016/write-a-C-interpreter-9/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

恭喜你完成了自己的 C 语言编译器,本章中我们发一发牢骚,说一说编写编译器值得注意的一些问题;编写编译器时遇到的一些难题。
手把手教你构建 C 语言编译器系列共有10个部分:
虚拟机与目标代码
整个系列的一开始,我们就着手虚拟机的实现。不知道你是否有同感,这部分对于整个编译器的编写其实是十分重要的。我认为至少占了重要程度的50%。
这里要说明这样一个观点,学习编译原理时常常着眼于词法分析和语法分析,而忽略了同样重要的代码生成。对于学习或考试而言或许可以,但实际编译项目时,最为重要的是能“跑起来”,所以我们需要给予代码生成高度的重视。
同时我们也看到,在后期解析语句和表达式时,难点已经不再是语法分析了,而是如何为运算符生成相应的汇编代码。
我们用了很暴力的手段编写了我们的词法分析器,我认为这并无不可。
但你依旧可以学习相关的知识,了解自动生成词法分析器的原理,它涉及到了“正则表达式”,“状态机”等等知识。相信这部分的知识能够很大程度上提高你的编程水平。
同时,如果今后你仍然想编写编译器,不妨试试这些自动生成工具。
长期以来,语法分析对我而言一直是迷一样的存在,直到真正用递归下降的方式实现了一个。
我们用了专门的一章讲解了“递归下降”与 BNF 文法的关系。希望能减少你对理论的厌恶。至少,实现起来并不是太难。
如果有兴趣,可以学习学习这些文法,因为已经有许多自动生成的工具支持它们。这样你就不需要重复造轮子。可以看看 yacc 等工具,更先进的版本是 bsion
。同时其它语言也有许多类似的支持。
题外话,最近知道了一个叫“PEG 文法”的表示方法,无论是读起来,还是实现起来,都比 BNF 要容易,你也可以学习看看。
关于编代码
这也是我自己的感慨吧。无论多好的教程,想要完全理解它,最好的方式恐怕还是要自己实现它。
只是在编写代码的过程中,我们会遇到许多的挫折,例如需要考虑许多细节,或是调试起来十分困难。但也只有真正静下心来去克服它,我们才能有所成长吧。
例如在编写表达式的解析时,大量重复的代码特别让人崩溃。还有就是调试编译器,简直痛苦地无话可说。
P.S. 如果你按这个系列自己编写代码,记得事先写一些用于输出汇编代码的函数,很有帮助的。
还有就是写这个系列的文章,开始的冲动过了之后,每写一篇都特别心烦,希望文章本身没有受我的这种情绪影响吧。
编程有趣又无趣,只有身在其中的我们才能体会吧。
Recommend
-
14
Table of Contents这是整个编译器的最后一部分,解析表达式。什么是表达式?表达式是将各种语言要素的一个组合,用来求值。例如:函数调用、变量赋值、运算符运算等等。 表达式的解析难点有二:一是运算符的优先级问题,二是如何将表达式编译...
-
6
手把手教你构建 C 语言编译器(7)- 语句Table of Contents整个编译器还剩下最后两个部分:语句和表达式的解析。它们的内容比较多,主要涉及如何将语句和表达式编译成汇编代码。这章讲解语句的解析,相对于表达式来说它还是较为...
-
12
Table of Contents由于语法分析本身比较复杂,所以我们将它拆分成 3 个部分进行讲解,分别是:变量定义、函数定义、表达式。本章讲解函数定义相关的内容。 手把手教你构建 C 语言编译器系列共有10个部分: EBNF 表示 这是...
-
14
Table of Contents本章中我们用 EBNF 来大致描述我们实现的 C 语言的文法,并实现其中解析变量定义部分。 由于语法分析本身比较复杂,所以我们将它拆分成 3 个部分进行讲解,分别是:变量定义、函数定义、表达式。 手把手教你构建 C...
-
14
Table of Contents本章我们将讲解递归下降的方法,并用它完成一个基本的四则运算的语法分析器。 手把手教你构建 C 语言编译器系列共有10个部分: 什么是递归下降 传统上,编写语法分析器有两种方法,一种是自顶向下,一种...
-
10
Table of Contents本章我们要讲解如何构建词法分析器。 手把手教你构建 C 语言编译器系列共有10个部分: 什么是词法分析器 简而言之,词法分析器用于对源码字符串做预处理,以减少语法分析器的复杂程度。 词法分析...
-
15
Table of Contents这是“手把手教你构建 C 语言编译器”系列的第三篇,本章我们要构建一台虚拟的电脑,设计我们自己的指令集,运行我们的指令集,说得通俗一点就是自己实现一套汇编语言。它们将作为我们的编译器最终输出的目标代码。 手把手教...
-
8
Table of Contents这是“手把手教你构建 C 语言编译器”系列的第二篇,我们要从整体上讲解如何设计我们的 C 语言编译器。 手把手教你构建 C 语言编译器系列共有10个部分: 首先要说明的是,虽然标题是编译器,但实际上我们构建的是 C...
-
9
Table of Contents“手把手教你构建 C 语言编译器” 这一系列教程将带你从头编写一个 C 语言的编译器。希望通过这个系列,我们能对编译器的构建有一定的了解,同时,我们也将构建出一个能用的 C 语言编译器,尽管有许多语法并不支持。 手把手...
-
8
年度梳理之文化篇:手把手教你构建企业文化 | 未来组织未来组织 · 36分钟前36氪“未来组织”栏目为您梳理了全年精华文章,本篇从文化角度带您高效获取相关内容。
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK