【发布时间】:2018-06-19 22:44:49
【问题描述】:
我目前正在创建一种用 Nim 编写的编程语言。
编译器的前端已经完成,我现在正坐在一个精心构建的抽象语法树 (AST) 前面,我尝试实现一个简单的解释器,在每个树节点上调用一个评估 () 方法。这行得通,是的,我什至为函数和东西制作了环境。但是,结果证明比 python 慢 15-20 倍。 Python 在虚拟机上运行并将源程序转换为字节码。其他语言使用 JIT 编译。这两件事都不容易实现,但真正让我难过的是找不到任何一本书来尝试教你如何合并这两个世界,要么构建一个单独有用的 VM,要么构建一个编译好的语言。
LLVM 和 GraalVM 之类的工具可以提供帮助,但我不知道如何将我的 AST 链接到这些东西。
我的下一步应该是什么? JIT / 虚拟机?
如果是 VM:关于如何将 AST 转换为字节码并为其创建 VM 的任何建议?
如果 JIT:你甚至如何用动态语言编译东西。例如
fun add(a, b) {
return a + b;
}
解释器只在运行时知道 a 和 b 的类型,因此在找到之前无法编译它,但是如果将其编译为机器代码,则必须知道参数,因此下一次调用会发生什么是不同的参数类型,重新编译?
我对这个遮罩有点困惑,任何照明都将不胜感激。
提前致谢!
【问题讨论】:
-
如果您的目标是与 Python 相提并论,那么在 15-20% 之内就足够接近了,您应该分析您的解释器并寻找可以在尝试之前进行的简单优化转向更复杂的模型。
-
我犯了一个错误。我的意思是慢了 15-20 倍……我的错!
-
哦,那不一样了:)
标签: compiler-construction interpreter nim-lang