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

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

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

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

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

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

更新(2010年10月23日)

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

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

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

如果有人对此项目的合作感兴趣,请告诉我!

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

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

  • 无参数匿名方法 (这篇文章实际上明确提到了对这种语言扩展的可维护性的担忧)
  • 字符串插值
  • 元组的解构分配
  • IEnumerable语法糖

这些大多是局部的语法糖,没有“有趣”的行为。 例如,第四个补丁为IEnumerable s实现了Cω的语法糖,但没有任何Cω的语义使这个语法变得有趣。 如果你查看补丁,你可以看到它实际上是愚蠢的语法扩展~TIEnumerable ,而不是Cω,其中成员访问和方法调用在流上正确解除。

微软研究院的Phoenix Compiler Pipeline曾经被明确地吹捧为这种可扩展性问题的解决方案,但它现在似乎主要集中在代码生成后端的IR级别上的优化和分析。 事实上,我甚至不确定该项目是否还活着。

单声道C#编译器有点像黑客。 我花了大约一周的时间来弄清楚如何使用解析树中的信息。 编译器不会产生任何中间表示,代码生成可能会破坏解析树的某些部分。 仍然,解析器和标记器可能对您有用,您只需从那里获取它。 SharpDevelop还提供了一个C#解析器 。 SharpDevelop解析器比单声道C#解析器更容易使用。 如果F#也适合你,我建议。 源代码比单声道更清晰,可在开源许可下使用。