compiler

                  ****编译器的一些思考心得****

2016年大三下半学期学习了编译原理课程,一直想自己动手写点代码加深一下对编译器的理解,前后准备了半年做了一个小编译器,首先说一说他的不足吧,
1,用的是递归下降法写语法分析器,没有使用LL(1)的方法理解深刻,以后如果有时间再用LL(1)重造一下语法部分,而且从顶向下的的语法分析方法十分的不灵活,当语法规则变动的话语法分析器要做相当大的改动,所以以后还想用LR(0),LR(1),SLR(1),LALR(1)自顶向下的方法再做一遍
2.语义分析部分,符号表使用结合scope栈,实现了局部符号表,并且采用顺序查表的方式,顺序查表会导致查找速度很慢,在此我向自己提出几点要求以后慢慢完善,
(1)能不能利用树形结构全局符号表管理程序,实现但不局限于符号表的创建,填表,查表和撤销局部化区域的操作,在此基础上定义散列函数使用散列法重做符号表的管理
(2)我现在实现的顺序查找法,以后有机会要使用二分查表法重做符号表的组织,插入与删除,利用树形结构全局符号表
3,中间代码生成阶段使用的是基于语法树翻译的方式,这种方式只要语法树构造完成翻译过程十分的简便,以后有时间要实现语法制导的翻译过程,在生成中间代码的时候,表达式的翻译遇到了问题,一开始没有考虑运算符优先级,就按着语法树翻译的,后面意识到问题以后,加了表达式栈,可以按照栈的性质去检查括号匹配,运算符优先级的结合
4,没有实现中间代码优化部分,以后要做关于常量表达式节省,循环不变式外提,公共表达式节省的优化动作,除了这些简单的优化之外当然还有很多高端优化技术
5,目标代码我使用了一个虚拟机,虚拟机的实现思想是《Compiler Construction Principle and Practice》-
Kenneth C. Louden的书中为tiny语言设计的栈式虚拟机,其实实现起来不复杂,只要将指令集搞懂,就很好用高级语言模拟,这里其实可以直接将目标代码汇编成二进制数据,但是windows与linux的可执行文件格式没有深入研究过,无奈最后拿高级语言模拟目标代码也是鸡肋,以后抽时间也想学一学怎么去加载二进制文件,然后直接汇编加载可执行文件应该会很有成就感,还有多文件编译,动态链接库,静态链接库,这么多核心知识需要继续学习下去
6,关于github上的各种文件的说明*.txt文本文件是测试用例,*next.txt是词法分析的结构,语法树是直接存在内存中的,*finalcode.txt是生成的目标代码文件,是虚拟机执行用的目标代码
7,说了这么多不足,也就是为了提醒一下自己一定要坚持下去,把这个项目继续完善下去,这个项目给我带来的成长是,我了解了一趟编译下来做的所有动作,深刻理解了这个变量的作用域,函数调用栈是怎么一回事,对于编译原理里面的基本算法都懂了,但是总是感觉学到的还是太少,上面的这些不足是我自己的反思,觉得这个项目还应该让我能学到的但是我现在还没有掌握的东西有什么

说了这些缺点只是想勉励自己以后慢慢地修正这一切
下面贴出代码https://github.com/lingxialingdu/compiler

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值