<分区>
我已经为一种函数式语言编写了一个解释器,我现在尝试使用编译器对其进行引导。该语言具有动态类型系统并使用列表、数字和字符串。它也是函数式的,函数将其参数作为列表(如 perls @_ 或 js 参数)。函数是一流的,可以嵌套。顺便说一句,编译器应该以哪种语言为目标。我认为针对静态类型的命令式语言(如 C)会很困难。该语言应该支持动态类型和函数式编程(js 不会很好 - 该语言应该有一个编译器本身,就像普通的 lisp)
<分区>
我已经为一种函数式语言编写了一个解释器,我现在尝试使用编译器对其进行引导。该语言具有动态类型系统并使用列表、数字和字符串。它也是函数式的,函数将其参数作为列表(如 perls @_ 或 js 参数)。函数是一流的,可以嵌套。顺便说一句,编译器应该以哪种语言为目标。我认为针对静态类型的命令式语言(如 C)会很困难。该语言应该支持动态类型和函数式编程(js 不会很好 - 该语言应该有一个编译器本身,就像普通的 lisp)
最佳答案
您不需要目标语言的任何特殊支持。动态调度可以通过使用你的函数的通用版本来解决(但是当可以安全地推断类型时考虑优化它),例如,对于 a + b
你可以生成像 generic_add( a, b)
,其中generic_add
是根据运行时类型信息选择合适实现的函数。
对于功能部分,使用 lambda 提升消除它是微不足道的。对于后者,您只需为每个 AST 节点构建自由变量和绑定(bind)变量列表:自由变量列表是从叶子到根构建的,而绑定(bind)列表是在相反方向构建的。对于每个 lambda 节点,您从 bound 中减去 free,并构建一个新的顶级函数,该函数接受显式 lambda 参数和此差异(即捕获的变量)。
此外,如果您想进行优化或者您的语言应该支持延续,请考虑使用 CPS 转换。
关于compiler-construction - 函数式语言的编译器后端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37509076/