我当前正在创建用 Nim 编写的编程语言。
编译器的前端已经完成,我目前正坐在一个构建良好的抽象语法树(AST)前面,并且我尝试实现一个简单的解释器,在每个树节点上调用了validate()方法。这行得通,是的,我什至为功能和内容创建了环境。但是,结果却比python慢15到20倍。 Python在虚拟机上运行,并将源程序转换为字节码。其他语言使用JIT编译。这两件事都不容易实现,但是让我真正难过的是无法找到任何一本尝试教你如何融合这两个世界的书,要么是构建一个单独有用的VM,要么构建一个已编译的VM。语言。
LLVM和GraalVM之类的工具可以提供帮助,但是同样,我看不到如何将AST链接到这些东西。
下一步应该是什么? JIT / VM?
如果是VM:关于如何将AST转换为字节码并为其创建VM的任何建议?
如果是JIT:您甚至如何以动态语言编译内容。例如
fun add(a, b) {
return a + b;
}
解释器仅在运行时才知道a和b的类型,因此在找到它之前无法对其进行编译,但是如果将其编译为机器代码,则必须知道参数,因此下一次调用会发生什么有不同的参数类型,可以重新编译吗?
我对这种遮罩有些困惑,任何照明都将受到赞赏。
谢谢!
答案 0 :(得分:4)
您希望有一本描述如何构建超高性能解释器的书。为此,您实质上将“解释器”与“编译器”相混淆以提高效率。要做到这一点,简单的答案是,使用书中的所有编译器技巧(明显是复数形式)。您需要做很多阅读工作。
但是,您想知道的核心可以在关于SELF的论文中找到,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/540f8fbe0cf2f2b29a3de0a6.pdf
您可以通过访问Scholar.google.com并搜索“ JIT编译器”以及“克雷格·钱伯斯”中的任何内容,找到有关此主题的更多技术论文。
答案 1 :(得分:0)
虽然不完全直接相关,但您可能有兴趣研究RPython(“精简” Python)如何处理初始代码分析。在生成流程图strictly validates variable single-typing之后(尽管CPython是一种完全动态的语言,Pypy是用RPython编写的Python解释器,通过装箱支持完全动态性)。 RPython还自然地集成了流程图级别的JIT(利用“警卫”指令使违反期望的专业代码可以安全退回)而无需过多地使用显式注释,“赠予”使用任何语言的解释器编写的方式。它。另外,它提供了多种内存管理方案(例如,多代标记/清除)。
总结:即使变量是“动态的”,代码通常也不是,所以静态分析可以提供每个变量类型的答案。
答案 2 :(得分:0)
如果您有兴趣在GraalVM上为您的语言构建解释器,请查看simple language,这是为GraalVM构建的示例编程语言,以说明如何实现。
简而言之,需要使用Truffle描述程序的AST,here是用于实现GraalVM使用的编程语言的框架。它提供了一个API,用于描述AST中的节点以及它们应该做什么。
您可以找到在松露gitter chat上实现的语言的更多示例。如果您有更详细的问题,也许colab sniff是最简单的询问方式。