一段时间前,我们用go编写了python的词法解析器。由于近一段时间事情繁多,同时囊中羞涩,因此更多的精力投入到了和“变现”相关的工作,对编译原理,数据库这些极为基础且底层的技术有所忽略,毕竟他们不像reactjs, javascript,后台开发等这些工程性技术那样容易挣钱,因此属于用爱发电的范畴。但是工程性工作做多了我也发现一个问题,那就像人吃多精细食品而没有适当摄入粗粮,这会使得人有气无力,气虚多汗,让人感觉到体内虚空,没有底层理论和技术支持,一切上层构建都搭承在脆弱的地基上,随时有坍塌的危险。
为此我再次回归到底层技术,这次希望能沉淀下来,把编译原理,数据库系统等底层技术的设计和算法思想说清楚,这些都是当前繁花乱眼的上层技术的根基,掌握好他们,我们就能在风云变幻的信息技术世界站稳了根基,无论各种流行的技术如何变迁,我们都能以万变不离其宗的姿态淡定面对。
我们上一次完成python语言的词法分析时匆匆而过,忽略了一个很重要的数据结构和算法概念,其实词法解析并不仅仅是对字符串的简单处理,它基于一个根本概念叫有限状态自动机,大家如果在云课堂上看过我的“自己动手用java写编译器”课程就会发现,那里我用了大量的篇幅和代码来说明这个东西。为了改变上次浮皮潦草的态度,这次我打算认认真真基于编译原理“圣经”,也就是在龙书的基础上,将编译原理的算法和理论慢慢展现出来,同时将它们以Python编译器的形式逐步实现,这样我们才能够“知行合一”,不仅仅将认知停留在似懂非懂的理论上,同时也能破除编译原理给人晦涩难懂的感觉。
进入正题。我们先了解编译器的基本结构。所谓编译实际上就是将一种语言所表述的内容用另一种语言说出来。因此编译器的基本功能在于“分