我为函数式语言编写了一个解释器,我尝试使用编译器进行引导。该语言具有动态类型系统,并使用列表,数字和字符串。它也是功能性的,函数将其参数作为列表(如perls @_或js参数)。函数是第一类,可以嵌套。我应该用编译器定位哪种语言,顺便说一句。我认为针对像C这样的静态类型命令式语言会很难。该语言应该支持动态类型和函数式编程(js不会很好 - 语言应该有编译器本身,就像普通的lisp一样)
答案 0 :(得分:1)
您不需要目标语言的任何特殊支持。动态调度可以通过使用函数的通用版本来解决(但考虑在可以安全推断类型时考虑优化它),例如,对于a + b
,您可以生成类似generic_add(a, b)
的代码,其中{{1}是一个根据运行时类型信息选择合适实现的函数。
对于功能部件,使用lambda提升消除它是微不足道的。对于后者,您只需要为每个AST节点构建自由变量和绑定变量的列表:从叶子到根构建自由变量列表,并在相反方向构建绑定列表。对于每个lambda节点,你减去绑定,并构建一个新的顶级函数,它接受显式lambda参数和这个差异(即捕获的变量)。
此外,如果您想进行优化或者您的语言应该支持continuation,请考虑使用CPS转换。
答案 1 :(得分:0)
只要您愿意自己实施动态调度,闭包等,就可以定位LLVM和C等低级语言。但是,既然你提到JavaScript作为一个可能的目标(除了缺少编译器,尽管现在甚至JS在主流浏览器中都是JIT编译的),那么Scheme怎么样呢?它是一种动态类型的高阶函数语言,并且已经有本机代码编译器:http://community.schemewiki.org/?scheme-faq-standards#implementations唯一的问题可能是它太接近你的源语言和编译器(或者“翻译器”,我可能会说)或许太容易了。: - )
如果你愿意以C为目标,一个好的起点可能是Marc Feeley的教程“90分钟的C编译方案”:http://churchturing.org/y/90-min-scc.pdf