编译器即服务:如何构建重构工具?

时间:2011-05-16 16:32:10

标签: c# compiler-construction mono compiler-as-a-service roslyn

微软的Lisa Feigenbaum谈到“编译器即服务”here。我已经读过这将使构建重构工具变得更容易。怎么样? Mono's CAAS很棒,但如果Microsoft版本相似,我看不出这个特定用例是如何完成的。

3 个答案:

答案 0 :(得分:6)

“编译器即服务”意味着将编译器分解为单个部分。

不是有一个大的单片黑盒子,其中源代码进入一端而编译的组件从另一端出来,你会得到许多带有类型输出的小(黑色)盒子。

因此,您可以将源代码提供到一个框中,然后从另一个框中获取抽象语法树(AST)。然后可以在将该树输入优化器之前对其进行操作,其中包含代码的其他表示形式,可以将其提供给编译器,然后编译器输出可执行代码。

由于我对未来.NET的“编译器即服务”的确切计划了解不多,以上只是一个疯狂的猜测,但这就是我看到的可能性。

然后重构可以在AST上运行,我会假设有一种方法可以从AST返回原始源代码,通过映射和转换(映射意味着你可以在AST中获取一个节点并询问“源代码的哪一部分使这个节点对应于“,转换意味着”你可以在我修改它之后给我这个AST现在代表的源代码“。)

例如,我会看到JetBrains和DevExpress都为Microsoft制作重构工具,不得不评估自己在编写代码时所做的努力,这些代码读取和选择用于重构的代码与使用CAAS提供的代码。

答案 1 :(得分:4)

Roslyn CTP包含walkthrough用于构建“代码操作”,这是我们的术语,可以是“快速修复”,如果它与代码的错误相关联,或者重构,如果它是在上下文中提供的。

另请查看CodeRefactoring项目模板,如果安装Roslyn CTP,您将在Visual Studio中看到该模板。

答案 2 :(得分:1)

我公司(Semantic Designs)提供“编译器即服务”:DMS Software Reengineering Toolkit

DMS对于计算机(任何正式)语言都是通用的。鉴于语言描述(DMS具有针对C ++,C#,Java,PHP,COBOL和许多其他语言的强大版本),DMS可以将源解析为AST,并从这些AST重新生成有效源,包括原始注释。

DMS提供各种分析器引擎,包括可配置属性评估,流分析,迭代求解器,use-def分析,局部和全局调用图构建以及全局点到分析。 AST可以通过过程代码(经典编译器树黑客)或源到源转换来修改。转换可以将一种语言的AST映射到同一种语言(“优化”)或其他语言(“细化/翻译”)。这是非常成熟的基础设施,其背后有超过15年的持续工程。

您可以通过选择/定义所需的输入/输出语言集来使用DMS,并构建使用面向编译器的DSL编写的自定义代码(由DMS编译以生成所需的工具!)以调用DMS机器的各个位。实现你的目的。

DMS已被用于构建语言迁移工具(参见B-2 Stealth Bomber mission software migration),大规模C ++ re - 建筑工具,运行汽车工厂装配单元的代码生成工具,以及许多经典软件工程工具(测试覆盖,分析器,克隆检测,智能差分器)。它是重构工具的自然基础;我们正在研究这些: - }