如何创建一个.NET编程语言?

38

我已经使用几种不同的解析工具创建了几种完整的编程语言。但是,有人如何创建一个在 .Net 框架下运行的编程语言呢?我需要输出 .Net IL 并编译它吗,还是有更高级别的抽象层次?

另外,有没有一种简单的方法让该语言在 Visual Studio 中工作?


2
你需要输出.NET IL代码。.NET运行时会处理编译和运行该代码。其他部分不确定。 - Nelson Rothermel
7个回答

17
你需要查看Microsoft Research Common Compiler Infrastructure (CCI)项目。该项目提供了生成程序集元数据和MSIL所需的一切内容,以及相当重要的调试.pdb文件,这对于让你的语言正常运行非常重要。
还有一个姊妹项目,CCI Code Model和AST,可能也很有用,具体取决于你的进展情况。

1
这个被 Roslyn 废弃了吗,还是仍然相关? - Aaron Anodide
CCI有助于创建任何语言,而Roslyn仅针对C#和VB.NET。 - Hans Passant
这已经被停止了:“未来,CCI只会进行维护性投资以支持现有的使用。” - Aaron Franke
1
嗯,不是的,“停产”和“完成”是有区别的。当你无法再下载它时,它就被停产了。许多微软项目已经完成了,他们仍然提供关键错误修复服务,但不再添加新功能。例如,Winforms已经完成了14年,很多人仍在使用它。实际上,它比WPF(也已完成)获得更多的维护更新。 - Hans Passant

11

这里有一个使用C#编写的LOLCode编译器,可能是一个不错的起点。

http://code.google.com/p/lolcode-dot-net/

至于在Visual Studio中实现,有一个名为Spark的开源视图引擎(http://www.sparkviewengine.com/)曾经尝试使智能感知工作。虽然语境不同,但教训相同,实现起来很困难,而且没有很好的文档说明。


10

不确定这是否是您需要的内容,但是在我在SO上提问后,我创建了一个Brainf **k的.NET编译器作为练习(第6部分包含实际的编译器源代码,并且也可以在GitHub上找到)。

本质上,实际的编译器可以用任何.NET语言编写,并使用System.Reflection.Emit命名空间来创建程序集、类、方法等,并将IL发射到其中。

创建一种新语言的实际工作显然涉及编写解析器/词法分析器/分析器/诸如此类的工具,可以将您的程序分解成类并“喂”给您的编译器-抱歉,我没有此方面的经验,但请参阅此资源列表以了解如何编写编译器。

您确实想要阅读ECMA-335以了解CLI的工作原理:它支持哪些数据类型以及实际执行哪些命令。


7

您的编译器负责将收到的代码转换为ILCode。 ILCode是任何.NET语言编译的通用语言。此代码由JIT编译器在运行时解释。当然,如果您例如使用C#编写编译器,它可以依赖于框架中的CodeDom类来完成此操作。


1
请查看MSDN杂志上有关使用C#实现给定语言编译器的文章:http://msdn.microsoft.com/en-us/magazine/cc136756.aspx - Justin Niessner
2
链接已失效。这里是archive.org的快照:https://web.archive.org/web/20150111033016/http://msdn.microsoft.com/en-us/magazine/cc136756.aspx - IInspectable
你如何获取IL代码并进行编译/运行?你需要生成一个能够在.NET Core、Framework和/或Mono上运行的项目吗? - Aaron Franke

5

3
一个很好的将自己的语言集成到Visual Studio中的例子是Lua语言支持项目。

2

还是有更高层次的抽象?

为了完整起见,您可以输出C#或VB.NET。这两个编译器都是运行时的一部分。

不过,这是否是一个“真正”的编译器还存在争议。


4
编译器是将一种形式转化为另一种形式的工具。 - Telavian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接