我的编译器应该针对哪些后端语言?

Posted

技术标签:

【中文标题】我的编译器应该针对哪些后端语言?【英文标题】:Which backend languages should my compiler target? 【发布时间】:2010-08-06 05:05:37 【问题描述】:

我为通用编程语言编写了一个编译器,它可以生成一个优化的输入解析树。然后通过预处理器运行此中间格式,将其翻译成目标语言,以便随后编译为本机可执行文件。

目前唯一的目标语言是 C++,但我也想提供其他解决方案,以防某些程序可能受益于使用更好地支持源语言中某些结构的后端进行编译。

是否有任何语言专为或非常适合编译器目标的角色?

我知道 LLVM,虽然它本身就是一个令人兴奋的项目,但我认为它的级别太低,无法直接定位。我正在寻找具有高质量实现的通用、中高级语言,其语法能够由 C 预处理器生成——因此与 Python 或 Ruby 完全不同。对 lambdas 的支持会很好,但不是绝对必要的。

【问题讨论】:

针对 C# 和 Java 可能很有用。 @Steven:Java 是一种明显的可能性,但现在我想远离 .NET,所以 C# 已经出局了。 当然是您的来电。我提到这些是因为它们位于两个最流行的 VM 上,并且具有基于 C++ 的语法。我要抛弃的另一个想法是 Objective C,如果只是为了 Mac/iP*d 支持的话。 【参考方案1】:

javascript,我想补充一下。像 C 一样的语法,有 lambda,非常流行,有非常快的 HQ 实现,可以编译为本机代码并且随处可用。 Double-plus:你可以在任何网络浏览器中演示你的编译器,如果你有一些可以生成 JavaScript 的东西,那么今天每个人都在听。

【讨论】:

哦。使用浏览器内演示产生炒作的能力是使用它的充分理由。我不敢相信我没想到。 浏览器的兼容性绝对不错,因为它能够吸引大量无法真正与 C 代码轻松交互的开发人员。 我接受这个是因为有人赞成,尽管@6502 的回答更像我最初想要的。【参考方案2】:

如果您的后端只是纯 C,您将无法支持多种基础语言的结构,但您将获得与其他语言的兼容性(几乎所有语言都可以轻松链接到 C 库)。您可以用您的语言编写程序的某些部分,而用其他语言编写程序的某些部分。而且它的编译速度很快。

许多解析器生成器都在生成 C 代码,所以它也并不少见。

【讨论】:

C 是一个相当合理的建议,但我已经瞄准了 C++,它在与其他语言的二进制兼容性方面等同于相同的东西,同时还提供了许多方便的特性,如临时、异常、和模板。【参考方案3】:

Neko 是一种高级语言/VM,已明确设计为编译器的目标。 Neko 编译器生成字节码,但也有 JIT 翻译器(仅限 x86)。

【讨论】:

【参考方案4】:

O'Caml、Haskell、C99、Ada 2005、Scheme 或 Lisp 怎么样?

我不认为有任何特定的高级语言适合作为另一个编译器的目标语言。

【讨论】:

【参考方案5】:

我认为,Google 的 Go 将是一种很好的目标语言。 Go 试图对现代语言做十年前 C# 试图对 C++ 和 Java 做的事情——改进它,让它“更好”(在旁观者的眼中)。

您还应该确保 Lua 受支持,AFAIK 并不难做到,因为我认为它依赖于 C/C++ (??)。

【讨论】:

Go 绝对是一个不错的选择,因为它基本上是一种高级系统语言,但我担心针对它的价值,因为它仍处于起步阶段,似乎还没有坚定的持有。【参考方案6】:

LISP dalect 不适合这个目的。事实上,LISP S 表达式可以看作是前端发出的 AST 的文本表示,类似于使用 JSON 或 XML 序列化 AST。此外,许多 LISP 实现支持宏,允许您定义新语法来实现 LISP 默认不支持的 AST 中的条目。一旦你有了 LISP 代码,你就可以从无数的解释器、编译器和平台(甚至硬件,如果你使用臭名昭著的 LISP 机器)中进行选择

如果您正在寻找更多“传统”目标语言,我推荐 C 或 Javascript(顺便说一句,Javascript 甚至是某些 Perl6 编译器的目标)。或者尝试某种高级汇编程序。

【讨论】:

以上是关于我的编译器应该针对哪些后端语言?的主要内容,如果未能解决你的问题,请参考以下文章

哪些语言可以编译成 WebAssembly (Wasm)? [关闭]

浅谈后端语言优缺点

LLVM后端与工具链技术探索

在 GitHub 上创建新存储库时,我应该隐藏我的 firebase(或其他后端)代码的哪些部分?

编译原理 模块二

后端软件主要是哪些?