我目前正在参与一些有趣的编程语言研究,到目前为止,这些研究的重点是通过一些非常强大的基于程序员生产力的功能来扩展即将推出的 Java 7.0 编译器。这项工作应该同样适用于 C# 等相关编程语言。
我目前正在研究用于对该功能的 C# 端口进行原型设计的选项。我更喜欢开源选项,以便可以与最广泛的受众分享这项工作的成果。因此,Mono C# 编译器似乎是最明显的起点。我是一名经验丰富的 C# 开发人员,因此编写代码不是问题。我主要关心以可维护和受支持的方式扩展编译器。在有关该主题的 Mono 常见问题解答中(link http://www.mono-project.com/FAQ%3a_Technical)其中指出“Mono 已经被用作尝试 C# 语言新想法的基础(有三四个编译器源自 Mono 的 C# 编译器)”。不幸的是,没有比这更多的线索了,到目前为止,谷歌搜索还没有找到任何结果。
我想知道是否有人有这方面的信息。做mcs
/gmcs
/dmcs
有标准的可扩展性模型吗?具体来说,我将对程序的抽象语法树执行一些有趣的转换。是否有一种标准机制可以将功能插入到抽象语法树生成和类型检查器以及代码生成之间的编译器链中?
到目前为止,我已经为代码编写了一些临时扩展(主要在代码生成器中),但这似乎不是一个可维护的解决方案,特别是考虑到我打算使我的扩展与 Git 主干保持同步尽可能单声道。此外,如果能够更新我的扩展,而不必每次进行更改时都重新编译整个编译器,那就太好了。我希望能够将所有 AST 操作包装到一个 .NET 程序集中,该程序集可以通过以下方式动态加载:mcs
/gmcs
/dmcs
无需直接破解核心编译器代码。
任何关于扩展 Mono C# 编译器的想法或指示将不胜感激!
更新(2010 年 10 月 23 日)
为了回答我的问题,我决定开始研究 Mono 的一个分支,以便为编译器创建一个简单的可扩展性模型。它还处于早期阶段,但它位于 GitHub 上:
http://github.com/rcook/mono-extensibility http://github.com/rcook/mono-extensibility
主要提交是:http://github.com/rcook/mono-extensibility/commit/a0456c852e48f6822e6bdad7b4d12a357ade0d01 http://github.com/rcook/mono-extensibility/commit/a0456c852e48f6822e6bdad7b4d12a357ade0d01
如果有人有兴趣合作这个项目,请告诉我!
不幸的是,我无法充分回答您的问题,但如果您查看 Miguel de Icaza 博客上的 C# 扩展示例,您会发现它们全部采用编译器补丁的形式,而不是插件或扩展。这似乎表明没有这样的API。
请注意,所有这些示例的范围都比您正在处理的范围小得多:
-
无参数匿名方法 http://themonkeysgrinder.blogspot.com/2009/07/cer.html(这篇文章实际上明确提到了对此类语言扩展的可维护性的担忧)
- 字符串插值 http://tirania.org/blog/archive/2009/Dec-20.html
- 元组的解构赋值 http://tirania.org/blog/archive/2009/Dec-23.html
- 语法糖IEnumerable http://evain.net/blog/articles/2010/08/09/a-river-of-t
这些大多是本地化的语法糖,没有“有趣”的行为。例如,第四个补丁实现了 Cω 的语法糖:IEnumerable
s,但没有任何使该语法变得有趣的 Cω 语义。如果你看一下这个补丁,你会发现它确实做了愚蠢的语法扩展~T
→ IEnumerable<T>
,与 Cω 相反,其中成员访问和方法调用通过流正确提升。
微软研究院的 Phoenix 编译器管道 https://connect.microsoft.com/Phoenix曾经被明确吹捧为此类可扩展性问题的解决方案,但现在看来它主要侧重于代码生成后端中 IR 级别的优化和分析。事实上,我什至不确定这个项目是否还存在。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)