我试图更好地理解编译器能够代表程序员对并发做出明智选择的要求。我意识到例如这个问题有很多困难的方面:
- 确保没有比赛条件
确保要同时运行的代码不会产生影响代码语义的副作用
给定代码中可用的并行度,确定是否有必要分散线程的开销
我的理解是,现代编译器中使用的两个主要中间表示形式是面向过程和面向对象语言的静态单一分配,以及面向功能语言的延续传递样式。使用这些中间形式似乎很难对上面列出的任何问题进行推理。即使是理论上应该在自动并行化方面机会最大的语言(诸如Haskell这样的纯功能语言,也没有副作用)在这方面也取得了有限的进展。
所以我的问题是,实际上使用了哪些中间表示来尝试解决该问题?我还不知道还有其他一些学术研究中使用的表示形式更适合此任务吗?这个问题是否是编译器前端必须从根本上通过在编译到达中间表示之前操纵抽象语法树来解决的问题?