需要一个后端编译器

9

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

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

输出结果看起来像这样:

    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:

感谢您的阅读。
谢谢。

虽然不是完全相同的问题,但非常接近于https://dev59.com/LnRB5IYBdhLWcg3w-8E9。 - Norman Ramsey
11个回答

15

代码生成是我的业务 :-)

对几个选项的评论:

  • CLR:

    • 优点:工业支持
    • 缺点:你必须完全接受他们的类型系统; 根据你想要对类型做什么,这可能无关紧要
    • 缺点:只有 Windows 平台真正是主流质量
  • LLVM:

    • 优点:充满热情的用户社区和charismatic领导人
    • 优点:许多有趣的性能改进
    • 缺点:有些复杂的界面
    • 缺点:工程上的漏洞历史; 随着 LLVM 的成熟,预计通过添加到界面的复杂性来填补工程上的漏洞。
  • C--

    • 优点:目标是一个实际编写的语言,而不是一个 API;你可以轻松地检查、调试和编辑你的 C-- 代码
    • 优点:设计相当成熟,相当干净
    • 优点:支持精确的垃圾回收
    • 优点:大多数用户报告说它非常容易使用
    • 缺点:非常小的开发团队
    • 缺点:截至2009年初,只支持三个硬件平台(x86、PPC、ARM)
    • 缺点:没有随附垃圾回收器
    • 缺点:项目的未来不确定
  • C 作为目标语言

    • 优点:看起来很简单
    • 缺点:几乎不可能获得良好的性能
    • 缺点:长期而言会让你疯掉; 问那些尝试使用这种技术编译 Haskell、ML、Modula-3、Scheme 等的人。在某个时候,这些人中的每一个人都放弃了并构建了自己的本地代码生成器。

摘要: 除了 C 以外的任何选择 都是一个合理的选择。为了最佳的灵活性、质量和预期的持久性,我可能会推荐 LLVM。但是你的示例代码非常接近 C--,所以这可能是一个优势。

完全披露: 我与 C-- 项目有关联。


4
我来晚了,但我想知道你所说的“几乎不可能获得良好性能”是什么意思。 - Kied Llaentenn
4
@KiedLlaentenn,关于那个话题已经有了很长的论文,例如,请看https://www.cs.tufts.edu/~nr/c--/download/pal-ifl.ps.gz的第三部分。 - Norman Ramsey
Vlang和Nim是非常好的例子,它们可以转译为C语言。 - RainingComputers

12

看一下llvm编译器基础设施项目。它被用于许多现实世界的项目中。LLVM是一个低级虚拟机,易于创建代码和易于转换为本地代码。


8

您的生成代码看起来非常接近C语言,为什么不让编译器生成C语言并使用C编译器作为后端?这就是最初的C++ cfront编译器的工作方式。


3
我建议您输出Pascal代码并使用Free Pascal。它是本地编译的,编译速度非常快,您可以针对多种平台进行目标设置。

2
为什么不将另一种高级语言作为中间输出目标呢?例如,您可以生成C代码,并使用任何C编译器进行编译。 这种方法已经被许多高级语言使用过。
另一个稍微低级别的选择是生成IL代码并使用.NET运行时。如果编译器是用.NET编写的,则可以使用Reflection.Emit命名空间来生成.NET程序集,然后在任何.NET环境中运行它。

2
您可能会更幸运地选择一个编译器堆栈,并使用该堆栈支持的中间代码。例如,gcc使用RTL,即寄存器传输语言作为所有语言的通用基数。我怀疑.net也有类似的东西,用于像IronPython这样的东西。
如果您想使用提供虚拟机以评估代码的东西,SPIM MIPS vm支持Motorola 68000架构,并且非常容易使用。

2

还有一个没有被提到的替代方案是QBE

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

它类似于LLVM,但作为依赖项更轻。从与LLVM的比较中可以看出:

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

它不能解决所有产业级语言设计时面临的问题。如果你想尝试一些语言想法,使用LLVM就像用卡车背包,而使用QBE会感觉更像骑自行车。


1

NekoVM旨在接受类似于您的高级IL代码并运行它。Neil Butterworth建议使用C语言也是一个不错的选择。


看起来链接已经失效了,不过 https://nekovm.org 还是可以访问的。 - HParker

1

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

如果不能容忍,则可以使用GNU Lightning进行即时代码生成(比LLVM更小更简单,但没有优化)。


0

由于您的代码类似于C,您可以尝试使用C--。它是一种类似于C的编译器后端语言。据我所知,它被一些主要的Haskell编译器所使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接