【发布时间】:2021-08-06 04:47:12
【问题描述】:
我目前正在使用 Python 开发一种非常简单的面向堆栈的编程语言,旨在向新手介绍编程概念。该语言确实允许用户制作自己的功能。虽然速度对我的语言来说不是一个大问题,但我想创建一个“简单”的 JIT 编译器来为用户的函数生成 Python 字节码。
我正在聆听 PyCon 关于如何手工制作字节码并从中制作函数的精彩演讲。但是,演讲者确实添加了一个警告,即 Python 字节码的特定字节值绝不可移植,甚至可以在 3.5.1 和 3.5.2 之间更改。
所以,我调出dis 模块的文档,看到dis.opmap,描述为
字典映射操作名称到字节码。
因此,如果我想将BINARY_ADD 放入字节码对象中,我不需要知道它的具体值。我可以在 dis.opmap 中查找它。
这终于让我想到了我的问题:为了使我的 JIT 编译器与任何版本的 Python 兼容,我是否需要注意任何其他可移植性陷阱(例如,字节序、每个操作码的参数大小/数量) 3?我想会有某些操作码仅在特定版本中可用。然而,当我在头脑中研究我的 JIT 编译器时,除了最基本的指令之外,我看不到自己使用任何东西。
【问题讨论】:
-
我不是在质疑您的意图,“向新手介绍编程概念”不会是一种更简单有趣的方式吗?
-
也许吧,但我打算把它作为我女儿的礼物。她现在只有 11 周,但我想自己制作她的第一语言。
-
aww,祝你好运,我正在看这个帖子,因为这个问题我也很感兴趣
-
我没有使用 Python 3.x 字节码的经验,但是在各种 2.x 版本之间,流控制操作码的工作方式发生了一些重大变化 - 例如,是否有条件跳转操作码将其操作数留在堆栈上。当版本更改需要您以不同的方式使用完全不同的操作时,在
dis.opmap中查找值的帮助有限!我认为您可能会发现通过生成 Python 源代码并在其上调用exec()来更轻松地进行代码生成。
标签: python jit portability opcode