【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

最近,amazon网站上出现了一本书《自制编译器》,我觉得挺好的,分享给大家。相关地址单击这里。图书的作者是一位日本人,写的很仔细。其实,图灵出版社还引入了一些列的自制书籍,包括《自制cpu》、《自制操作系统》等等,有兴趣的同学都可以找来看看。事实上现在网上这类的资源很多了,只要你想学,基本上都可以满足你的需求。

读书的时候,虽然编译原理这门考试考的还可以,但是却没有深入理解过这么课。这一次正好利用看这一本书的机会,好好梳理了一下。通常情况下,编译文件分为这几个步骤:词法分析、语法分析、语义分析、中间代码生成、代码生成与优化。词法分析比较简单,主要就是读取文本文件,将文件中的字符串进行归类处理,比如说哪些是关键字、哪些是数字、哪些是字符串、哪些是分割符等等。语法分析稍微复杂一些,它主要是把文本字符串按照当初bnf范式的形式构建成一个合适的语法树,方便后面进行中间代码生成。语义分析一般紧跟着语法分析进行,它主要是检查语法树中是不是存在非法的语句存在,比如变量重复出现、赋值错误、除数为0等等。中间代码比较简单,主要是按照语法树的要求,暂时先将语法树上的if语句、for语句、while语句、block语句转变成四元组,或者是你自己定义的某种临时代码格式,之所以这么做是因为事实上需要将源文件转换成很多种cpu代码,因此必须要先这么做。至此之前的这四个部分可以称之为编译器前端处理,后端处理呢就是将中间代码转变成目标cpu代码。最后一部就是代码生成与优化,arm处理器就转变成arm代码,x86处理器就转变成x86代码,选择不同的转变方式就可以了。同样,生成代码的时候必要的优化也是不可少的,有的是基于运算速度的,有的是基于空间大小的,还有的是基于cpu乱序执行的,这部分内容就很复杂了。总之,优化的目的就是为了除去冗余代码,越快越好。

早先开发编译器是一件非常辛苦的事情,但是现在就没有那么困难了。书中介绍的工具是javacc,这是一个语法解析工具,用java写成,我自己不太熟悉。对我来说,比较了解的其实还是lex & yacc这两个工具,lex可以帮你进行字符串的梳理,或者叫token的判别,yacc可以帮助你构建一个合适的语法树。这样,有了这两个工具,如果你需要生成目标文件,像C一样,这是可以的。当然你也可以自己设计一个脚本语言,像perl、python一样,没有任何问题。

最后,我自己尝试在github上找找看,有没有比较简单的c编译器可以练练手,没想到还真的有,地址在这里。这是一个用python写成的简单编译器,你可以自己写一个小的c文件,然后用python解析看看具体的结果是什么。比如,我输入的文件是hello.c,

#include <stdio.h>int main() {return 0;
}

词法分析的结果是这样的,python compiler.py -s hello.c -l,

