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

时间:2010-10-03 00:04:52

标签: c# compiler-construction mono gmcs

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

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

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

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

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

更新(2010年10月23日)

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

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

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

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

2 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:3)

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