问题描述
我已经浏览了PyPy implementation details并浏览了源代码,但是PyPy的执行路径对我来说仍然不十分清楚。
有时会生成字节码,有时会跳过以立即进行机器代码编译(解释程序级别/应用程序级别代码),但是我不知道将机器代码何时何地准确生成,并交给操作系统。通过低级指令(RAM / cpu)执行二进制执行。
在cpython的情况下,我设法弄清楚了这一点,因为ceval.c
中有一个巨大的开关-已经被编译-可以解释字节码并运行相应的代码(实际上是在实际的C语言中)。是有道理的。
但是就PyPy而言,我并没有清晰地了解其实现方式,特别是(我不想深入了解PyPy的各种优化细节,那不是我想要的。在这里之后)。
我对指向PYPY源代码的答案感到满意,因此避免了“传闻”,并能够“用我的眼睛”看到它(我在/ rpython下发现了JIT后端部分,其中包含各种cpu体系结构汇编程序)
解决方法
您最好的指南是pypy architecture documentation和实际的JIT documentation。
对我来说,跳得最多的是:
我们有一个跟踪JIT,它跟踪用RPython编写的解释器,而不是它解释的用户程序。
JIT overview中对此进行了更详细的介绍。
“核心”似乎是这个(来自here):
一旦元解释器验证了它已经跟踪了一个循环,它就会决定如何编译它所具有的内容。这些操作之间有一个可选的优化阶段,将在下一页介绍。后端将跟踪操作转换为特定机器的程序集。然后,它将已编译的循环交给前端。下次在应用程序代码中看到该循环时,可以运行优化的程序集而不是普通的解释器。
This paper(PDF)也可能会有所帮助。
编辑:看着x86后端rpython/jit/backend/x86/rx86.py
,该后端与其说是编译,不如说是直接吐出机器代码的。查看X86_64_CodeBuilder
和AbstractX86CodeBuilder
类。 Assembler386
中的rpython/jit/backend/x86/assembler.py
类更高一级。该汇编器使用MachineCodeBlockWrapper
中的rpython/jit/backend/x86/codebuf.py
,它基于x86-64的X86_64_CodeBuilder
。