(SHARP, #)
(INCLUDE, include)
(LT, <)
(IDENTIFIER, stdio.h)
(GT, >)
(INT, int)
(IDENTIFIER, main)
(LL_BRACKET, ()
(RL_BRACKET, ))
(LB_BRACKET, {)
(RETURN, return)
(DIGIT_CONSTANT, 0)
(SEMICOLON, ;)
(RB_BRACKET, })

语法分析是这样的, python compiler.py -s hello.c -p

( self: Sentence None, father: None, left: None, right: None )
( self: Include None, father: Sentence, left: None, right: FunctionStatement )
( self: # None, father: Include, left: None, right: include )
( self: include None, father: Include, left: #, right: < )
( self: < None, father: Include, left: include, right: stdio.h )
( self: stdio.h None, father: Include, left: <, right: > )
( self: > None, father: Include, left: stdio.h, right: None )
( self: FunctionStatement None, father: Sentence, left: Include, right: None )
( self: Type None, father: FunctionStatement, left: None, right: FunctionName )
( self: int FIELD_TYPE, father: Type, left: None, right: None )
( self: FunctionName None, father: FunctionStatement, left: Type, right: StateParameterList )
( self: main IDENTIFIER, father: FunctionName, left: None, right: None )
( self: StateParameterList None, father: FunctionStatement, left: FunctionName, right: Sentence )
( self: Sentence None, father: FunctionStatement, left: StateParameterList, right: None )
( self: Return None, father: Sentence, left: None, right: None )
( self: return None, father: Return, left: None, right: Expression )
( self: Expression Constant, father: Return, left: return, right: None )
( self: 0 _Constant, father: Expression, left: None, right: None )

生成的汇编文件又是这样的,python compiler.py -s hello.c -a,

.data
.bss
.lcomm bss_tmp, 4
.text
.globl main
main:
finit
pushl $0
call exit

虽然这个python还不能处理嵌套等特别复杂的语法,但是用仅仅1500行的code就能做到这样其实已经是难得可贵了。有兴趣的同学可以去试一试,也可以看看这个compiler.py文件是怎么写的。

随想录(推荐《自制编译器》这本书)相关推荐

  1. 《自制编译器》-读后感

    如前文<在36岁的本命年,我失业了>所述,最近的这段时间,不用打卡,时间自然比较充裕,尤其是春节以前,小朋友也放假了,天天嚷着要回老家,于是买了几张火车票,就把老人和小朋友一起送回了老家. ...

  2. JAVA程序猿推荐看的15本书_错过了是你损失

    2019独角兽企业重金招聘Python工程师标准>>> 作为Java程序员来说,最痛苦的事情莫过于可以选择的范围太广,可以读的书太多,往往容易无所适从.我想就我自己读过的技术书籍中挑 ...

  3. python手机编译器推荐_Python编译器最新版|Python编译器手机版下载 v1.2 安卓版 - 数码资源网...

    现在互联网发展迅速发展,很多人开始往it行业发展,我给你们推荐一款很好的软件,Python编译器手机版主要为Python初学者提供直接运行的功能,能够随手验证一些小程序,Python编译器app支持直 ...

  4. 如何自学市场营销?推荐你看这本书

    首先,十分推荐你认真看下<营销管理必读12篇>这本书,相信你一定会有收获.这本书是我看过的最好的市场营销基础入门书籍,比很多传统的教材或图书都要强太多.要学好市场营销最重要的是打好基础知识 ...

  5. 激励员工的书推荐:这5本书让你学会员工激励

    身为管理者你真的会激励员工吗?本文推荐的这5本书籍都是员工激励及员工管理方面的经典书籍,将助力你更好地去管理员工.除榜首的<员工管理必读12篇>只能从12Reads官网获得以外,其他书籍各 ...

  6. 职场人如何提高情商?推荐你看这本书

    身在职场,什么技能最重要? 毋庸置疑,答案是:情商. 因此说起「职场人必看的书籍推荐」这一话题,无论是职场「新兵」还是「老手」,几乎所有职场人都有理由.有必要深耕「情商」领域.而关于这一方面的书籍,我 ...

  7. 数字化转型,我只推荐看这两本书

    信息化这个词是日本人梅棹昭夫在1960年代发明的一个词,后来在1970年代传到西方.其实西方并不用信息化这个词,西方一直用数字化这个词. 数字化转型李鬼太多了,可推荐的书不多.截止到目前位置,我能推荐 ...

  8. 傅盛推荐的十六本书:关于成长 认知 思维模式和进化

    文/傅盛 来源:傅盛(fstalk) 我一直认为,思维模式比智商更重要.而改变思维模式,也是有方法论的. 我们生活在一个处处不公平的世界,我们无法改变这个世界的规则,无法改变自己的过去,但至少可以改变 ...

  9. 要提高情商,我推荐你看这本书

    在职场和生活中,几乎是你想象到的任何方面,情商(Emotional Intelligence)都扮演着重要角色. 而要提高情商,大概没有什么方法比阅读情商方面的书籍更行之有效的了. 但问题是,市面上的 ...

最新文章

  1. 《大道至简》第一章编程的精义伪代码读后感
  2. python工作招聘-学习Python 能找到工作?1300+条招聘信息告诉你答案
  3. Django与数据库操作
  4. 有关单例模式懒汉式安全的问题(全)
  5. Python教程:os 与 sys 模块详细用法
  6. pytorch torch.item()(返回此张量的值作为标准Python数字。 这仅适用于具有一个元素的张量。)
  7. Linux文件查找之find秘笈
  8. 数据科学 python_如何使用Python为数据科学建立肌肉记忆
  9. Linux C 指针练习
  10. 提升开发效率的十个工具
  11. web项目里看不到html,在webpack中导入html文件时找不到模块错误
  12. 我敲的不是代码,而是……
  13. Ajax 登录控件(三)
  14. VS编译NPAPI:error C2065: “PCONTEXT”: 未声明的标识符
  15. 如何使用RDP报表工具预览页面可以出现完整数据而不是只显示一条
  16. 一个完整的html代码是什么,html是什么?一个完整的html代码告诉你(完整实例版)...
  17. python计算iv值_Python计算IV值的示例讲解
  18. JavaScript写入文件到本地
  19. Racket读写JSON
  20. 震惊!旷视首席科学家、知名AI学者孙剑博士去世

热门文章

  1. 【微信卡包发票导入】微信电子发票报销方服务端接入时遇到的那些坑
  2. 一种应用于基站天线的新型球透镜
  3. COBOL算术运算语句
  4. 图谱实战 | 知识图谱在美团搜索酒旅场景认知中的应用
  5. ping直连同网段设备的过程
  6. mysql大数据高并发处理(转)
  7. VMware软件下载地址
  8. 同一账户在不同地方登录问题
  9. 2020 DASCTF四月春季战-misc
  10. 娱乐视频直播为什么需要DASH