一个函数式语言的编译器后端

3

我写了一个函数式语言的解释器,现在我尝试使用编译器进行引导。该语言拥有动态类型系统,使用列表、数字和字符串。它也是函数式的,函数将其参数作为列表(类似于Perl中的@_或JavaScript中的arguments)。函数是一等公民,可以嵌套。顺便问一下,我应该使用哪种语言作为编译器的目标呢?我认为选择静态类型的命令式语言(例如C)会很难。该语言应支持动态类型和函数式编程(像JavaScript这样的语言不太好 - 该语言本身应该具备编译器,就像Common Lisp一样)。


1
请查看 QBE - Agis
2个回答

1
你不需要从目标语言获取任何特殊支持。可以使用函数的通用版本来解决动态分派(但考虑在类型可以被安全推断时优化它),例如,对于 a + b,你可以生成像 generic_add(a, b) 这样的代码,其中 generic_add 是一个函数,根据运行时类型信息选择合适的实现。
对于函数部分,使用 lambda lifting 可以轻松消除它。对于后者,你只需要为每个 AST 节点构建自由变量和绑定变量的列表:自由变量列表从叶子到根构建,绑定变量列表则相反。对于每个 lambda 节点,你从绑定中减去自由变量,并构建一个新的顶级函数,该函数接受显式的 lambda 参数和这个差异(即捕获的变量)。
此外,如果你想进行优化或者你的语言应该支持 continuation,请考虑使用 CPS-transform。

非常好的回答!非常感谢,您能推荐我使用哪种特定的编程语言吗?那将非常好。 - ein mensch
使用任何可以提供所需运行时特性的语言(例如,您可能需要或不需要垃圾回收器、某些特定库等)。如果有疑问或根本没有特定需求,可以随意使用C语言,它是一个常见的选择,并且在多本书和教程中都有很好的覆盖范围。您也可以直接将目标定为LLVM IR。 - SK-logic
在stackoverflow上有点赞按钮吗?我真的很想按它 :) - ein mensch
你可以点赞和/或接受一个答案。 - SK-logic

0

如果你愿意自己实现动态分派、闭包等功能,那么针对LLVM和C这样的低级语言是可以的。但是,既然你提到JavaScript作为一个可能的目标(尽管缺乏编译器,但现在主流浏览器都支持JIT编译),那么Scheme怎么样呢?它是一种动态类型、高阶函数式语言,已经有本地代码编译器了:http://community.schemewiki.org/?scheme-faq-standards#implementations唯一的问题可能是它太接近你的源语言和你的编译器(或者说“翻译器”)可能会太容易了。:-)

如果你想针对C进行开发,Marc Feeley的教程“90分钟Scheme到C编译器”可能是一个很好的起点:http://churchturing.org/y/90-min-scc.pdf


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