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

Compilation 识别是否可以跳过进一步的表达式执行,compilation,compiler-construction,virtual-machine,evaluation,Compilation,Compiler Construction,Virtual Machine,Evaluation,我有这样的表达: (a and b or c) and d 我怎么知道它的进一步执行是没有意义的。例如当 a = 0, b = 1, c = 0, d = 1 执行最外层的操作是没有意义的。。。因为在a和b或c返回false之后,整个表达式将为false 所以我试图找到一个通用的规则,允许我分析表达式,并在此基础上,找到表达式中执行对整个表达式至关重要的部分,如果必要的话,跳过进一步的执行。下面是基于堆栈的虚拟机的假设代码,其表达式如下 ld a ld b and ld c or ld d

我有这样的表达:

(a and b or c) and d
我怎么知道它的进一步执行是没有意义的。例如当

a = 0, b = 1, c = 0, d = 1
执行最外层的操作是没有意义的。。。因为在a和b或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:

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

a和b相当于a?b:假的还是假的?b:a a或b相当于a?对:b还是a?a:b
因此,生成的字节和/或机器代码将不包含任何and或or指令,而只包含一个条件分支。

通常短路and和/或运算符只编译为条件分支x和y==如果x那么y else false,x或y==如果x那么true else y,不适用于and或or指令。这对于标量比较很好,但如果a、b、c或d是表达式,则您可能需要检查延迟或延迟计算以及短循环。1。为什么唐沃特?2. @sepp2k,你能把你的评论作为回复吗?我想把你的回答标记为解决方案,因为这正是我想要的。答案是短路