代码之家  ›  专栏  ›  技术社区  ›  Jon Purdy

我的编译器应该以哪些后端语言为目标?

  •  3
  • Jon Purdy  · 技术社区  · 14 年前

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

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

    有没有为编译器目标的角色而设计或非常适合的语言?

    我知道LLVM,虽然它本身就是一个令人兴奋的项目,但我认为它太低了,无法直接瞄准。我正在寻找具有高质量实现的通用、中高级语言,其语法能够由 C 预处理器——因此没有什么比得上python或ruby。支持羔羊是很好的,但不是绝对必要的。

    6 回复  |  直到 8 年前
        1
  •  7
  •   Nordic Mainframe    14 年前

    我想补充一点。语法如c,has lambdas, 非常受欢迎 ,具有非常快速的HQ实现,可编译为本机代码,在任何地方都可用。 双加: 你可以在任何网页浏览器中演示你的编译器,如果你有什么东西可以开发出JavaScript,那么今天大家都在听。

        2
  •  3
  •   nob    14 年前

    如果您的后端仅仅是普通的C语言,那么您将不支持基本语言的几个构造,但是您将获得与其他语言的兼容性(几乎所有语言都可以轻松地链接到C库)。您可以用您的语言编写程序的某些部分,也可以用其他语言编写某些部分。编译速度也很快。

    许多解析器生成器正在生成C代码,因此这也并不少见。

        3
  •  2
  •   6502    14 年前

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

        4
  •  1
  •   wilx    14 年前

    奥卡姆、哈斯克尔、C99、ADA2005、Scheme或Lisp呢?

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

        5
  •  1
  •   Jon Davis Glenn Block    14 年前

    我认为google的go是一种很好的目标语言。GO试图对现代语言做些什么——C十年前对C++和Java所做的努力——改进它,使它“更好”(在观察者眼中)。

    你也应该确保Lua是支持的,这是不难做到的,因为它背负在C/C++上我认为(?)?)

        6
  •  0
  •   MauganRa    13 年前

    为此,Lisp Dalects也不错。实际上,lisp s-expressions可以看作是前端发出的ast s的文本表示,类似于使用JSON或XML序列化ast。另外,许多Lisp实现支持宏,允许您定义新的语法来实现AST中默认情况下Lisp不支持的条目。一旦你有了Lisp代码,你就可以从无数的解释器、编译器和平台中选择(即使是硬件,如果你使用的是臭名昭著的Lisp机器的话)。

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