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--项目的成员。我建议您吐出Pascal代码并使用
它是本机编译的,编译速度非常快,可以针对大量平台 强烈推荐llvm,它是一种跨平台的基础设施,支持机器代码生成和多次优化。llvm.org上的教程非常简单。另一个没有人提到的选择是 QBE的目标是成为一个纯C嵌入式后端,在10%的代码中提供高级编译器70%的性能 它类似于LLVM,但作为依赖项,它要轻得多。发件人: QBE是为业余语言设计师设计的 它并没有解决构思行业级语言时所面临的所有问题。如果你在玩弄一些语言的想法,使用LLVM就像用卡车拖着你的背包,但使用QBE更像是骑自行车
不是完全重复,但非常接近我迟到了,但我想知道你所说的“几乎不可能获得体面的表现”是什么意思。@Kiedllaenten关于这个主题有很多论文,例如,见本章第3节