2011-03-16 49 views
0

我需要创建类似OpenMP的(#pragma语句)C语言扩展,通过将具有编译指示代码的C转换为具有动态库调用的C代码。这不是简单地扩展编译指示,也需要做数组线性化,新变量声明等。所以我正在寻找一个源代码到源代码的工具。类似OpenMP的语言编译器

我发现了一些线索:TXL,JetBrains MPS,元环境,Stratego/XT,Rose,DMS。有谁能解释一下它们之间的区别,它们的优点和缺点吗?任何建议我都会很有帮助。

回答

2

我是背后的人DMS。你可能会发现我的回答有偏见。

所有这些工具共享源到源转换的基础知识。他们解析了一些源语言(可以通过各种形式的语法定义到工具),构建树,允许您编写代码以导航/检查/修改树,然后将树打印到文本字符串中打算成为某种可编译的代码。

  • JetBrains MPS:我对此知之甚少。我认为你必须编写程序代码爬过树。这是处理树木的经典编译器技术。我不相信它可以解析开箱即用的C语言,更不用说OpenMP原语了,并且您会发现很多工作都是正确的。

  • MetaEnvironment:我对这个工具一无所知。高概率赌注:不解析C.

  • TXL:它具有模式匹配和代码实例化语言,使用树上的函数实现。这些函数可以模式匹配来拾取并递归到子树中,并将树结果从被调用的函数组装到更大的树中,最终生成最终的树。这些模式使用源语法模式编写,这使得它们相当容易编写。 TXL无法以一种明显的方式进行代码分析,以供后面的代码生成操作使用。有一种方法可以做到这一点:在一个功能通道中构建包含分析的辅助树,并通过另一个功能性通过结果生成辅助树;这显然是一种常见的TXL技术。 TXL可能有一个可用的C语言分析器,但它可能只适用于预处理的C代码;你可以弯曲这个来处理OpenMP语法,而不会遇到大量的麻烦。它不会有一个方便的符号表,使您能够查找标识符的含义,如果您想以任何有趣的方式转换C,您将需要这些标识符。 Stratego/XT:此工具通过将源代码重写为源代码,使用“策略”,即顺序操作,允许工具在重写成功应用或失败时上下移动树。这种策略方案允许在树中的一个点收集的信息被传送到远处的其他点。和TXL一样,我很肯定你可以找到一个预处理C代码的解析器。和TXL一样,我不认为你会得到一个符号表或任何其他深层的代码分析。 Rose:该工具使用EDG的前端来预处理/解析C和C++代码并构建AST;我认为EDG前端也会构建符号表。您似乎想要创建一个解析器的自定义版本来添加“类OpenMP”基元;我不认为你可以用Rose做到这一点,因为我不相信EDG前端可以以源代码的形式提供给你破解。底盘是用C++编写的;您可以编写程序访问者来爬过代码并构建新的树节点。它有一个神秘但可行的方案来处理源代码模式:它将它们转换成有效的,微小的“主”C++程序,将它们传递给C++分析器,并在剥离主程序外壳后返回生成的树。LLNL使用Rose来研究科学规范,并可能接近你所需要的;如果它的解析器不处理OpenMP,我会感到惊讶,因为这是该社区中的一项关键技术。罗斯还提供了一些控制和数据流分析,但我不知道他们有多复杂;它确实使玫瑰脱颖而出。

  • DMS:此工具旨在操纵任意编程语言。它提供解析,漂亮打印,符号表构造,控制流和数据流分析,以及本地和全球的点对点分析。 DMS有完整的C front endC++ front end完成预处理器,解析和符号表结构。 C前端完成了完整的流程分析(以上所有内容); C++前端还没有进行流分析,但我们正在研究它。 所有DMS前端均以源代码形式提供,以便可以对其进行自定义,例如添加自定义OpenMP扩展。 DMS已被用于C系统的全局分析,包含19,000个编译单元,以及代码生成和从大型系统中提取C API。它已被用于重新构建巨大的C++源代码库。这是一个工业强度的工具。在这一点上,Rose对C++转换可能会更好一些;对于语言的广度,支持分析和转换的机制的范围以及它所应用的各种任务,DMS远远好于玫瑰恕我直言。

您可以看到更多detailed comparison of a variety of parsing/transformation tools,包括上面的大部分内容。