我想使用一些工具(免费更好)或语言来帮助我完成以下两项任务:
任务1:
1.读取用户提供的规范文件(文本文件)作为输入。对于用户来说,规范文件的格式是由我设计的,用户必须遵循它
2.使用规范输入生成AST(抽象语法树)
3.通过应用一些优化技术将AST转换为另一个AST,例如循环优化,阻塞或我想要的任何其他优化。 (可选步骤)
4.将转换后的AST导出到源代码文件(C程序文件)
任务2:
1.读取源代码文件(C程序文件)并生成AST来表示它
2.通过应用一些优化技术将AST转换为另一个AST,例如循环优化,阻塞或我想要的任何其他优化。 (对于某些优化,我可以参数化它,例如循环展开深度。)
3.将转换后的AST导出到另一个优化的源文件(C程序文件)。
答案 0 :(得分:2)
OP一般想要的是program transformation system (PTS)。 PTS通常能够接受任意语法规范,构建一个从该语法生成AST的解析器,应用源到源转换将解析后的AST映射到其他AST,然后从最终AST重新生成源文本。
OP的一个特定问题是解析/解析C源代码。几乎所有可用的PTS都不能用于生产C代码(ANSI,GCC,MSStudio),要做到这一点,还有很多工作要做。它们也不提供进行有趣转换所需的辅助分析,例如符号表,控制或数据流分析。
据我所知,只有我们的DMS Software Reengineering Toolkit和Rose Compiler对此有特定的支持。
然而,罗斯并不是为接受DSL而设计的;它不允许任意语法定义,从而违反了PTS模型。相反,它使用EDG解析器前端(我认为这意味着它也接受C ++ 14)。但它无法轻易处理OP的第一个请求。罗斯也做了“源到源”#34;转换,但是通过手工编写的爬行AST的过程代码来实现。它专注于科学计算,因此他们已经完成了阻塞循环等方面的具体工作。DMS旨在接受任意语法(并处理C语言和C ++ 14),实际上可以同时处理多个语法,因此它将直接支持OP的第一个任务。 DMS执行表面语法(直接使用C语法编写)源到源重写以及过程重写。它尚未用于循环阻塞,但DMS已用于构建C ++的向量扩展,并为SIMD指令生成代码,包括适当的循环优化。
答案 1 :(得分:0)
POET(经验调整的参数化优化,http://www.cs.uccs.edu/~qyi/poet)脚本语言是一个候选者。还有其他工具或语言吗?