【问题标题】:Writing a compiler in C#, generating C vs IL? [closed]用 C# 编写编译器,生成 C 与 IL? [关闭]
【发布时间】:2015-11-05 19:58:23
【问题描述】:

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

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

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

【问题讨论】:

  • 编译器不生成高级语言。您所描述的是一种转换工具。
  • @RonBeyer 不正确,编译器将一种语言转换为另一种语言。
  • @RonBeyer 将 CIL 转换为机器代码显然不止一步,就像 Javascript 一样(它正在成为一个相当流行的交叉编译目标)。生成 C 作为中间语言的语言也有很多历史 (programmers.stackexchange.com/a/257873/37027)。
  • @RonBeyer 仔细阅读我的意思,编译器将代码转换为另一种语言。该其他语言可以是任何其他语言,它通常是较低级别的语言,但它不一定是,如果它从高级到高级,它通常称为转译器(这是编译器类型的分类)。但源语言或目标语言是什么并不重要(但根据它们的级别,它们可能有更具体的名称,但都是编译器)。
  • 我可以忍气吞声说我错了,当我个人想到“编译器”时,我想到的是为解释器或链接器/汇编器生成较低级别代码的东西,但可以接受编译器的定义似乎是一个翻译工具。

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


【解决方案1】:

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

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

IL 的优点:

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

C 的优点:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-22
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多