本文来自网易云社区。
知乎上有一种说法是「编译器、图形学、操作系统是程序员的三大浪漫」。
先不管这个说法是对是错,我们假设一个程序员在国内互联网公司写代码,业余时间不看相关书籍。那么三年之后,他的这些知识会比在校时损耗多少?
很显然,损耗的比例肯定非常高,毕竟国内互联网公司日常开发工作中,程序员基本很少接触这三块知识。大部分程序员工作几年后对编译原理相关的概念只能生理上起反应,脑海里很难再串联起相关概念了。
编译原理的概念有让人看到就头痛的特质,学校里要死记硬背,考试过了巴不得赶紧全忘掉,相信不少同学现在看到下面概念还会觉得蛋疼:
非确定性有限自动机/确定性有限自动机
四元式序列
上下文无关文法/BNF
终结符/非终结符
LL(1)/LR(1)
特设语法制导转换
局部优化
如果要按照课程来,光是背下这些名词和释义别说21分钟了,21天都搞不定。更何况背下来这些名词之后如何写编译器又是另一个问题。
我们很多时候,都只是想快速上手写一个编译器,有可能是因为好奇,有可能是想实现自己的玩具DSL(领域特定语言),或者有可能是为了在约架时候防身。
今天,我们就来看看如何用21分钟的时间学会写编译器,上面的废话大概花费1分钟,接下来还剩20分钟。
正式开始做编译器之前,先以问答的形式对接下来的内容做个简单介绍:
什么是编译器?
广义的编译器可以指任意把一种语言代码转为另一种语言代码的程序。
做编译器实际上都需要做什么?
编译器是一整套工具链,从前端的词法分析、语法分析,到中间表示生成、检查、分析、优化,再到代码生成。
如果是编译器从业者,大部分时间在做中间这块;如果是业余爱好者,大部分时间在做前端和代码生成。