一个蟒蛇编译器和一个蟒蛇发生器。

pybytecode的Python项目详细描述


#python字节码编译器

此应用程序提供将python文件转换为其**.pyc**文件的功能。python**.pyc**文件是*compiled*python文件,编译成字节码。如果您想知道为什么有时候python会生成这些和"pycache"文件夹,那是出于性能原因。

本练习的目的是公开python的内部,以便有些人可以尝试编写在python虚拟机上运行的自己的语言。许多较新的语言(如scala和clojure)都在jvm上运行。它们之所以变得流行,是因为它们直接包含了电池,可以说,因为它们能够导入所有现有的Java库。Python可以说是一种比Java更干净的语言,因此,有一个功能性语言,例如,很好地与Python集成——这是遵循Pythonic原则的语言(见‘导入这个’)将是有利的。我计划学习这样一种语言,但我也想为其他人打开防洪闸门。


*4字节*:**幻数**
2。*4字节*:**时间戳**
3。*4字节*:**填充**
4。*n字节*:**封送处理的代码对象**

**幻数**对应于所需的python版本。您可以通过**imp**模块获得这个数字:
``import imp`
``magic number=imp.getmagic()`
2。**时间戳**对应于创建它的时间。如果有一个对应的**.py**文件,它会检查这个时间戳和那个文件是否匹配。否则,如果.pyc文件是独立的,那就无关紧要了。您可以通过使用**time**和**struct**模块来获得这个数字:
``import struct,time``
``timestamp=struct.pack('i',int(time.time())``
3。**padding**只是在代码对象之前填充,基本上是4字节的0序列。这个填充似乎只在Python3中,所以**对于Python2省略它**。有时第一个字节有一些值,但它似乎不相关。您可以使用这个bytestring:
``b'a\x00\x00\x00```
4。**代码对象**是封送处理的python代码对象。您可以使用``compile``命令将一段python代码编译成一个代码对象,以便在开始时对此进行测试。命令签名是``compile(code_segment,'file_name,'exec')```。您需要确保"file_name"与要将**.pyc**文件写入的文件名相对应。这里有一个简单的例子:
``import marshal`
``filename='addnum.py``
``code\u segment='a=123+321\nprint(a)``
``code=compile(code\u segment,filename,'exec')``
``marshalled\code\u object=marshall.dumps(code)`


这:

python文件,应该可以!

$python addnum.pyc
444





您可以查看所需参数的帮助(``help(codetype)``),并且有很多关于python代码对象不同部分的在线文档。[阿尔贝托的stackoverflow帖子](http://stackoverflow.com/questions/16064409/how-to-create-a-code-object-in-python)提供了对每一篇文章相当不错的概述。我已经包括了把他的代码作为"codegen.py"的一部分。有关操作码,请参阅本自述文件的参考资料一节,以便您可以开始为自己的语言编写字节码编译器,该编译器可以使用python虚拟机读取!

您可以通过从命令行运行"python codegen.py"或"pycodegen"来测试代码生成器。



tml python字节码指令)。

*您可以在[include/opcode.h]中查看来自python源代码的所有python操作码(https://github.com/python/cpython/blob/master/include/opcode.h)。

*如果有疑问,请使用``code=compile(code_segment,my_file_name,'exec')``创建所需段类型的代码对象,然后使用``dis.dis(code)``对其进行反汇编,然后通过转换为操作码和随之而来的参数来创建字节码(请参见codegen.py and操作码.h)。

*虽然这两个程序都不再维护,但您可能需要查看字节码程序集的[峰值](http://peak.telecommunity.com/devcenter/bytecodeassembler)和[字节码](http://code.google.com/p/byteplay/)。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java两个构造函数?   java for(inti:x)做什么?   java如何将一个bean的构造函数参数传递给嵌套bean   java从易趣链接提取项目ID   java多线程BufferedReader   安卓全新应用程序在R.java中抛出“语法错误,插入“}”以完成类体”   java Spring启动依赖注入请求范围的bean   java给定的时间,然后约定和异常处理。和莫基托和朱尼特在一起   与Android Studio的java Oracle数据库连接   在web服务器(Heroku)上承载可运行jar文件(Discord bot)的java   java如何每隔n秒在imageview中更改图像   java不理解“volatile”关键字   java使用JPA编写自定义SQL查询   java如何使用filechannel作为参数来编写对象