代码之家  ›  专栏  ›  技术社区  ›  Richard Cook

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

  •  15
  • Richard Cook  · 技术社区  · 15 年前

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

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

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

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

    更新(2010年10月23日)

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

    主要任务是: http://github.com/rcook/mono-extensibility/commit/a0456c852e48f6822e6bdad7b4d12a357ade0d01

    如果有人愿意合作这个项目,请让我知道!

    2 回复  |  直到 15 年前
        1
  •  3
  •   Jörg W Mittag    15 年前

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

    I可数 s、 但是没有任何C的语义使这个语法有趣。如果你看这个补丁,你会发现它实际上是对 ~T IEnumerable<T> ,而不是C,在C中,成员访问和方法调用在流上正确提升。

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

        2
  •  3
  •   Jordão    15 年前

    不过,解析器和标记器可能对您很有用,您只需从那里获取它。 SharpDevelop还提供 C# parser SharpDevelop解析器比mono C解析器更易于使用。 如果F也适合你,我会推荐你。源代码比mono干净得多,并且在开源许可下可用。