运营商相关性问题

时间:2010-07-13 01:17:19

标签: language-agnostic compiler-construction language-design

大多数二进制算术运算符在大多数情况下是左关联的 编程语言。但是,大多数编译器都可以自由评估 任意顺序的二元运算符的操作数。这些是 陈述矛盾吗?为什么或为什么不呢?

修改

这来自我正在阅读的书“编程语言语用学”第6章,练习6.1,我看到这本书在Steve Yegge的博客上得到了很好的推荐。所以我决定把它检查出来。

http://sites.google.com/site/steveyegge2/ten-challenges

3 个答案:

答案 0 :(得分:1)

嗯,不,他们并不矛盾,只是因为句子说的“最”: - )

在任何一种情况下,如果操作顺序不影响结果,编译器应该可以自由选择最有效的方法。无论你如何切片和切块,7 * 2总是等于2 * 7

考虑声明:

a = (b + 1) * (c + 2)

编译器可以选择是否使用:

(b + 1) * (c + 2)
(c + 2) * (b + 1)

甚至:

(b * c) + b + b + c + 2

只要结果相同(在预期的准确范围内)。

事实上,只要结果相同,即使是如下声明:

newval = 100 * PI * E / val * tot / 0.2

可以将其各个组件移动而不会出现问题。如果编译器可以用更快或更小的代码实现相同的目的,那么它应该。

语言标准倾向于指定必须达到某个结果,而不是如何达到该结果。

答案 1 :(得分:1)

事实证明,Associativity确定哪些子表达式是哪些运算符的参数。但它并不确定它们的评估顺序。

例如,左关联性将确定f(a) - g(b) - h(c)变为(f(a) - g(a)) - h(c)但它不确定是否f( a)将在g(b)之前进行评估。

答案 2 :(得分:0)

以相反的顺序评估二进制操作会发生什么?