Compiler construction 需要后端编译器吗

Compiler construction 需要后端编译器吗,compiler-construction,Compiler Construction,我创建了一个生成中间代码的编译器。我没有时间为我的项目编写后端 是否有任何软件可用于评估生成的中间代码?在哪里可以下载此软件? 输出如下所示: 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(

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

是否有任何软件可用于评估生成的中间代码?在哪里可以下载此软件?

输出如下所示:

    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:
t1=0.67596e-7
总和=t1
t1=2
t2=3
t3=t2+t1
i=t3
L0:
t1=总和
t2=20
t3=比较(t1-t9)
t11=t7和t10
如果t11为真,则转到L1,否则转到L2
L1:
t1=2
t2=总和
t3=t2+t1
总和=t3
t1=1
t2=i
t3=t2+t1
i=t3
转到L0
L2:

谢谢阅读。

< P>你发射的代码看起来非常接近C—Wh,你的编译器没有发射C,使用C编译器作为后端——这就是原来的C++前缀编译器的工作方式。

看看。它被用于许多实际项目中。LLVM是一种低级虚拟机,易于为其创建代码并易于转换为本机代码。

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


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

选择编译器堆栈并使用该堆栈支持的中间代码可能会更幸运。例如,gcc使用register transfer language作为gcc支持的所有语言的公共分母。我怀疑.net也有类似的东西,用于IronPython之类的东西


如果您想使用提供虚拟机的东西来评估代码,虚拟机支持摩托罗拉68000体系结构,并且非常容易使用

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

如果您能够容忍对JVM的依赖,那么使用C生成字节码是非常简单的


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

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

代码生成是我的事:-)

对几个选项的评论:

  • CLR:

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

    • 赞成:热情的用户社区和有魅力的领导者
    • 赞成:许多有趣的性能改进
    • 缺点:界面有点复杂
    • Con:工程中的孔历史;随着LLVM的成熟,希望通过增加接口的复杂性来填补工程中的漏洞
    • Pro:目标是一种实际的书面语言,而不是API;您可以轻松地检查、调试和编辑C代码
    • 赞成:设计相当成熟,相当干净
    • 支持精确的垃圾收集
    • 赞成:大多数用户报告它很容易使用
    • 缺点:非常小的开发团队
    • 缺点:截至2009年初,仅支持三种硬件平台(x86、PPC、ARM)
    • 缺点:没有附带垃圾收集器
    • 反对:项目的未来是不确定的
  • C作为目标语言

    • 赞成者:看起来很简单
    • 缺点:几乎不可能有好的表现
    • 缺点:从长远来看会让你发疯;询问一长串试图使用此技术编译Haskell、ML、Modula-3、Scheme等的人。在某个时候,这些人中的每一个人都放弃了,建立了自己的本地代码生成器
总结:除了C以外的任何东西都是合理的选择。为了获得灵活性、质量和预期寿命的最佳组合,我可能会推荐LLVM。但是您的示例代码非常接近C-,所以这可能是一个优势


充分披露:我是C--项目的成员。

我建议您吐出Pascal代码并使用


它是本机编译的,编译速度非常快,可以针对大量平台

强烈推荐llvm,它是一种跨平台的基础设施,支持机器代码生成和多次优化。llvm.org上的教程非常简单。

另一个没有人提到的选择是

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

它类似于LLVM,但作为依赖项,它要轻得多。发件人:

QBE是为业余语言设计师设计的

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


不是完全重复,但非常接近我迟到了,但我想知道你所说的“几乎不可能获得体面的表现”是什么意思。@Kiedllaenten关于这个主题有很多论文,例如,见本章第3节