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

扩展Mono C#编译器:是否有任何文档或先例?,c#,compiler-construction,mono,gmcs,C#,Compiler Construction,Mono,Gmcs,我目前参与了一些有趣的编程语言研究,到目前为止,这些研究一直围绕着用一些非常强大的基于程序员生产力的特性扩展即将推出的Java 7.0编译器。这项工作应该同样适用于相关的编程语言,如C# 目前,我正在确定功能的C#端口原型的选择范围。我更喜欢开源选项,这样这项工作的成果就可以与尽可能广泛的受众分享。因此,Mono C#编译器似乎是最明显的起点。我是一名经验丰富的C#开发人员,因此编写代码不是问题。我主要关心的是以可维护和受支持的方式扩展编译器。在主题的单声道FAQ中,“单声道已经被用作试用C语言

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

目前,我正在确定功能的C#端口原型的选择范围。我更喜欢开源选项,这样这项工作的成果就可以与尽可能广泛的受众分享。因此,Mono C#编译器似乎是最明显的起点。我是一名经验丰富的C#开发人员,因此编写代码不是问题。我主要关心的是以可维护和受支持的方式扩展编译器。在主题的单声道FAQ中,“单声道已经被用作试用C语言的新思路的基础(有三或四个编译器源自Muno的C编译器)”。不幸的是,没有比这更进一步的指示了,到目前为止,谷歌搜索没有发现任何东西

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

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

如果您有任何关于扩展Mono C#编译器的想法或建议,我们将不胜感激

更新(2010年10月23日)

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

主要的承诺是:


如果有人对这个项目感兴趣,请让我知道

不幸的是,我无法充分回答你的问题,但是如果你看看Miguel de Icaza博客上的C#扩展示例,你会注意到它们都是以编译器补丁的形式出现的,而不是插件或扩展。这似乎表明没有这样的API

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

  • (这篇文章实际上明确提到了对这种语言扩展的可维护性的关注)
这些都是本地化的语法糖,没有“有趣”的行为。例如,第四个补丁为
IEnumerable
s实现了Cω的语法糖,但没有任何使该语法有趣的Cω语义。如果你看看这个补丁,你会发现它确实对
~T
进行了愚蠢的语法扩展→
IEnumerable
,与Cω相反,Cω中的成员访问和方法调用在流上正确提升

曾经被明确吹捧为解决此类可扩展性问题的解决方案,但现在似乎主要关注代码生成后端的IR级别的优化和分析。事实上,我甚至不确定这个项目是否还活着。

mono C#编译器有点像黑客。我花了大约一周的时间研究如何使用解析树中的信息。编译器不会产生任何中间表示,代码生成可能会破坏部分解析树。 尽管如此,解析器和标记器可能对您很有用,您只需从这里开始。 SharpDevelop还提供了一个。 SharpDevelop解析器比mono C#解析器更易于使用。
如果F#也适合你,我会推荐你。源代码比mono干净得多,并且在开源许可证下可用。

或者,请查看。编译器可扩展性是“包”的一部分。您可以找到另一个小补丁。也许为这些补丁创建一个目录是很好的。和@Jordão:+1分别用于您的有用链接。为了分享,这里有一个指向我个人博客帖子的链接:。附加的补丁是一个简单的黑客程序,允许插入方法体,这与我计划进行的AST/类型检查器修改有些不同,但仍然是一个有趣的实验。我已经开始研究可扩展性分支:我自己做了一些黑客程序,并同意您的评估。无论如何,我决定将其分支: