识别是否可以跳过进一步的表达式执行

时间:2017-10-28 19:22:39

标签: compilation compiler-construction virtual-machine evaluation

我有这样的表达:

(a and b or c) and d

我怎么认识到它的进一步执行没有意义。例如

a = 0, b = 1, c = 0, d = 1

执行最外层的 (...) and d 是没有意义的,因为(a and b or c)返回false后整个表达式将为false。

所以我试图找到一个允许我分析表达式的一般规则,并在此基础上找到执行对整个表达式至关重要的表达式部分,并在必要时跳过进一步执行。下面是基于堆栈的虚拟机的假设代码,表达式是从

开始
ld a
ld b
and
ld c
or
ld d
and

这就是我想要实现的目标:

ld a
ld b
and
ld c
or
jmpf outOfQuery ;;jump if false
ld d
and
outOfQuer:

1 个答案:

答案 0 :(得分:1)

当结果已由左操作数确定时,不评估布尔运算符的右操作数的概念称为短路。它通常通过将andor运算符编译为与条件表达式相同的代码来实现:

  • a and b等同于a ? b : false(或a ? b : a
  • a or b等同于a ? true : b(或a ? a : b

因此,生成的字节和/或机器代码不会包含任何andor指令,只会包含条件分支。