我们今天有一个编译器基础架构,它可以以并行模式运行其组件以提高编译速度吗?例如,当代码生成器开始发出目标平台的代码时,可能,编译器基础结构可以执行词法&同时对下一个源文件进行语法分析。我们在这个主题上有相关的研究吗?
UPD0:This是一个相对的答案。
答案 0 :(得分:2)
LLVM不执行多线程编译,但理论上它可能因为每个编译器传递只能改变某个范围'他们的。来自the docs:
根据传递的工作方式,您应该继承ModulePass,CallGraphSCCPass,FunctionPass或LoopPass,或RegionPass或BasicBlockPass类,这样可以为系统提供有关传递内容的更多信息,以及如何将其与其他通行证。 LLVM Pass Framework的一个主要特性是它根据你的pass所遇到的约束(它们从哪个类派生出来)来安排传递以高效的方式运行。
实际上,编译器传递中的细粒度并行性可能不值得同步的开销(并且当传递接触的次数超过其声称时不可避免的错误),因为可以编译大型程序中的各个源文件在平行下。不同的传递类主要用于文档。它们还可以以缓存友好的方式帮助调度传递;例如,当在所有翻译单元的函数上运行一堆FunctionPasses时,在移动到下一个函数之前,在一个函数上运行每个传递(保持在缓存中)会更快。
答案 1 :(得分:0)
我们的DMS软件再造工具包就是这样做的。
DMS是用于构建任意,自定义程序分析和转换工具的基础架构。它具有内置机制,支持完全无上下文的解析,符号表/控制流/数据流图构建,以及源级模式匹配和源到源转换。给定编程语言描述(BNF的组合,属性语法,支持符号表的语言特定事实集合,控制/数据流事实等),DMS将源文本解析为AST,并运行各种事实收集器(通常实现)作为属性语法)来构建经典的编译器数据结构。它适用于C,C ++ 14,Java 1.8和各种其他语言。
由于DMS的主要用例是用于整个程序分析和转换,因此性能很重要。因此,DMS是在并行编程PARLANSE中实现的,这使得细粒度不规则大小的任务并行性可用且高效(~50个机器指令开销,相当于fork和join,总计)[可以并行化的大块程序是很难找到]。一个在DMS应用程序中使用这种并行性取决于工具工程师,但它在很多地方都很容易使用。基线,DMS支持的所有数据结构都是并行安全的;许多内部算法在实际应用中并行实现。与语言前端相关联的属性语法很大程度上是功能性的;它们被编译为PARLANSE偏序并行结构。暴露的不规则并行性由工作窃取调度程序执行;程序员永远不会分配或安排线程。 [所有这些都在Windows的库存上运行]。
DMS使用并行性的一些地方:
我们没有做的是经典编译(目标代码的源代码)。没有任何理由我们无法并行执行此操作,但DMS的主要应用程序无法编译。我们看到很多编译器,并没有看到复制他们所做的很多重点。