Compiler construction 函数式语言的编译器后端

Compiler construction 函数式语言的编译器后端,compiler-construction,functional-programming,dynamic-typing,Compiler Construction,Functional Programming,Dynamic Typing,我已经为一种函数式语言编写了一个解释器,我正在尝试使用编译器引导它。该语言有一个动态类型系统,使用列表、数字和字符串。它也是函数式的,函数将其argumenta作为列表(如perls@@或js参数)。函数是第一类的,可以嵌套。顺便说一句,编译器应该以哪种语言为目标。我认为以静态类型的命令式语言为目标,比如C语言,是很难的。该语言应该支持动态类型和函数式编程(js不会很好-该语言本身应该有一个编译器,如common lisp)您不需要目标语言的任何特殊支持。动态调度可以通过使用函数的通用版本来解决

我已经为一种函数式语言编写了一个解释器,我正在尝试使用编译器引导它。该语言有一个动态类型系统,使用列表、数字和字符串。它也是函数式的,函数将其argumenta作为列表(如perls@@或js参数)。函数是第一类的,可以嵌套。顺便说一句,编译器应该以哪种语言为目标。我认为以静态类型的命令式语言为目标,比如C语言,是很难的。该语言应该支持动态类型和函数式编程(js不会很好-该语言本身应该有一个编译器,如common lisp)

您不需要目标语言的任何特殊支持。动态调度可以通过使用函数的通用版本来解决(但是当类型可以被安全推断时考虑优化它),例如,对于<代码> A+B<代码>,你可以生成一个代码,比如“代码> GuangixAdx(A,B)< /代码>,其中,
generic\u add
是一个函数,它根据运行时类型信息选择合适的实现

对于功能部件,使用lambda提升消除它是很简单的。对于后者,您只需要为每个AST节点构建自由变量和绑定变量的列表:自由变量的列表是从叶子到根构建的,绑定列表是以相反的方向构建的。对于每个lambda节点,从绑定中减去free,并构建一个新的顶级函数,该函数采用显式lambda参数和此差异(即捕获的变量)


此外,如果您想进行优化,或者如果您的语言应该支持连续性,考虑使用CPS转换。

瞄准LLVM和C之类的低级语言是很好的,只要您愿意自己实现动态调度、闭包等。然而,既然您提到JavaScript是一个可能的目标(除了缺少编译器,尽管现在主流浏览器中JS也是JIT编译的),Scheme呢?它是一种动态类型的高阶函数式语言,并且已经有了本机代码编译器:唯一的问题可能是它太接近您的源语言,并且您的编译器(或者我可以说是“translator”)可能太简单了。:-)


如果您愿意以C为目标,一个很好的起点可能是Marc Feeley的教程“C编译器的90分钟方案”:

出色的答案!非常感谢,你能给我打电话吗?如果使用任何能够为您提供所需运行时功能的语言(您可能需要也可能不需要GC,例如某些特定的库,等等),那将是非常好的。如果有疑问或者根本没有具体的需求,请随意使用C语言,这是一个常见的选择,这条道路在多本书和教程中都有很好的介绍。您也可以直接将LLVM IR作为目标。stackoverflow上是否有like按钮,我真的想按它:)您可以向上投票和/或接受答案。请查看。