我一直想创建自己的编程语言,并且希望开始编写一个基本的编译器。我这样做纯粹是为了学习目的。 我将用 C# 编写编译器。
我一直在尝试决定是否生成IL或其他高级语言。从我看过/读过的文章和教程来看,C 和 MSIL(通过 Reflection.emit)似乎是最受欢迎的。
我想知道哪种方法将使我的编程语言更快? (假设它们得到了最佳实现)。理想情况下,我希望该语言能够在 MS 和 Linux/OSX 上运行 - 我也知道可能有更好的替代方案,但我没有考虑
最佳答案
您的决定通常取决于您的语言的设计和范例。如果您的语言很小并且不包含复杂的面向对象功能,那么将仅使用 IL 的非“面向对象”功能,区别在于:
- 用于语言实现的 .NET 虚拟机和 BCL 与 C 标准库的可用性。这包括内存管理功能和基本类型(例如整数和字符串)的实现。
- 代码生成:基于堆栈的 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/