在存在多个线程的情况下,某些编译器优化是否无效?

时间:2017-06-13 15:44:15

标签: multithreading compiler-construction language-agnostic compiler-optimization

例如,假设我们有类似下面的代码,其中d是一个字典或其他索引非常重要的数据结构:

x = d[a]
y = d[b]
z = (x + y) * (x + y)
return z + d[a]

优化编译器是否可以有效地将最后一行更改为return z + x

如果是这样,在存在多个线程时此优化是否无效?当这个线程正在计算z的值时,如果另一个线程改变d[a]的值(甚至是类型)会发生什么?

1 个答案:

答案 0 :(得分:0)

问题合并多个。

1:主题

在运行时创建。因此,编译器可能不知道存在多少线程。他们假设任何时候都可能存在多个线程。因此,优化集不受程序级别的线程数的影响。但是,它在编译器级别受到影响。编译器必须考虑数据竞争的威胁。至少对于较旧的编程语言。在现代编程语言技术中,这个问题涉及静态类型系统的强度[见Rust] functional purity

2:即使在确保没有线程的情况下,您具体提到的优化类型也很难看。在其完整的通用性[“非平凡索引”]中:它要求优化器识别表达式之间的相等性。我怀疑大多数编译器都没有这样做,因为它的运行时间要求。