我目前正在Python中开发一种非常简单的面向堆栈的编程语言,旨在向编程概念的新手介绍。该语言确实允许用户制作自己的功能。虽然速度对我的语言来说不是一个大问题,但我想创造一个";简单的";JIT编译器为用户的函数生成Python字节码。
我听了PyCon关于如何手工编写字节码并从中生成函数的精彩演讲。然而,演讲者确实添加了一个警告,即Python字节码的特定字节值是不可移植的,甚至可以在3.5.1和3.5.2之间变化。
因此,我提出了dis
模块的文档,并看到了dis.opmap
,被描述为
将操作名称映射到字节码的字典。
因此,如果我想将BINARY_ADD
放入字节码对象中,我不需要知道它的具体值。我可以在dis.opmap
上查一下。
这最后引出了我的问题:为了使我的JIT编译器与任何版本的Python 3兼容,我是否需要注意其他可移植性陷阱(例如,Endianness、每个操作码的参数大小/数量(?我想会有一些操作码只在特定版本中提供。然而,当我在心里计算JIT编译器时,除了最基本的指令外,我看不到自己在使用任何东西。
我很确定Python字节码是未记录的。这是一个混乱的地方,也是一个可怕的地方。最后我会提供一个替代方案,但首先。。。。为什么它很可怕?首先,Python被解释为字节码,该字节码在虚拟机上运行。那个虚拟机肯定没有记录。您可以在这里查看操作码提交历史记录。请注意,它发生了变化。。。很多除此之外,还可以实现f字符串之类的东西,这意味着底层的C代码将发生变化。这是一个非常混乱的地方,因为很多人都在改变它
现在,这就是我的建议。事情之所以复杂,是因为很多人都在改变它。你女儿11周了,她至少还要3周才能编程;(。那么,为什么不制作自己的语言呢?我推荐阅读https://craftinginterpreters.com/contents.html.它是完全免费的,并引导您使用AST在Java中制作一种解释语言,然后介绍如何使用字节码和各种块操作(就像Python一样(制作虚拟机。这是一本很容易阅读的书,在章节的末尾有很好的、发人深省的问题。你可以制作一种完全可定制的语言,最终由你控制。想更改操作码吗?试试看。希望所有用户都在同一个游戏环境中,并保证向后兼容性?这是你的编程语言,你想做什么就做什么。
在一天结束的时候,这将是一件对你来说很有趣的事情。如果你不得不担心操作码被添加、更改或重载,你可能不会玩得很开心。当最终出现问题时,您将不得不调试您的解释语言、JIT编译器和Python的源代码。这只是一个令人头疼的问题。