编译器创新设计和实现.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
4、代码生成和优化 代码生成需要综合平衡各种因素。功能强大的优化器可以产生更好的代码。但是他的速度太慢了。 就每棵树来说,lcc的指令选择是最佳的。但相邻数的代码边界处就差一些。lcc可以在最后使用窥孔优化解决。 lcc的寄存分配器比较原始,目前可以采用图的着色方法分配能力更为出色,但这样做会使代码多出很多。 * 条件表达式: conditonal-expression: binary-expression[? expression : conditional-expression] static Tree expr2(void) { Tree p = expr3(4); if (t == ?) { Tree l, r; Coordinate pts[2]; if (Aflag 1 isfunc(p-type)) warning(%s used in a conditional expression\n, funcname(p)); p = pointer(p); t = gettok(); pts[0] = src; l = pointer(expr(:)); pts[1] = src; r = pointer(expr2()); } other return p; } * 另有二元表达式、一元表达式、后缀表达式和基本表达式。 表达式分析多是用递归和大量switch语句实现。 在编译领域用一个分析函数代替n个函数处理n级优先是非常流行的。 关于表达式的分析还包括表达式语义的分析,如类型检查转换、函数调用分析等各种操作。 * 2、语句分析 代码的表示:表达式首先被编译为分析树然后转化为dag。每个函数的dag在代码表中被串起来,代码表表示了函数的代码。 code结构: struct code { enum { Blockbeg, Blockend, Local, Address, Defpoint, Label, Start, Gen, Jump, Switch } kind; Code prev, next; union { unions }u; } * 语句的识别: void statement(int loop, Swtch swp, int lev) { float ref = refinc; if (Aflag = 2 lev == 15) warning(more than 15 levels of nested statements\n); switch (t) { case IF: ifstmt(genlabel(2), loop, swp, lev + 1); break; case WHILE: whilestmt(genlabel(3), swp, lev + 1); break; case DO: dostmt(genlabel(3), swp, lev + 1); expect(;); break; … … } check refinc = ref; } expect(‘;’) break; * if语句的识别: if expression == 0 goto L statement1 goto L+1 L: statement2 L+1: static void ifstmt(int lab, int loop, Swtch swp, int lev) { t = gettok(); expect(‘(’); //判断if后的( definept(NULL); walk(conditional(‘)’), 0, lab); //包含listnode函数生成dag并加入 refinc /= 2.0; //森林,把入口加入代码表.同时根 statement(loop, swp, lev); //据接过设置flab,tlab if (t == ELSE) { branch(lab + 1); t = gettok(); definelab(lab); statement(loop, swp, lev); if (findlabel(lab + 1)-ref) definelab(lab + 1); } else definelab(lab); } * 在循环、switch、goto语句中都用到了标号 和跳转,标号使通过definelab函数定义的, 而跳转通过

文档评论(0)

sandaolingcrh + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档