扩展Mono C#编译器:有没有任何文档或先例?

Ric*_*ook 15 c# compiler-construction mono gmcs

我目前正在参与一些有趣的编程语言研究,到目前为止,该研究主要围绕使用一些非常强大的基于程序员生产力的功能扩展即将推出的Java 7.0编译器.该工作应同样适用于相关的编程语言,如C#.

我目前正在寻找原型化C#端口功能的选项.我更喜欢开源选项,以便可以与最广泛的受众分享这项工作的成果.因此,Mono C#编译器似乎是最明显的起点.我是一位经验丰富的C#开发人员,所以编写代码不是问题.我主要关心的是以可维护和支持的方式扩展编译器.在关于这个主题的单声道常见问题解答(链接)中,声称"Mono已被用作尝试C#语言的新思想的基础(有三个或四个编译器派生自Mono的C#编译器)".不幸的是,没有比此更多的指示,到目前为止,谷歌的搜索还没有任何改变.

我想知道是否有任何人有这方面的任何信息.是mcs/ gmcs/ dmcs有一个标准的可扩展性模型?具体来说,我将在程序的抽象语法树上执行一些有趣的转换.是否有一种标准机制,用于在抽象语法树生成和类型检查器之间插入功能到编译器链中,然后生成代码?

到目前为止,我已经为代码编写了一些特别的扩展(主要是在代码生成器中),但这似乎不是一个可维护的解决方案,特别是考虑到我打算让我的扩展更新为Git主干单声道尽可能多.此外,能够更新我的扩展,而不必每次进行更改时都重新编译整个编译器,这将是很好的.我希望能够将我的所有AST操作包装到一个可由mcs/ gmcs/ 动态加载的.NET程序集中,dmcs而不必直接破解核心编译器代码.

任何有关扩展Mono C#编译器的想法或指示都将非常感激!

更新(2010年10月23日)

在回答我的问题时,我决定开始研究Mono的一个分支,以便为编译器创建一个简单的可扩展性模型.这是在它的早期阶段,但它在GitHub:

http://github.com/rcook/mono-extensibility

主要提交是:http://github.com/rcook/mono-extensibility/commit/a0456c852e48f6822e6bdad7b4d12a357ade0d01

如果有人有兴趣合作这个项目,请告诉我!

Jör*_*tag 3

不幸的是,我无法充分回答您的问题,但如果您查看 Miguel de Icaza 博客上的 C# 扩展示例,您会发现它们全部采用编译器补丁的形式,而不是插件或扩展。这似乎表明没有这样的API。

\n\n

请注意,所有这些示例的范围都比您正在处理的范围小得多:

\n\n\n\n

这些大多是本地化的语法糖,没有“有趣”的行为。例如,第四个补丁实现了 C\xcf\x89\ 的 s 语法糖IEnumerable,但没有任何使该语法变得有趣的 C\xcf\x89\ 语义。如果您查看该补丁,您会发现它实际上对~T→进行了愚蠢的语法扩展IEnumerable<T>,这与 C\xcf\x89 不同,在 C\xcf\x89 中,成员访问和方法调用是通过流正确提升的。

\n\n

微软研究院的 Phoenix Compiler Pipeline曾经被明确吹捧为此类可扩展性问题的解决方案,但现在看来它主要侧重于代码生成后端中 IR 级别的优化和分析。事实上,我什至不确定该项目是否仍然存在。

\n

  • 您可以在[此处](http://evain.net/blog/articles/2010/08/09/a-river-of-t)找到另一个小补丁。也许创建这些补丁的目录是件好事。 (2认同)