常量折叠

基本思想:在编译期间计算表达式的值(编译时静态计算)

例如:a = 3 + 5 ==> a = 8,if (true && false) ... ==> if (false)

好处是:语法树的节点数量减少了,意味着编译器要维护的中间表示所要耗费的计算资源(比如内存)减少了;将来生成机器码的话,指令也减少了。

常量折叠把进行更深层次的优化的机会暴露出来了,例如上面的if (false),就可以进行死代码消除优化。

可以整型、布尔型、浮点型等数据类型上进行(依赖于我们编译的元语言的情况)

语法制导的常量折叠算法

const_foid(Exp_t e)
{while (e is stiil shrinking)switch (e->kind)case EXP_ADD:Exp_t l = e->left;Exp_t r = e->right;if (l->kind == EXP_NUM && r->kind == EXP_NUM)e = Exp_Num _new(l->value + r->value);break;case EXP_TIMES:...default:break;
}

常量折叠小结

容易实现、可以在语法树或者中间表示上进行

通常被实现成公共子函数被其他优化调用

必须要很小心遵守语言的定义,例如:考虑溢出或者异常,0xffffffff+1 ==> 0 (要考虑整型数的溢出是否要抛异常?不能直接优化掉!)

代数化简

基本思想:利用代数系统的性质对程序进行化简

示例:

a = 0 + b    ==>    a = b        (0是加法的左零元)
a = 1 * b    ==>    a = b         (1是乘法的左单位元)
2 * a          ==>    a + a         (强度削弱)
2 * a          ==>    a << 1       (强度削弱)

同样必须非常仔细的处理语义

例如:(i - j) + (i - j)    ==>    i + i - j - j,其中i = j = 0xffffffff,优化前为0,优化后i + i溢出,抛出异常

语法制导的代数化简算法

alg_simp(Exp_t e)
{whiie(e is sti11 shrinking) switch (e->kind)caseEXP_ADD : Exp_t l = e->left;Exp_t r = e->right;if (l->kind == EXP_NUM && l->value == 0)e = r;break;case...:...;  // 类似
}

死代码(不可达代码)删除

基本思想:静态移除程序中不可执行的代码

示例:if (false)  s1;  else  s2;   ==>   s2;

在控制流图上也可以进行这些优化,但在早期做这些优化可以简化中后端

不可达代码删除算法

deadcode(Stm_t s)
{while (s is still shrinking)switch (s->kind)case STM_IF:Exp_t e = s->condition;if (e->kind == EXP_FALSE)s = s->elsee;break;case ...:...; // 类似
}

代码优化- 前端优化相关推荐

  1. 【编译原理】中间代码优化(一) 优化技术大观

    代码优化概述. 通过对程序进行等价变换,使得从变换后的程序出发,能够生成更加有效的目标代码,这种变换我们叫做优化. 优化其实可以在编译的各个阶段进行,但最主要的一类优化是在目标代码生成以前,对语法分析 ...

  2. y-1.前端优化不完全

    前端优化不完全指南 历时144000000毫秒出山的前端优化篇,若你问我有什么感悟? 那我告诉你,看到毫秒啊,火箭啊,这些与优化相关的词,都有莫名的亲切感. 本文主要从工作效率.速度性能.稳定性.响应 ...

  3. 面试篇:前端优化整理

    故事背景 前端优化这种高概率出现的面试题,能背下来最好~技术小白的卤煮表示已经n多次听到大佬们面试会问到...... 作为一名前端开发工程师,前端逻辑上的优化可行性并不大,因为前端所涉及的逻辑相对于后 ...

  4. 经典编译器组成(前端+优化器+后端)以及LLVM和Clang简介

    目录 1,典型的编译器结构:前端+优化器+后端 2,LLVM 简介 3,Clang简介 1,典型的编译器结构:前端+优化器+后端 一个传统的静态编译器(比如C 编译器)最普遍的设计是分为三个部分,如下 ...

  5. 假如苏大强做前端优化

    前言 上周末将自己的阿里面试经历写成博文发布到掘金后,发现很多小伙伴都撸起袖子自己动手,撸起代码毫不含糊!我也很喜欢这种学习分享的氛围,但是公开地泄露名企笔试题目会产生一丝丝不好的影响,对于努力付出的 ...

  6. 前端优化系列之一:dns预获取 dns-prefetch 提升页面载入速度

    问题:怎么做到dns域解析? 用于优化网站页面的图片 问题:怎么提升网站性能? dns域解析,是提升网站的一个办法. DNS Prefetch,即DNS预获取,是前端优化的一部分. 一般来说,在前端优 ...

  7. 博问问题内容页面的前端优化

    写前端优化的文章在博客园高手云集的地方有点班门弄斧的感觉,不过自己对有些地方的处理还是自我感觉良好,也的确看到了效果,好了,闲话少说,切入正题. 首先划分页面的重要区域,如图: 由上图可知,对于一个问 ...

  8. 关于大型网站技术演进的思考(二十)--网站静态化处理—web前端优化—中(12)...

    Web前端很多优化原则都是从如何提升网络通讯效率的角度提出的,但是这些原则使用的时候还是有很多陷阱在里面,如果我们不能深入理解这些优化原则背后所隐藏的技术原理,很有可能掉进这些陷阱里,最终没有达到最佳 ...

  9. Web前端优化最佳实践及工具集锦

    摘要:前端的性能对于Web应用的用户体验来说非常重要.不要以为你的Web应用的性能已经足够好了,其实还会有很多可以提升的地方.本文将介绍Google和雅虎关于前端优化的最佳实践以及工具,你可以逐一检验 ...

最新文章

  1. Subsonic 基本使用
  2. Python基础知识(第十天)
  3. Android 异步消息处理机制(Handler 、 Looper 、MessageQueue)源码解析
  4. [ JavaScript ] 数据结构与算法 —— 链表
  5. web前端开发的好工具sublime
  6. 深入探讨编程到底需要知道多少数学知识
  7. centos7.4进入单用户模式
  8. Antd-Select组件的深入用法
  9. linux下串口程序测试
  10. canal下载 linux_阿里canal数据库同步ES使用
  11. how to solve undefined reference in igllib
  12. docker的bridge网络
  13. 内存卡linux系统格式化,SD卡无法格式化怎么办的解决方法
  14. excel制图小技巧
  15. Android中多次点击开发者模式的实现
  16. 巴菲特投资赚钱的赚钱宝典和赢家暗语
  17. 基于html + css + js完成淘宝网首页效果
  18. 西安网络安全周 | 联软科技:论端点安全在零信任体系中的重要性
  19. Specificity and sensitivity
  20. 基于封锁的并发控制机制

热门文章

  1. windows server 2003 连接 win10 共享打印机
  2. 两条完全相同的数据怎么用sql语句删除一条
  3. 顺丰菜鸟大战 本质是以数据获得企业竞争壁垒
  4. 用c语言写一个唐诗的程序,文言文编程95后又出新作,在287051行古诗中找出了“唐诗幻方”!...
  5. organici iherb2
  6. 冯唐:成大事者,必经的3个阶段
  7. SAP MM 因物料有负库存导致MMPV开账期失败问题之对策
  8. java中图片加载不出来的_请问图片加载不出来是为什么
  9. C语言实现,输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
  10. ubuntu下的python的diango环境安装