Eri*_*dal 6 compiler-construction interpreter nim-lang
我目前正在创建一种用Nim编写的编程语言。
编译器的前端已经完成,我目前坐在一个构建良好的抽象语法树 (AST) 前面,我尝试实现一个简单的解释器,在每个树节点上调用一个evaluate() 方法。这行得通,是的,我什至为函数和东西制作了环境。但是,结果证明比 python 慢 15-20 倍。Python 在虚拟机上运行,并将源程序翻译成字节码。其他语言使用 JIT 编译。这两件事都不容易实现,但对我来说真正难过的是找不到任何一本教你如何合并这两个世界的书,要么构建一个单独有用的 VM,要么构建一个编译语。
LLVM 和 GraalVM 之类的工具可以提供帮助,但同样,我不知道如何将我的 AST 链接到这些东西。
我的下一步应该是什么?即时/虚拟机?
如果 VM:关于如何将 AST 转换为字节码并为其创建 VM 的任何建议?
If JIT:你甚至如何用动态语言编译东西。例如
fun add(a, b) {
return a + b;
}
Run Code Online (Sandbox Code Playgroud)
解释器只在运行时知道 a 和 b 的类型,因此在找到之前无法编译它,但是如果将其编译为机器码,则必须知道参数,因此下一次调用发生的情况有所不同参数类型,重新编译?
我对这个遮罩有点困惑,任何照明都将不胜感激。
提前致谢!
您希望有一本描述如何构建超高性能解释器的书。为此,您基本上将“解释器”与“编译器”混淆以提高效率。要做到这一点,简单的答案是,使用书中的每一个编译器技巧(明显是复数)。你有很多阅读要做。
然而,你想知道的核心内容可以在关于 SELF 的论文中找到,这是一个快速运行时“解释器”,它定义了 JIT 编译器应该如何工作,尤其是在面对动态类型时:
一种基于原型的动态类型面向对象语言 SELF 的有效实现,(Chambers/Ungar)ACM Sigplan 通知。此处提供 PDF:https : //www.researchgate.net/profile/David_Ungar2/publication/234781317_An_Efficient_Implementation_of_Self_a_Dynamically-Typed_Object-Oriented_Language_Based_on_Prototypes/links/540f8fbe026a2f3pdf
您可以通过访问scholar.google.com 并搜索“JIT Compilers”以及“Craig Chambers”的任何内容来找到关于此主题的更多技术论文。