我正在创建一个使用Nim编写的编程语言。
编译器的前端已经完成,我现在正坐在一个良好构建的抽象语法树(AST)面前,并尝试实现一个简单的解释器,在每个树节点上调用evaluate()方法。这起初效果不错,我甚至为函数等创建了环境。但是,结果显示它比Python慢了大约15-20倍。Python运行在虚拟机上,并将源程序转换为字节码。其他语言使用JIT编译。这两种东西都不容易实现,但对我来说真正令人沮丧的是找不到任何一本书来教你如何将这两个世界合并在一起,要么是构建一个有用的单独VM,要么是构建一个编译语言。
像LLVM和GraalVM这样的工具可以帮助,但我仍然看不出如何将我的AST与这些工具链接起来。
我的下一步应该是什么?JIT / VM?
如果是VM:有没有推荐的方法将AST转换为字节码并为其创建VM?
如果是JIT:如何在动态语言中编译代码。例如
fun add(a, b) {
return a + b;
}
解释器只有在运行时才知道a和b的类型,因此在找到它之前无法编译它。但是,如果将其编译为机器代码,则必须知道参数是什么,那么如果下一次调用使用不同的参数类型会发生什么?需要重新编译吗?
我对这个问题有点困惑,希望能得到解决。
提前感谢!