【问题标题】:Need a Backend Compiler需要一个后端编译器
【发布时间】:2009-03-21 15:35:12
【问题描述】:

我创建了一个生成中间代码的编译器。我没有时间为我的项目编写后端。

有什么软件可以用来评估生成的中间代码吗?我在哪里可以下载这个软件?

输出看起来像这样:

    t1 = 0.67596e-7
    sum = t1

    t1 = 2
    t2 = 3
    t3 = t2 + t1
    i = t3

L0:
    t1 = sum
    t2 = 20
t3 = compare(t1 <= t2)
    t4 = sum
    t5 = 12
t6 = compare(t4 ~= t5)
t7 = t3 | t6
    t8 = sum
    t9 = 20
t10 = compare(t8 > t9)
t11 = t7 & t10
if t11 true then goto L1 else goto L2
L1: 
    t1 = 2
    t2 = sum
    t3 = t2 + t1
    sum = t3

    t1 = 1
    t2 = i
    t3 = t2 + t1
    i = t3
    goto L0
L2:

感谢阅读。

【问题讨论】:

标签: compiler-construction


【解决方案1】:

代码生成是我的事 :-)

对几个选项的评论:

  • CLR:

    • 专业版:工业支持
    • 缺点:你必须完全接受他们的类型系统;根据您想对类型执行的操作,这可能无关紧要
    • 缺点:只有 Windows 平台才是真正的黄金时间质量
  • LLVM:

    • 专业人士:热情的用户社区和富有魅力的领导者
    • 专业版:许多有趣的性能改进
    • 缺点:界面有些复杂
    • 缺点:工程漏洞的历史;随着 LLVM 的成熟,希望通过增加接口的复杂性来填补工程中的漏洞
  • C--

    • Pro:目标是一种实际的书面语言,而不是 API;您可以轻松检查、调试和编辑您的 C 代码
    • 专业版:设计相当成熟且相当干净
    • 专业版:支持准确的垃圾回收
    • 专业版:大多数用户报告它非常易于使用
    • 缺点:开发团队非常小
    • Con:截至 2009 年初,仅支持三种硬件平台(x86、PPC、ARM)
    • 缺点:不附带垃圾收集器
    • 缺点:项目的未来不确定
  • C 作为目标语言

    • 专业版:看起来很简单
    • 缺点:几乎不可能获得不错的性能
    • 骗局:从长远来看会让你发疯;询问那些尝试使用这种技术编译 Haskell、ML、Modula-3、Scheme 等的人。在某个时候,这些人中的每一个人都放弃并构建了自己的本机代码生成器。

总结:除了 C 之外的任何东西都是合理的选择。对于灵活性、质量和预期寿命的最佳组合,我可能会推荐 LLVM。但是您的示例代码非常接近 C--,所以这可能是一个优势。

完全披露:我隶属于 C-- 项目。

【讨论】:

  • 我迟到了,但我想知道您所说的“几乎不可能获得体面的表现”是什么意思。
  • @KiedLlaentenn 有关于该主题的长篇论文,例如,请参阅cs.tufts.edu/~nr/c--/download/pal-ifl.ps.gz 的第 3 部分
【解决方案2】:

看看llvm compiler infrastructure project。它被用于许多现实世界的项目中。 LLVM 是一个低级虚拟机,易于创建代码并易于转换为本机代码。

【讨论】:

    【解决方案3】:

    您发出的代码看起来非常接近 C - 为什么不让您的编译器发出 C 并使用 C 编译器作为后端 - 这就是原始 C++ cfront 编译器的工作方式。

    【讨论】:

      【解决方案4】:

      我建议吐出 Pascal 代码并使用 Free pascal

      它是本机编译的,编译速度极快,您可以针对多个平台。

      【讨论】:

        【解决方案5】:

        为什么不将另一种高级语言作为中间输出,例如,您可以生成 C 代码,并使用任何 C 编译器来编译它。过去,这已被许多高级语言使用。

        另一个稍低级别的选项是生成 IL 代码并使用 .NET 运行时。如果编译器是用 .NET 编写的,您可以使用 Reflection.Emit 命名空间来生成一个 .NET 程序集,然后可以在任何 .NET 环境中运行。

        【讨论】:

          【解决方案6】:

          选择编译器堆栈并使用该堆栈支持的中间代码可能会更好。例如gcc使用RTL,注册传输语言作为gcc支持的所有语言的公分母。我怀疑 .net 有类似的东西用于 IronPython 之类的东西。

          如果您想使用提供虚拟机来评估代码的东西,SPIM MIPS vm 支持摩托罗拉 68000 架构,并且非常易于使用。

          【讨论】:

            【解决方案7】:

            NekoVM 旨在接受与您的类似的高级 IL,然后运行它。 Neil Butterworth 建议使用 C 也是一个不错的选择。

            【讨论】:

              【解决方案8】:

              如果您可以容忍对 JVM 的依赖,那么使用 ASM 生成字节码非常简单。

              如果你不能,那么gnu lightning 可以用于动态代码生成(比 LLVM 更小更简单,但没有优化)。

              【讨论】:

                【解决方案9】:

                由于您的代码是C-ish,您可以试试C--。它是一种类似C 的编译器后端语言。 IIRC,它被主要的 Haskell 编译器之一使用。

                【讨论】:

                  【解决方案10】:

                  强烈推荐 llvm,一个跨平台的基础设施,支持机器代码生成和多道优化。 llvm.org 上的教程很简单。

                  【讨论】:

                    【解决方案11】:

                    另一个没有人提到的替代方案是QBE

                    QBE 旨在成为一个纯 C 可嵌入后端,在 10% 的代码中提供高级编译器 70% 的性能。

                    它类似于 LLVM,但作为依赖项要轻得多。来自the comparison to LLVM

                    QBE 适用于业余语言设计师。

                    它并没有解决在构思工业级语言时面临的所有问题。如果你在玩弄一些语言创意,使用 LLVM 就像用卡车拖着你的背包,但使用 QBE 感觉更像是骑自行车。

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 2011-06-29
                      • 1970-01-01
                      • 2023-03-06
                      • 1970-01-01
                      • 2017-12-20
                      • 1970-01-01
                      • 2011-02-06
                      相关资源
                      最近更新 更多