15

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

我目前正在研究为功能的 C# 端口设计原型的选项。我更喜欢开源选项,以便可以与最广泛的受众分享这项工作的成果。因此,Mono C# 编译器似乎是最明显的起点。我是一位经验丰富的 C# 开发人员,因此编写代码不是问题。我主要关心以可维护和受支持的方式扩展编译器。在有关该主题的 Mono 常见问题解答(链接)中指出,“Mono 已被用作尝试 C# 语言新想法的基础(从 Mono 的 C# 编译器派生的三个或四个编译器)”。不幸的是,没有比这更进一步的指示,到目前为止,谷歌搜索还没有出现任何结果。

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

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

任何关于扩展 Mono C# 编译器的想法或建议都将不胜感激!

更新(2010 年 10 月 23 日)

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

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

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

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

4

2 回答 2

3

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

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

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

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

于 2010-10-03T02:13:43.977 回答
3

单声道 C# 编译器有点 hack。我花了大约一周的时间弄清楚如何使用解析树中的信息。编译器不会产生任何中间表示,并且代码生成可能会破坏分析树的某些部分。尽管如此,解析器和标记器可能对您有用,您只需从那里获取它。SharpDevelop 还提供了一个C# 解析器。SharpDevelop 解析器比单声道 C# 解析器更易于使用。如果 F# 也适合你,我会推荐。源代码比单声道干净得多,并且在开源许可下可用。

于 2010-10-09T16:33:52.777 回答