您现在的位置: 主页 > 上位机技术 > python > [新闻] CPython / 微软 Pyjion / IBM Python+OMR
本文所属标签:
为本文创立个标签吧:

[新闻] CPython / 微软 Pyjion / IBM Python+OMR

来源:网络整理 网络用户发布,如有版权联系网管删除 2018-08-13 

Pyjion

项目地址:GitHub - Microsoft/Pyjion: Pyjion

开源许可证:MIT

是的,微软近期也加入了给CPython加JIT的大混战。项目名是“Pyjion”,读作“pigeon”(鸽子),因为项目主力成员Dino大大想要有Python的Py音节、JIT的Ji音节的词…就找(sheng)到(zao)了这么个词出来。GJ!

说起Dino Viehland大大,他以前是IronPython与DLR的主力开发之一,后来也参与了Python Tools for Visual Studio(PTVS)的开发。大家用Visual Studio / VS Express开发Python爽不?里面就有Dino大大的功劳。

可见他对Python那可是有深深的怨念…是真爱啊!

言归正传,这Pyjion到底是啥呢?

项目官网的一句话说明是:"A JIT for Python based upon CoreCLR"。它目前的项目目标有三个:

  1. Add a C API to CPython for plugging in a JIT(代码

  1. Develop a JIT module using CoreCLR utilizing the C API mentioned in goal #1(代码
  2. Develop a C++ framework

目标1很简单,就是给CPython添加一组新的C API及其实现,来为外部的JIT编译器提供接入CPython运行时的钩子。这部分目前设计和实现都很直观,看看上面的代码链接的patch就知道它是啥了在解释器入口处添加钩子,当有JIT编译器注册进来时,一个函数在即将开始被解释执行时会先尝试JIT编译,如果成功以后就执行JIT出来的机器码;如果不成功就会把该函数标记为不可JIT编译,以后就不再尝试了。

目标2的描述方式挺有趣的:把CoreCLR当作JIT编译器插入CPython。啥?难道为了JIT还得把整个CoreCLR都拉进来么?太可怕了!

实际上当然没那么糟糕。这个描述方式感觉是故意说得模糊一些。其实Pyjion只是要使用CoreCLR里带着的RyuJIT编译器来为CPython服务。但是当前的RyuJIT的实现依赖了CLR / CoreCLR提供的JIT编译器接口,所以要单独使用RyuJIT的话,得要把原本由CLR / CoreCLR提供的一些服务/接口给模拟出来才行。这个模拟层在Pyjion代码里就是CExecutionEngine、CorJitInfo等类。

换言之,Pyjion自身在pyjit.dll中,而它并不真的需要依赖整个CoreCLR,而只需要其中的RyuJIT(位于clrjit.dll中)及其必须依赖的库(例如gcinfo),然后提供CExecutionEngine、CorJitInfo等类的实现给RyuJIT模拟出它所依赖CoreCLR的一些功能。

据说RyuJIT其实是希望未来与CLR / CoreCLR分离开,变得更独立,便于在诸如Pyjion这样的场景单独使用。目前RyuJIT与CLR确实不是由同一个组负责开发的,要分家也很合理。但未来会如何发展,外界也只能拭目以待了。

那么Pyjion是如何使用RyuJIT的呢?

它并没有实现一个RyuJIT的前端,直接把CPython字节码转换为RyuJIT的IR;而是把CPython字节码先转换为CLR的MSIL字节码,然后再让RyuJIT去把这MSIL编译成机器码,最后安装到CPython运行时里去运行。

这个转换步骤是:

  • AbstractInterpreter类充当CPython字节码的解析器(parser),调用PythonCompiler来生成MSIL。
  • PythonCompiler会把每种CPython字节码的操作映射为合适的MSIL字节码序列。简单的CPython字节码可以直接映射为一条或多条MSIL字节码,而复杂的字节码则映射为Pyjion的intrinsic函数的调用。
    • 例如两个Python整数相加,会映射为对Pyjion提供的“PyJit_Add()”函数的调用,而这个函数会调用回到CPython运行时里的实现。具体生成MSIL的有一个ILGenerator类。
  • 接下来生成出来的MSIL就交给RyuJIT正常编译了,得到编译好的机器码以及一些相关的元数据。

换句话说,Pyjion这种实现JIT编译的方式,实际的效果是把一个Python函数的字节码全部粘合到一起,去掉了解释器循环自身的开销,但是大部分复杂的操作还是调用回到CPython运行时去处理的。

这是一种非常保守的实现方式,很容易保证正确性,但能带来的性能提升也会非常有限。保守是否就意味着容易被接受呢?难说…搞不好会给人太多想像空间结果很失望orz

在JIT编译之外,Pyjion还有没有向CPython注入任何其它东西呢?一点也没有。GC、监控之类的额外功能一概没碰。

IBM Python+OMR

回头一点点更新。先放个传送门讲解背景:如何评价 IBM 的 Ruby + OMR? - RednaxelaFX 的回答



              查看评论 回复



嵌入式交流网主页 > 上位机技术 > python > [新闻] CPython / 微软 Pyjion / IBM Python+OMR
 函数 实现 字节

"[新闻] CPython / 微软 Pyjion / IBM Python+OMR"的相关文章

网站地图

围观()