来自 Microsoft 的 Lisa Feigenbaum 在这里谈到了“编译器即服务”。我已阅读这将使构建重构工具变得更加容易。如何?Mono 的 CAAS很棒,但如果 Microsoft 版本类似,我看不出这个特定用例是如何完成的。
3 回答
“编译器即服务”意味着将编译器分解成单独的部分。
与其拥有一个大的单体黑盒子,源代码进入一端,编译的程序集从另一端出来,你会得到许多带有类型输出的较小(黑色)盒子。
因此,例如,您可以将源代码输入一个盒子,并从另一个盒子中获取抽象语法树 (AST)。然后可以在将这棵树输入优化器之前对其进行操作,从中得出代码的其他一些表示形式,可以将其输入编译器,然后编译器输出可执行代码。
由于我对未来 .NET 的“编译器即服务”部分的确切计划知之甚少,以上只是一个疯狂的猜测,但这就是我看到的可能性。
然后可以在 AST 上进行重构,我假设有一种方法可以通过映射和转换从 AST 回到原始源代码(映射意味着您可以在 AST 中获取一个节点并询问“哪个部分这个节点对应的源代码”,转换的意思是“在我修改它之后,请你给我这个 AST 现在代表的源代码”。)
例如,我会看到 JetBrains 和 DevExpress 都在为微软制作重构工具,他们不得不评估自己在编写代码以读取和挑选代码进行重构方面的努力,还是使用 CAAS 提供的代码。
Roslyn CTP 包含构建“代码操作”的演练,这是我们的术语,用于表示“快速修复”(如果它与代码有问题相关联)或重构(如果它是根据上下文提供的)。
如果您安装 Roslyn CTP,还请查看您将在 Visual Studio 中看到的 CodeRefactoring 项目模板。
我公司的(语义设计)提供“编译器即服务”: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 隐形轰炸机任务软件迁移)、大规模 C++重构工具、运行汽车工厂装配单元的代码生成工具,以及许多经典的软件工程工具(测试覆盖率、分析器、克隆检测、智能差异器)。它是重构工具的天然基础;我们正在研究这些:-}