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

Writing a compiler in C#, generating C vs IL?

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

我一直在努力决定是否生成 IL 或其他高级语言。从我有 seen/read 的文章和教程来看,C 和 MSIL(通过 reflection.emit)似乎是最受欢迎的。

我想知道哪种方法可以使我的编程语言更快? (假设它们得到了最佳实施)。理想情况下,我希望该语言能够在 MS 和 Linux/OSX 上 运行 - 我也明白可能有更好的选择,我没有考虑

您的决定通常取决于您的语言的设计和范例。如果您的语言很小并且不包含复杂的面向对象的特性,那么将只使用 IL 的非 "object-oriented" 特性,差异大约是:

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

IL 的优点:

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

C 的优点:

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

很多现代语言都可以编译成另一种高级语言(天哪,今天有大量的 something-to-js 工具!),有些语言甚至被设计成可以编译成另一种高级语言-水平语言 (CoffeeScript to JavaScript), but don't forget that you have another options too, for example, LLVM intermediate representation.