便携式操作码生成

Portable opcode generation

我目前正在 Python 开发一种非常简单的面向堆栈的编程语言,旨在向完全新手介绍编程概念。该语言确实允许用户设计自己的功能。虽然速度对我的语言来说不是一个大问题,但我想创建一个“简单的”JIT 编译器来为用户的函数生成 Python 字节代码。

我正在听 PyCon 关于如何手工制作字节代码并从中创建函数的精彩演讲。但是,发言人确实添加了一个警告,即 Python 字节代码的特定字节值绝不能移植,甚至可以在 3.5.1 和 3.5.2 之间更改。

因此,我调出 dis 模块的文档并看到 dis.opmap,描述为

Dictionary mapping operation names to bytecodes.

因此,如果我想把一个BINARY_ADD放入一个字节码对象中,我不需要知道它的具体值。我可以在 dis.opmap.

中查找

这终于让我想到了我的问题:为了使我的 JIT 编译器与Python 3 的任何版本?我想会有某些操作码只在特定版本中可用。然而,当我在脑子里计算我的 JIT 编译器时,除了最基本的指令,我看不到自己使用任何东西。

我相当确定 Python 字节码没有记录。这是一个混乱的地方,也是一个可怕的地方。我会在最后提供一个替代方案,但首先……为什么它很可怕?首先 Python 被解释为字节码,并且该字节码在虚拟机上得到 运行 。该虚拟机绝对没有记录。您可以查看 here 操作码提交历史记录。请注意,它发生了变化……很多。除此之外,您还可以实现 f-strings 之类的东西,这意味着底层 C 代码将发生变化。这是一个非常混乱的地方,因为有太多人在改变它。

现在,这就是我的建议所在。东西之所以复杂,是因为很多人都在改变它。你女儿 11 周了,她至少要再过 3 周才能编程 ;)。那么,为什么不创建自己的语言呢?我推荐阅读 https://craftinginterpreters.com/contents.html。它是完全免费的,它会引导您使用 AST 在 Java 中制作解释性语言,然后是如何制作带有字节码和各种块操作的虚拟机(就像 Python 所做的那样)。这是一本非常容易阅读的书,每章末尾都有很好的、发人深省的问题。您可以制作一种您最终可以控制的完全可定制的语言。想要更改操作码?去吧。希望所有用户都在同一个竞争环境中并保证向后兼容性?是你的编程语言,随心所欲

归根结底,这对您来说会很有趣。如果您不得不担心操作码被添加、更改或过载,您可能不会玩得开心。当最终出现问题时,您将不得不调试解释语言、JIT 编译器和 Python 的源代码。这真是让人头疼。