当前位置: 首页 > Web前端 > HTML

day19TurboFan是如何利用图来优化JS编译的?(下)

时间:2023-03-27 23:35:10 HTML

前端主要做词法、语法、语义的分析。中台会做相关的优化工作分析:变量类型和范围优化:根据节点海优化后端部分生成目标代码。如何使用TurboFanFigure做JS编译优化?(上)优化:基于节点海的优化方案1:不断推进,简化计算在不断推进中,比较经典的优化是常量折叠(constantfolding),顾名思义就是把常量加在一起,这样如在第一个例子中,我们直接将3+5的运算折叠成8。在简化计算中,一个比较有代表性的例子是强度缩减。比如下面第二个例子,x+0和x没有区别,所以可以化简为x。例如,在下面的第三个示例中,您可以将x*4更改为类似x<<2的移位操作。方案二:去重计算在去重计算中,最常见的就是对值进行编号。这意味着相同的数字在系统中分配给相同的值。比如sin、addition、LoadField运算结果相同时,只记录一次。解决方案3:控制流优化控制流有许多不同的优化方法。下面是几个示例,包括分支折叠、合并缩减和控制缩减。通过这几个例子我们可以看到,无论是流程本身,还是流程中的分支合并,经过优化后都简化了很多。降低:语言级别TurboFan的Tubolizer会使用不同的颜色来表示不同类型的节点。包括代表值的浅蓝色节点、代表流程的黄色节点、代表操作的深蓝色语言节点。除了深蓝色,还有两个语言节点,一个是上面红色的JavaScript语言节点,还有一个是更接近底层机器语言的绿色节点。基本上,级别越高,人类的可读性就越高;层次越低,越接近机器语言。我们称之为从高到低的过程降低。因此,优化的过程也将是一个不断降减的过程。后端优化:指令的排序和注册指令SoN节点海最终的排序结果会放入一个CFG(ControlFlowGraph)程序控制图中。这里有三个概念,第一个是控制和支配,第二个是降低存储压力,第三个是循环优化。控制支配首先,我们来看第一点。在这个过程中,我们首先将phi和参数等固定节点放入CFG中。之后会使用支配树计算支配关系,然后根据支配关系从SoN节点海中输出剩余的节点,输入到CFG程序控制图中。在降低存储压力和支配树排序之后,节点海完全变成了一个程序控制图。循环优化试图在这个过程中尽可能地改进循环中的代码。这个过程叫做LoopInvariantCodeMotion,也就是我们常说的提升。InstructionSelectInstructionSelect可以和maxengulf一起使用。但实际上,指令选择的顺序与程序控制图相反,即目标的位置从基本块的底部移动到顶部。经过寄存器分配的分析和优化,在编译过程的后端,最终必须生成机器码。在这个过程中,其中一个主要任务就是寄存器的分配。TurboFan使用线性扫描分配器和实时范围分区来分配寄存器和插入溢出代码。SSA形式可以在寄存器分配之前或之后通过显式移动进行解构。寄存器分配的结果是用真实寄存器代替虚拟寄存器的使用,并在指令之间插入溢出代码。极客时间《Jvascript进阶实战课》学习笔记Day19