【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱: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. Oracle数据库名与Oracle实例名的关系
  3. android lcd工具,Android东西lcd配置
  4. Exchange2010 初始化失败
  5. ubuntu启动时自动挂载windows分区
  6. ES5-Array-valueOf/toString
  7. SharePoint Server 2007 trial --- 年末大餐细细品尝 (第七口)
  8. Scrapy运行中常见网络相关错误
  9. CF98E Help Shrek and Donkey(纳什博弈 + 大讨论)
  10. 如何用python创建文件_怎么用python建立一个txt文档,并输入内容-百度经验
  11. 算术的c语言程序设计,C 程序设计:变量与算术表达式
  12. MySQL懒查询_mysql 联查的基本命令
  13. 在一切都是虚的世界里,你能做的是什么?
  14. Android系统联系人全特效实现(下),字母表快速滚动
  15. iOS底层探索之多线程(十八)——锁篇章的完结篇(手把手两种方式带你实现一个读写锁!)
  16. 架构师架构蓝图《UML精粹》 UML Distilled读后感
  17. tex常用函数 上下行对齐_latex 部分右对齐
  18. 使用电脑热点和Fiddler对Android app进行抓包
  19. 十款ASP CMS建站系统源码
  20. 智慧书-永恒的处世经典格言:201-240

热门文章

  1. 全球及中国流量计行业研究及十四五规划分析报告
  2. 在Kratos灵活的使用火山引擎ImageX的动态水印以及评测
  3. 非对称加密与数字签名的介绍与使用
  4. TP X 双击唤醒 X 高通msm8916 X 方案1
  5. 越过HG255D……
  6. 检测导航仪GPS端口的工具
  7. 2016-0616 JAVA实现的一个日历
  8. 【网络通信 -- 直播】FFMPEG 简介与常用命令总结
  9. 腾讯云“优才计划”携手TGO鲲鹏会,助力新基建技术人才培养
  10. 程序员的另一出路:大数据工程师