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

4
我编写了一款通用编程语言的编译器,它能够生成输入内容的优化解析树。这个中间格式随后会通过预处理器转换成目标语言,以便进行编译生成本地可执行文件。
目前唯一支持的目标语言是C++,但我希望提供其他解决方案,以防某些程序在源语言编译时需要更好地支持某些结构。
有没有适合作为编译器目标语言的语言呢?
我知道LLVM是一个令人兴奋的项目,但我认为它过于低级,无法直接作为目标语言。我正在寻找通用的、中高级别的语言,并且具有高质量的实现,其语法能够由C预处理器生成,因此不像Python或Ruby那样。虽然支持lambda表达式很好,但并非必须。

2
有针对C#和Java的目标可能会很有用。 - Steven Sudit
@Steven:Java 是一个不错的选择,但是目前我想远离 .NET,所以 C# 就不考虑了。 - Jon Purdy
当然由你决定。我提到这些是因为它们在两个最受欢迎的虚拟机上,并且基于C++语法。我想提出的另一个想法是Objective C,即使只是为了支持Mac/iPad。 - Steven Sudit
6个回答

9

我会添加JavaScript。它的语法类似于C,具有lambda表达式,非常流行,并且有非常快速的HQ实现,可以编译成本地代码并且随处可得。双重加号:你可以在任何Web浏览器中演示你的编译器,今天每个人都在听,如果你有一些能够产生JavaScript的东西。


哦。通过浏览器演示生成炒作的能力已经足以使用它了。我简直不敢相信我没有想到这个。 - Jon Purdy
浏览器兼容性确实很好,而且能够吸引大量无法轻松与C代码交互的开发人员。 - Matthieu M.
我接受这个回答是因为它得到了赞同,尽管 @6502 的回答更符合我最初的期望。 - Jon Purdy

3
如果您的后端仅使用普通的C语言,您将无法支持基础语言的多个结构,但您将获得与其他语言的兼容性(几乎所有语言都可以轻松链接到C库)。您可以在您的语言中编写程序的某些部分,并在其他语言中编写其余部分。而且它编译速度快。
许多解析器生成器正在生成C代码,因此这也并不罕见。

C是一个相当合理的建议,但我已经在使用C++,这在与其他语言的二进制兼容性方面相当于相同的事情,同时还提供了许多方便的功能,如临时变量、异常和模板。 - Jon Purdy

2

Neko是一种高级语言/虚拟机,专门设计为编译器的目标。Neko编译器生成字节码,但也有一个JIT翻译器(仅限x86)。


1

关于O'Caml、Haskell、C99、Ada 2005、Scheme或Lisp呢?

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


1

我认为,Google的Go语言是一个不错的目标。 Go试图做到像十年前C#对C ++和Java所做的那样,改进它,让它变得“更好”(在持有者的眼中)。

您还应确保支持Lua,据我所知,这并不难做,因为它可以借助于C / C ++(我想是这样的??)。


Go 无疑是一个不错的选择,因为它基本上是一种高级系统语言,但我担心将其作为目标价值的原因是它仍处于初期阶段,似乎还没有牢固的立足点。 - Jon Purdy

0

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

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


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