代码之家  ›  专栏  ›  技术社区  ›  Mehdi LAMRANI

PyPy何时/何地生成机器代码?

  •  6
  • Mehdi LAMRANI  · 技术社区  · 4 年前

    我浏览了一遍这本书 PyPy implementation details 我也看过源代码,但PyPy的执行路径对我来说还不是很清楚。

    有时会生成字节码,有时会跳过字节码进行即时机器码编译(解释器级/应用程序级代码),但我无法确定机器码是在何时何地生成的,以便通过低级指令(RAM/CPU)交给操作系统进行二进制执行。

    在CPython的案例中,我成功地做到了这一点,因为有一个巨大的开关 ceval.c -它已经编译好了——它解释字节码并运行相应的代码(实际上是C语言)。有道理。
    但就PyPy而言,我并没有对如何做到这一点有一个清晰的看法,具体来说(我不想深入讨论PyPy的各种优化细节,这不是我要讨论的内容)。

    我会对一个指向PYPY源代码的答案感到满意,这样可以避免“道听途说”,并且能够“用我的眼睛”看到它(我在/rpython下发现了JIT后端部分,以及各种CPU架构的汇编程序)

    0 回复  |  直到 4 年前
        1
  •  2
  •   Roland Smith    4 年前

    你最好的向导是 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。