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

时间:2016-03-14 13:52:19

标签: c# syntax compiler-construction abstract-syntax-tree short-circuiting

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

short circuit的规则一般都很简单:

  1. 如果and块中的一个组件返回false,则完整块将返回false并且可以退出执行
  2. 如果or块中的一个组件返回true,则完整块将返回true并且可以退出执行
  3. 因此,例如,这个简单的语句将被评估为以下语法树1 = 0 and 1 = 1

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

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

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

    修改

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

    非常感谢你!

1 个答案:

答案 0 :(得分:2)

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

  • left && right始终评估left,仅在right为真时评估left

  • left || right始终评估left,仅在right为假时评估left

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

因此,为了回答你的问题,编译器不会生成比“评估左操作数更有效的东西,然后仅在必须时评估正确的操作数”,因为其他任何东西都会违反语言规则。

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

PPS:C#编译器不评估AST,它从中生成代码。它是一个编译器,而不是一个解释器。