有人认为,在中间表示(IR)中显式建模并发是一项必要的要求。因此,一个答案将是:“任何用于顺序程序的IR都需要添加一些并发操作”,例如“ fork and join”,“ parallel x y”。添加这些使得可以推理某种并发,但不一定很容易。如何确保某些属性(数据争用自由度)而又不一直使用完整的功能表示(这使得很难有效地建模并行性)也不是显而易见的。
有争议的彩色Petri网(CPN)是表示并发程序的不错选择。(CPN中的令牌是“有颜色的” [具有类型],并且可以携带值;将“状态”转换为状态可以对传入的令牌执行任意算术,以在“位置”中生成计算值的可能不同颜色的令牌)。如果将场所视为建模结果的计算结果和转换(包括用于访问内存的特殊运算符),那么这将为您提供一个数据流图,可以用来对程序进行建模。您可以轻松地使用它来对经典的编译器表示形式(例如,三元组[operator,input1,input2,output])进行正式解释。
有很多工具可以分析此类CPN图,包括计算属性,例如无死锁,位置中令牌计数的有界性等。分层CPN使您可以对函数和过程以及“调用”的概念进行建模。
这些表示方式并没有明确地做的是,使人们很容易推断出可以在哪里并行化应用程序。琐碎地讲,如果两个子计算没有共享操作数的副作用,那么它们可以是并行的(这就是为什么有些人喜欢功能程序/表示的原因)。如果您的程序表示模型对共享内存进行建模,则可以将其建模为整体,并获得有关共享内存上交互作用(包括别名寻址等)推理的常见问题集。避免这种情况的一种方法是将内存视为带有较大的程序状态是其中的一些(树状)组合;您可以说可以在中间表示形式中传递这些块。如果两个并行计算不共享块(例如,内存子树),则它们之间没有交互。