准备语法树(ast)轻松进行短路操作
Prepare syntax tree (ast) to easily perform short circuit operations
准备包含条件的语法树以允许轻松快速地使用 short curcuit
的最佳方法是什么?
总的来说short circuit
的规则很简单:
- 如果
and
块中的一个组件 return 为假,则整个块将 return 为假并且可以退出执行
- 如果
or
块中的一个组件 return 为真,则整个块将 return 为真并且可以退出执行
例如,这个简单的语句将被评估为以下语法树 1 = 0 and 1 = 1
:
and
/ \
= =
/ \ / \
1 0 1 1
在这种情况下很容易。执行树的第一部分(分支)后,
执行将退出它只能 return false。但是如果树变得更多
复杂,必须有一种方法可以更有效。或者这已经是最
有效的方法?
例如,在这种情况下,c#
编译器如何评估语法树?
编辑
我是否应该将所有条件写在一个简单的列表中,如果 true
或 false
不可能则跳转到最后?所以我最后没有 and
和 or
部分?
非常感谢大家!
您对短路的定义与 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,而是从中生成代码。它是编译器,不是解释器。
准备包含条件的语法树以允许轻松快速地使用 short curcuit
的最佳方法是什么?
总的来说short circuit
的规则很简单:
- 如果
and
块中的一个组件 return 为假,则整个块将 return 为假并且可以退出执行 - 如果
or
块中的一个组件 return 为真,则整个块将 return 为真并且可以退出执行
例如,这个简单的语句将被评估为以下语法树 1 = 0 and 1 = 1
:
and
/ \
= =
/ \ / \
1 0 1 1
在这种情况下很容易。执行树的第一部分(分支)后, 执行将退出它只能 return false。但是如果树变得更多 复杂,必须有一种方法可以更有效。或者这已经是最 有效的方法?
例如,在这种情况下,c#
编译器如何评估语法树?
编辑
我是否应该将所有条件写在一个简单的列表中,如果 true
或 false
不可能则跳转到最后?所以我最后没有 and
和 or
部分?
非常感谢大家!
您对短路的定义与 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,而是从中生成代码。它是编译器,不是解释器。