Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 便携式操作码生成_Python_Jit_Portability_Opcode - Fatal编程技术网

Python 便携式操作码生成

Python 便携式操作码生成,python,jit,portability,opcode,Python,Jit,Portability,Opcode,我目前正在用Python开发一种非常简单、面向堆栈的编程语言,旨在向编程概念的新手介绍。该语言确实允许用户设计自己的函数。虽然速度对我的语言来说不是一个大问题,但我考虑创建一个“简单”的JIT编译器来为用户函数生成Python字节码 我正在听PyCon关于如何手工编写字节码并从中生成函数的精彩演讲。然而,演讲者确实添加了一个警告,即Python字节代码的特定字节值是不可移植的,甚至可以在3.5.1和3.5.2之间进行更改 因此,我打开了dis模块的文档,看到了dis.opmap,描述如下 字典将

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

我正在听PyCon关于如何手工编写字节码并从中生成函数的精彩演讲。然而,演讲者确实添加了一个警告,即Python字节代码的特定字节值是不可移植的,甚至可以在3.5.1和3.5.2之间进行更改

因此,我打开了
dis
模块的文档,看到了
dis.opmap
,描述如下

字典将操作名称映射到字节码

因此,如果我想将一个
BINARY\u ADD
放入一个byte-code对象,我不需要知道它的具体值。我可以在
dis.opmap
中查找它


这最后让我想到了我的问题:为了使我的JIT编译器与任何版本的Python3兼容,我是否还需要注意任何其他可移植性陷阱(例如,Endianness、每个操作码的参数大小/数量)?我想会有某些操作码只在特定版本中提供。然而,当我在心里设计我的JIT编译器时,除了最基本的指令外,我看不到自己在使用任何东西。

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

现在,我的建议就在这里。东西之所以复杂,是因为很多人都在改变它。你女儿已经11周了,她至少还要3周才能开始编程;)。那么,为什么不创造自己的语言呢?我推荐阅读。它完全免费,指导您使用AST在Java中创建解释语言,然后介绍如何使用字节码和各种块操作创建虚拟机(就像Python一样)。这是一本很容易阅读的书,在每章的结尾都有很好的、发人深省的问题。您可以制作一种完全可定制的语言,最终由您控制。要更改操作码吗?去争取吧希望所有用户都在同一个竞技场上并保证向后兼容性?这是你的编程语言,你想做什么就做什么


在一天结束的时候,这对你来说将是一件有趣的事情。如果您不得不担心操作码被添加、更改或重载,那么您可能不会玩得开心。当最终出现问题时,您将不得不调试您的解释语言、JIT编译器和Python源代码。这只是制作过程中的一个头痛问题。

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

现在,我的建议就在这里。东西之所以复杂,是因为很多人都在改变它。你女儿已经11周了,她至少还要3周才能开始编程;)。那么,为什么不创造自己的语言呢?我推荐阅读。它完全免费,指导您使用AST在Java中创建解释语言,然后介绍如何使用字节码和各种块操作创建虚拟机(就像Python一样)。这是一本很容易阅读的书,在每章的结尾都有很好的、发人深省的问题。您可以制作一种完全可定制的语言,最终由您控制。要更改操作码吗?去争取吧希望所有用户都在同一个竞技场上并保证向后兼容性?这是你的编程语言,你想做什么就做什么


在一天结束的时候,这对你来说将是一件有趣的事情。如果您不得不担心操作码被添加、更改或重载,那么您可能不会玩得开心。当最终出现问题时,您将不得不调试您的解释语言、JIT编译器和Python源代码。这只是一个令人头痛的问题。

我不是在质疑你的意图,“向完全的新手介绍编程概念”不是一种更简单、更有趣的方式吗?也许,但我打算把它作为送给我女儿的礼物。她现在才11周,但我想让她自己成为第一语言。哦,祝你好运,我正在看这个帖子,因为这个问题让我很感兴趣。我没有使用Python 3.x字节码的经验,但是在不同的2.x版本之间,流控制操作码的工作方式有了一些重大的变化——例如,条件跳转操作码是否将其操作数留在堆栈上。当版本更改要求您以不同的方式使用完全不同的操作时,在
dis.opmap
中查找值的帮助有限!我想通过生成Python源代码并在其上调用
exec()
,您可能会发现生成代码更容易。我并不怀疑您的意图,