准备语法树(ast)轻松进行短路操作

Prepare syntax tree (ast) to easily perform short circuit operations

准备包含条件的语法树以允许轻松快速地使用 short curcuit 的最佳方法是什么?

总的来说short circuit的规则很简单:

  1. 如果 and 块中的一个组件 return 为假,则整个块将 return 为假并且可以退出执行
  2. 如果 or 块中的一个组件 return 为真,则整个块将 return 为真并且可以退出执行

例如,这个简单的语句将被评估为以下语法树 1 = 0 and 1 = 1:

       and
    /      \
   =        =
 /  \      /  \
1    0    1    1

在这种情况下很容易。执行树的第一部分(分支)后, 执行将退出它只能 return false。但是如果树变得更多 复杂,必须有一种方法可以更有效。或者这已经是最 有效的方法?

例如,在这种情况下,c# 编译器如何评估语法树?

编辑

我是否应该将所有条件写在一个简单的列表中,如果 truefalse 不可能则跳转到最后?所以我最后没有 andor 部分?

非常感谢大家!

您对短路的定义与 C# 和其他语言的定义不完全一致。在大多数(可能是所有)具有短路行为的语言中,行为仅取决于左操作数的值,即:

  • left && right 始终计算 left 并且仅在 left 为真时计算 right

  • left || right 始终计算 left 并且仅在 left 为假时才计算 right

所以语言规则保证永远不会先尝试正确的操作数,即使编译器可能认为先尝试正确的操作数会更有效率。这样你就知道 list == null || list.IsEmpty() 永远不会抛出空指针异常。

所以为了回答你的问题,编译器不会生成比 "evaluate the left operand and then evaluate the right operand only if you have to" 更有效的东西,因为其他任何东西都会违反语言规则。

PS:理论上,如果编译器可以证明它们没有任何副作用,则编译器可以重新排序操作数,但据我所知,这还没有完成.无论哪种方式,在 AST 级别都不会发生。

PPS:C# 编译器不计算 AST,而是从中生成代码。它是编译器,不是解释器。