识别是否可以跳过进一步的表达式执行
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:
当结果已由左操作数确定时,不评估布尔运算符的右操作数的概念称为短路。它通常通过将 and
和 or
运算符编译为与条件表达式相同的代码来实现:
a and b
等同于 a ? b : false
(或 a ? b : a
)
a or b
等同于 a ? true : b
(或 a ? a : b
)
所以生成的字节 - and/or 机器代码不会包含任何 and
或 or
指令,而只是一个条件分支。
我有这样的表情:
(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:
当结果已由左操作数确定时,不评估布尔运算符的右操作数的概念称为短路。它通常通过将 and
和 or
运算符编译为与条件表达式相同的代码来实现:
a and b
等同于a ? b : false
(或a ? b : a
)a or b
等同于a ? true : b
(或a ? a : b
)
所以生成的字节 - and/or 机器代码不会包含任何 and
或 or
指令,而只是一个条件分支。