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

标签 compiler-construction functional-programming dynamic-typing

<分区>

我已经为一种函数式语言编写了一个解释器,我现在尝试使用编译器对其进行引导。该语言具有动态类型系统并使用列表、数字和字符串。它也是函数式的,函数将其参数作为列表(如 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/

相关文章:

php - 使用多态时,如何让 PHP 代码知道传递给它的特定类子类型?

haskell - 这是 unsafeCoerce 的安全使用吗?

c# - C# if/else 上的编译器优化

algorithm - 是否有满足这些要求的垃圾回收算法?

c - 使用 Xcode 选项 Generate Output>Assembly 查看 C 文件的汇编代码

scala - 从函数式迁移到 OO 的问题

c# - 基于ANTLR v3的成熟编译器

javascript - 将ramda转换为普通js

haskell - OCaml 仿函数、Haskell 类型类和多重派生

c# - 为什么匿名类型不像 ExpandoObject 那样是动态的?