c# - 用 C# 编写编译器,生成 C 与 IL?

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

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

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

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

最佳答案

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

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

伊利诺伊州的优点:

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

C 的优点:

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

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

关于c# - 用 C# 编写编译器,生成 C 与 IL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31978254/

相关文章:

java - 编译在运行时引用当前程序类的Java代码

c# - 如何强制 EF 代码首先重新创建数据库?

c# - 优先使用mysql数据库的 Entity Framework

c# - LINQ 查找嵌套 IEnumerable 是否在嵌套 IEnumerable 的每个级别都包含特定值

c - 循环迭代的次数与输入中的字符数相同

c++ - 为什么 VC++ C4150(删除指向不完整类型的指针)只是一个警告?

c# - Mono 上的 SslStream 未完全关闭

c++ - 编译对象的布局

c - 为什么++i ||++j &&++k 没有给出期望值

c++ - 警告信息的目的?