用C#编写编译器,生成C vs IL?

时间:2015-08-13 01:52:32

标签: c# c compiler-construction code-generation cil

我一直想创建自己的编程语言,我希望开始编写基本的编译器。我这样做纯粹是为了学习目的。 我将用C#编写编译器。

我一直在尝试决定是否生成IL或其他高级语言。从我看过/阅读的文章和教程看来,C和MSIL(通过reflection.emit)是最受欢迎的。

我想知道哪种方法可以让我的编程语言更快? (假设它们是最佳实施的)。理想情况下,我希望这种语言能够在MS和Linux / OSX上运行 - 我也理解可能有更好的替代方案,我不在考虑

1 个答案:

答案 0 :(得分:2)

您的决定通常取决于您的语言的设计和范例。如果您的语言很小并且不包含复杂的面向对象的功能,那么只能使用非面向对象的语言。将使用IL的特征,区别在于:

  1. 用于语言实现的.NET虚拟机和BCL与C标准库的可用性。这包括内存管理功能和原始类型的实现,例如int和字符串。
  2. 代码生成:基于堆栈的IL与高级C语法。当然,生成另一种语言的高级构造可能更容易(你不应该接受C语言的所有语法,你可以只使用你需要的语法),但是对于学习puproses来说,学习如何生成低级语言更有用。像IL操作码这样的级别指令。并且不要忘记:如果你将工具分成前端和后端,那将会很酷,就像在每个可靠的编译器中完成的那样。您可以使用不同的后端来生成代码。
  3. IL的PROS:

    • 更加扎实的学习过程和完整的结果:您的编译器不需要任何其他工具,并且会自给自足;
    • CLR中BCL和资源管理层的存在;
    • 通过与C#代码交互来引导编译器的能力。
    • .net平台的独特体验 - 如果你计划提高你的C#和.net技能,这是有用的。

    PROS for C:

    • 利用现有后端生成平台代码的能力 并执行优化;你可以为每一个编译你的C输出 平台C编译器可以;
    • 缺少CLR的依赖关系:您不需要.net fw或Mono来运行生成的输出。今天Mono是成熟的东西,并且在Mac和Linux上运行,但它始终是选择:IL或平台代码。

    许多现代语言编译成另一种高级语言(哦,上帝,今天有大量的东西到js工具!),有些语言甚至被设计为编译成另一种高级语言(CoffeeScript到JavaScript),但不要忘记您还有其他选项,例如LLVM intermediate representation

相关问题