考虑算术表达式的语法规则E→E1-E2。生成的代码以具有单个用户寄存器的CPU为目标。减法运算要求第一个操作数位于寄存器中。如果E1和E2没有任何公共子表达式,则为了获得最短的代码
(A)应该先评估E1
(B) E2应该先评估
(C)对E1和E2的评估必须交错进行
(D) E1和E2的评估顺序无关紧要答案: (B)
解释:
E-> E1 – E2
鉴于E1和E2不共享任何子表达式,仅当在E1之前评估E2时,最优化使用单个用户寄存器来评估此生产规则。这是因为当我们在寄存器中评估E1时,E2已经被计算并存储在某个存储位置。因此,我们可以仅使用减法运算将用户寄存器作为第一个操作数,即根据指令使用某个索引寄存器或其他某种形式引用其存储位置中的E1和E2值。
因此,正确的答案应该是(B)应该首先评估E2。
此解决方案由Vineet Purswani贡献。
这个问题的测验