例如,上述源程序中,赋值语句的语义为:计算赋值号右边表达式的值,并把它送到赋值号左边的变量所确定的内存单元中。语义分析时,先检查赋值号右边表达式和左边变量的类型是否一致,然后再根据赋值语句的语义,对它进行翻译可得到如下形 式的四元式中间代码: ( 1 ) ( * , 2 , 3.1416 , T 1 ) (2 ) ( * , T 1 , r , T 2 ) (3 ) ( + , h , r , T 3 ) (4 ) ( * , T 2 , T 3 , T 4 ) (5 ) ( = , T 4 , —, s ) 其中, T 1 , T 2 , T 3 , T 4 是编译程序引进的临时变量,存放每条指令的运算结果。上述每一个四元式所表示的语义为: 2 * 3.1416 ⇒ T 1 T 1 * r ⇒ T 2 h + r ⇒ T 3 T 2 * T 3 ⇒ T 4 T 4 ⇒ s 这样,我们将源语言形式的赋值语句翻译为四元式表示的另一种语言形式,这两种语言在结构形式上是不同的,但在语义上是等价的。
第 4 阶段 代码优化 代码优化的任务是对前阶段产生的中间代码进行等价变换或改造,以期获得更为高效的,即省时间和空间的目标代码。优化主要包括局部优化和循环优化等,例如上述四元式经局部 优化后得: ( 1 ) ( * , 6.28 , r , T 2 ) (2 ) ( + , h , r , T 3 ) (3 ) ( * , T 2 , T 3 , T 4 ) (4 ) ( = , T 4 ,—, s ) 其中,2 和 3.1416 两个运算对象都是编译时的已知量,在编译时就可计算出它的值 6.28 ,而不必等到程序运行时再计算,即不必生成( * ,2 , 3.1416 , T 1 )的运算指令。