【问题标题】:Making a language, need a good backend制作一门语言,需要一个好的后端
【发布时间】:2010-10-17 18:27:29
【问题描述】:

我想做一个编译语言。我目前正在评估后端。 到目前为止,我关注 C 是因为它的执行速度、编译速度以及一个名为 TCC 的小型、易于使用的编译器。

阅读了此处关于将其用作中间语言的讨论后,我正在尝试考虑如何使其与垃圾收集兼容并处理异常。到目前为止,我认为我可以同时解决这两个问题,但开销很大。

以下是我对其他可能的后端的一些想法:

  1. 程序集:不便携,编程非常痛苦。
  2. .NET:感觉真的很慢。 5 秒启动,5 秒评估 Ironpython 和 Boo 上的 1+2。没有大型库就无法运行。
  3. JVM:感觉有点慢。无法访问二进制库。没有大型库就无法运行。
  4. LLVM:不支持 Windows。我听说编译后的可执行文件大小是 16 mb+
  5. C--:看起来不发达。
  6. C++:可能。找不到可以捆绑的不错的免费小号。

你们中的任何人可以改变我的想法或有更多内容要添加到此列表中吗?

编辑

我最近一直在试验 LLVM。我发现他们已经预编译了二进制文件,并且可以编译为本机程序集。

http://www.antlr.org/wiki/display/CS652/Generating+machine+executable+binaries+with+LLVM

步骤如下:

  1. 在 LLVM 程序集上运行 llvm-as,生成 LLVM 字节码文件。
  2. 在 LLVM 字节码文件上运行 llc 以生成汇编文件。
  3. 对汇编文件运行汇编程序以生成目标文件。 (或运行似乎依赖于外部安装的 c 编译器的 llvm-ld)
  4. 使用 gcc 等编译为可执行文件。

【问题讨论】:

标签: compiler-construction backend intermediate-language


【解决方案1】:

您是否考虑过为GCC 编写前端?我只是为了完整起见而提到这一点——据我所知,后端接口相当复杂,代码库庞大且难以理解。

另一方面,GCC 是一个成熟的产品,有许多专业的程序员在研究它。至少,它可能提供了所有替代方案中最坚实的基础。

就个人而言,我更喜欢 LLVM(令人兴奋的架构)或 .NET 的 IL:非常非常易于使用,具有出色的工具支持(ReflectorCecilReflexil,最后但并非最不重要的一点是 .NET反射 API)和两个非常高效的实现(即微软的规范实现和 Mono)。

但我不能声称自己在任何架构方面都具备专业知识,因此请对这个答案持保留态度。

【讨论】:

    【解决方案2】:

    在这种情况下,LLVM 可能是更好的选择。

    LLVM 支持 Windows,只是需要一些时间来编译

    【讨论】:

    • 我已尝试阅读所有 LLVM 文档。就我目前所了解的情况来看,我不想强​​迫用户安装需要 3 GB 才能编译的大型运行时。
    • LLVM 不是运行时,它是一个编译器框架。一旦你的应用程序被编译,它将像 Windows 上的任何其他本机二进制文件一样运行
    • 我只阅读提到字节码编译的文档。即使它确实允许静态编译,我什至没有 3 GB 的内存来在 windows 下编译它,也不能指望其他任何人。
    【解决方案3】:

    C++ 不会给你太多,请改用 C。但是,如果您希望您的语言在 Web 中使用,请使用 .NET 或 Java,确保它们的加载速度很慢,但当它们加载时,它们与 C 一样快。

    【讨论】:

    • 我喜欢 C++,因为它已经有堆栈展开异常,并且我可以封装指针以使它们对垃圾更加不友好,不幸的是,可用的编译器似乎非常大并且需要更长的时间来编译。
    【解决方案4】:

    对于SmartEiffel,我们使用 C 作为后端。

    Tcc 是一个非常好的开发选项——尽管不是最终版本(生成的对象相当于 gcc -O0)

    【讨论】:

    • 我读到了许多使用 C 作为后端的语言,你的就是其中之一。你很难输出容易被垃圾回收的 C 代码吗?
    • 我们有自己的 GC 实现,每种类型都有专门的桶(我们的语言是近距离的;每种类型在编译时都是已知的)。唯一复杂的部分是确保标记每个活动对象:我们在堆栈中使用一些标记 + 为需要它的架构保存寄存器。
    【解决方案5】:

    TCC 是最佳选择。它是可移植的,并且它有一个库,因此它可以很容易地用作称为 libtcc 的后端。可执行文件比 gcc 小,它是 ANSI C。

    【讨论】:

    • 我已经开始使用 C++ 作为后端,所以我不必实现 STL 容器和 OOP。我用 TCC 做了实验,发现它又小又快,但我听说它编译的代码根本没有优化。
    【解决方案6】:

    另一个要添加到列表中的内容:Slava 最近在 Factor backend 上实现了 Smalltalk。我自己没有尝试过,但我觉得它会提供更多您想要的高级功能的功能,并且更像是低级功能的大小/性能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-18
      • 2012-04-20
      • 1970-01-01
      相关资源
      最近更新 更多