python jit_Pypy Python的JIT实现

  • Post author:
  • Post category:python


Pypy从表面意思上面来说的话,就是用Python实现的Python。但是更准确的描述应该是RPython实现的Python。

RPython是Python的子集,为什么到现在CPython一直没有加入JIT功能,就是因为它的变量的类型是运行时确定的,也正是因为这样,JIT很难做。

x = random.choice([1, “foo”])

在编译期,很难确定这是x是什么类型的,所以JIT优化很难做,这个时候就使用了RPython来实现Python的语法了,但是它具有静态类型,这样JIT实现起来更加容易。

RPython实现的是Python代码的解析器,所以它只是一个编译器的前端,那么编译器的后端是什么呢?目前Pypy只实现了Python到C的编译,也就是说编译器的后端实现了直接转成了机器码。

当然,编译器后端也可以编译成Java字节码,C#字节码。这个只是暂时没有实现而已。

Pypy之所以难以理解,就是因为很多程序员并没有学习过编译原理,简单介绍下,

1.编译前期,就相当于词法分析器,把源代码分析成中间格式,这种格式是不能执行的,需要进入第2个步骤

2.编译后期生成的文件就相当于字节码,生成了Java字节码就能在JVM上面执行,生成了.Net字节码就能在CLR虚拟机上面运行

Pypy和上面做一下对比就清楚了。

1.RPython的功能就是实现词法的分析

2.Pypy会根据RPython生成的中间文件,进行后期编译,因为RPython具有的静态类型,实现JIT更简单,这也是为什么使用RPython的原因

以上的部分描述并不是特别准确,但是通过简单的描述,可以更加方便的理解Pypy的原理。下面列出来一写参考。

对PyPy的伟大的工作人员和Emscripten的开发人员来说,现实中混合这两种技术几乎同理论上听起来那样容易。PyPy的RPython工具链有 一个可以让你很容易地插入定制的编译器或者甚至插入一个完整的新工具链的扩展的地方。我的github分支就包含把它和Emscripten挂接所必须的 逻辑:

Emscripten努力做到像标准的Posix构建链那样运行,这样只要求你用”emcc”替换通常所用的”gcc”调用。我确实需要做一点调整使它更