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

Recognizing if further expression execution can be skipped

我有这样的表情:

(a and b or c) and d

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

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

执行最外层的 (...) and d 没有意义,因为在 (a and b or c) return 之后整个表达式将为假假的。

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

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:

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

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

所以生成的字节 - and/or 机器代码不会包含任何 andor 指令,而只是一个条件分支。