添加网站绑定主机名,wordpress用nginx,专做毕业设计的网站,上海奉贤 网站建设中间表达形式#xff08;IR#xff09; 编译器一般被分为前端和后端。 前端会对输入的程序进行词法分析、语法分析和语义分析#xff0c;然后生成中间表达形式#xff08;IR#xff09;#xff1b;后端对IR进行优化#xff0c;生成目标代码 不考虑解释执行的话#xf…中间表达形式IR 编译器一般被分为前端和后端。 前端会对输入的程序进行词法分析、语法分析和语义分析然后生成中间表达形式IR后端对IR进行优化生成目标代码 不考虑解释执行的话Java源码到最终机器码实际上进行了两轮编译 源码----Java字节码Java编译器Java字节码---- 机器码即时编译器 JIT不需要重新进行词法、语法、语义分析而是直接将Java字节码当做IR。
SSA IR
SSA静态单赋值 这种IR的特点是每个变量只能被赋值一次且只有在被赋值以后才能使用。
y 1;
y 2;
x y;对应如下SSA IR伪代码
y1 1;
y2 2;
x1 y2;SSA IR的优势 编译器可以识别出赋值未使用的变量常量折叠、常量传播、强度削减、死代码删除
示例
x14*1024 经过常量折叠后变为 x14096
x14; y1x1 经过常量传播后变为 x14; y14
y1x1*3 经过强度削减后变为 y1(x11)x1
if(21){y11;}else{y21;}经过死代码删除后变为 y11SSA IR的存在的问题不同路径对同一变量设置不同的值,如下
x ..;
if (x 0) {y 0;
} else {y 1;
}
x y;解决思路引入Phi函数根据不同执行路径选择不同的值
x1 ..;
if (x1 0) {y1 0;
} else {y2 1;
}
y3 Phi(y1, y2);
x2 y3;总之即时编译器会将 Java 字节码转换成 SSA IR。更确切的说是一张包含控制流和数据流的 IR 图每个字节码对应其中的若干个节点注意有些字节码并没有对应的 IR 节点。然后即时编译器在 IR 图上面进行优化。我们可以将每一种优化看成一个独立的图算法它接收一个 IR 图并输出经过转换后的 IR 图。整个编译器优化过程便是一个个优化串联起来的。
Sea of Nodes
HotSpot里的C2采用的是名为 Sea-of-nodes的SSA IR。它最大的特点是去除了变量的概念直接采用变量所指向的值来进行运算。