知乎上有一种说法是「编译器、图形学、操作系统是程序员的三大浪漫」。 先不管这个说法是对是错,我们假设一个程序员在国内互联网公司写代码,业余时间不看相关书籍。那么三年之后,他的这些知识会比在校时损耗多少?很显然,损耗的比例肯定非常高,毕竟国内互联网公司日常开发工作中,程序员 ...
知乎上有一种说法是「编译器、图形学、操作系统是程序员的三大浪漫」。
先不管这个说法是对是错,我们假设一个程序员在国内互联网公司写代码,业余时间不看相关书籍。那么三年之后,他的这些知识会比在校时损耗多少?
很显然,损耗的比例肯定非常高,毕竟国内互联网公司日常开发工作中,程序员基本很少接触这三块知识。大部分程序员工作几年后对编译原理相关的概念只能生理上起反应,脑海里很难再串联起相关概念了。
编译原理的概念有让人看到就头痛的特质,学校里要死记硬背,考试过了巴不得赶紧全忘掉,相信不少同学现在看到下面概念还会觉得蛋疼:
非确定性有限自动机/确定性有限自动机
四元式序列
上下文无关文法/BNF
终结符/非终结符
LL(1)/LR(1)
特设语法制导转换
局部优化
如果要按照课程来,光是背下这些名词和释义别说21分钟了,21天都有难度。更何况背下来这些名词之后如何写编译器又是另一个问题。
我们很多时候,都只是想快速上手写一个编译器,有可能是因为好奇,有可能是想实现自己的玩具DSL(领域特定语言),或者有可能是为了在约架时候防身。
今天的主题就是如何用21分钟的时间学会写编译器,上面的废话大概花费1分钟,接下来还剩20分钟。
正式开始做编译器之前,先以问答的形式对接下来的内容做个简单介绍:
广义的编译器可以指任意把一种语言代码转为另一种语言代码的程序。
编译器是一整套工具链,从前端的词法分析、语法分析,到中间表示生成、检查、分析、优化,再到代码生成。
如果是编译器从业者,大部分时间在做中间这块;如果是业余爱好者,大部分时间在做前端和代码生成。
既然是21分钟,那学会写个gcc肯定是不可能的,就算拿来学Flex+Bison都只能入个门。
我们接下来会先确定一下源语言的语法集,然后设计一下抽象语法树(AST)结构,写一个Parser,把源语言转换成一棵抽象语法树,再写一个CodeGenerator,把语法树转换为目标语言。
也就是说,相比于一个正常的编译器,我们省去了类型检查和中间表示的分析优化,并且为了能21分钟内学会,我们会把源语言定义得特别蠢。
接下来开始正文。
先确定源语言:
这是一门看起来像lisp的四则运算语言,四个双目运算符分别是「add」「sub」「mul」「div」。
多项四则运算可以这样写:
(mul (sub 5 (add 1 2)) 4)
原标题:21分钟学会写编译器
关键词:
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。