首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >扩展Mono C#编译器:是否有任何文档或先例?

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

Stack Overflow用户
提问于 2010-10-03 08:04:52
回答 2查看 921关注 0票数 15

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

我目前正在研究对该功能的C#端口进行原型设计的选项。我更喜欢开源的选择,这样就可以与尽可能广泛的受众分享这项工作的成果。因此,Mono C#编译器似乎是最明显的起点。我是一名经验丰富的C#开发人员,所以编写代码不是问题。我主要关心的是以一种可维护和受支持的方式扩展编译器。在Mono关于这个主题的常见问题解答(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

如果有人有兴趣在这个项目上合作,请让我知道!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-10-03 10:13:44

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

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

  • Parameterless Anonymous Methods (这篇文章实际上明确提到了对这种语言extensions)
  • String Interpolation
  • Destructuring Assignment for Tuples
  • Syntactic Sugar for IEnumerable

的可维护性的担忧

这些大多是本地化的语法糖,没有“有趣”的行为。例如,第四个补丁为IEnumerable实现了Cω的语法糖,但没有任何C→的语义,这些语义使这种语法变得有趣。如果你看了这个补丁,你会发现它确实做了愚蠢的语法扩展,而不是Cω,后者的成员访问和方法调用被适当地提升到流上。

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

票数 3
EN

Stack Overflow用户

发布于 2010-10-10 00:33:53

单声道C#编译器有点像黑客。我花了大约一周的时间来弄清楚如何使用解析树中的信息。编译器不会产生任何中间表示,代码生成可能会破坏解析树的一部分。尽管如此,解析器和记号赋予器可能会证明对您很有用,您可以直接从那里开始。SharpDevelop还提供了一个C# parser。SharpDevelop解析器比单声道C#解析器更容易使用。如果F#也适用于你,我会推荐你。源代码比mono干净得多,并且可以在开源许可证下使用。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3848001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档