通过“组装”字节码生成python代码对象(现在也包括面向函数/ast的api!)

BytecodeAssembler的Python项目详细描述


peak.util.assembler是一个处理大多数 低级字节码生成细节,如跳转偏移、堆栈大小跟踪, 行号表生成、常量和变量名索引跟踪等。 这样,您可以将注意力集中在 字节码而不是这些机械问题。

除了面向低级操作码的api之外,还可以直接生成特定的 python字节码,这个模块还为 从高级规范生成代码。这个框架完成了 将树状结构转换为线性字节码所需的工作 指令,包括编译时常数折叠功能。

有关详细信息,请参阅字节码汇编程序参考手册。

版本0.6之后的更改:

  • 修复生成类操作码的错误堆栈计算

版本0.5.2之后的更改:

  • 完全模拟向后兼容的符号反汇编 在python 2.7上的jump-if-true和jump-if-false操作码–现在测试 在Python2.7上运行clean。
  • 支持Python2.7的向后模拟 jump_if_false_或_pop有关早期python版本的说明;这些 模拟也用于字节码汇编程序的内部代码生成, 在2.7+上实现最高性能(在旧版本上性能不变 版本)。

版本0.5.1之后的更改:

  • 最初支持Python2.7的新操作码和语义更改,主要是 通过宏模拟旧版本的行为。(0.5.2确实是 允许使用字节码汇编程序的包在2.7上运行的快速修复版本 无需更改任何代码生成;将来的版本将 为新的和更改的操作码以及测试提供适当的支持 在反汇编列表中不显示虚假差异的套件 在python 2.7.下)

版本0.5之后的更改:

  • 修正了python 2.5+
  • make_closure的错误堆栈大小计算

版本0.3之后的更改:

  • 新节点类型:
    • for(iterable,assign,body)–定义一个"for"循环
    • 解包序列(节点)–解包长度为len(节点)的序列, 然后生成给定的节点。
    • localassign(name)–发出一个store_faststore_deref本地存储根据给定名称而定。
    • 函数(body,name='<;lambda>;',args=(),var=none,kw=none,defaults=()) –从body创建嵌套函数并将其放在堆栈上。
    • if(cond,then_u,else_u=pass)–"if"语句模拟
    • listcomp(body)lcappend(value)–实现列表理解
    • yieldsmt(value)–在 蟒蛇2.5+
  • 代码对象现在是iterable,产生(offset,op,arg)三元组, 其中,op为数值,arg为数值或
  • 代码对象'.code()方法现在可以接受"父"代码对象, 将子代码的自由变量链接到父代码中的单元格变量。
  • 添加了从类方法初始化代码对象的 名称和参数规格
  • 代码对象现在有一个嵌套(name,args,var,kw)方法 创建一个子代码对象,该对象的文件名与提供的 名称/参数规格
  • 修正了iter和yield的不正确堆栈跟踪 操作码< /LI>
  • 确保如果使用了操作码,则设置co_generator标志
  • 更改测试,以便在dis.dis 而常量折叠优化器不会在这方面产生虚假的失败 软件包的测试套件。

版本0.2之后的更改:

  • 添加了套件tryExcept,以及tryFinally节点类型
  • 添加了执行静态或动态属性访问的节点类型 不断折叠
  • 修正了当 指定了复制行号
  • ast节点的repr()不包含1参数的尾随逗号 节点类型更多。
  • 添加了一个不生成代码的pass符号,一个compare()节点类型 进行n路比较,以及执行此操作的节点类型 逻辑运算。
  • compare-op()方法现在接受像"<;="这样的运算符字符串, "不在""异常匹配"等,以及数字操作码。 有关 接受字符串(在cmp\u op元组中)。"<;"也被接受为 的别名!="
  • 添加了验证前向跳转偏移量不超过64KB范围的代码,以及 支持绝对向后跳转到位置>;64KB。

版本0.1之后的更改:

  • 常量处理已固定,因此不会混淆 不同类型(例如1.0true)或相同的不可损坏对象 (例如,两个空列表)。
  • 删除了nilast_curry()folding_curry(),替换为 nodeType()装饰器和fold_args()请参阅文档 更多详细信息。
  • 添加跨跳跃的堆栈跟踪,全局验证堆栈级别预测 一致性和自动拒绝生成死代码的尝试。它 现在几乎不可能意外地生成字节码 使口译员崩溃。(如果你想办法,告诉我!)

版本0.0.1之后的更改:

  • 添加了大量新文档和示例
  • 全封闭、循环和闭合支持
  • 从树生成高级功能代码,带有智能标签和 块、常量折叠、扩展性、智能局部变量名等。
  • .label()方法重命名为.here()以将其与 新的smart标签对象。
  • 文档和测试被移到readme.txt而不是assembler.txt
  • 添加了一个实现类似"switch"的语句模板的演示 如何扩展代码生成系统以及如何滥用最终结束 在字节码中实现"计算goto"。
  • 各种错误修复

有一些特性还没有测试,并不是所有的操作码都可以 完全支持。还要注意以下限制:

  • 跳转到尚未定义的标签不能跨越大于65535的距离 字节。
  • python 2.3中的dis()函数有一个错误,使其显示不正确 两个相邻行号之差为 大于255。(为了解决这个问题,test_套件使用了一个更高版本 ,但请注意,如果使用 dis()使用Python2.3并使用分隔开的行号。)

如果您发现任何其他问题,请通知我。

请记住这是一个正在进行的工作,并且api可以 如果我能想出更好的方法来做某事,就要改变。

有关此软件的问题和讨论应指向 邮件列表峰值

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

推荐PyPI第三方库


热门话题
安卓 java。lang.NullPointerException:uriString   如何使IntelliJ IDEA支持Java 7功能?   如何最好地将这个java方法翻译成python   eclipse java。lang.IllegalStateException:设置后无法更改位置   java连接超时在HttpClient中不起作用   java在Eclipse中添加JPA连接   java我需要帮助来构建一个返回数组的方法   c#从Internet Explorer 8中的ActiveX控件中提取数据   java使用varargs传递参数对,而不会遇到错误模式   java使用jQuery读取txt文件时无法返回函数外的值   ApachePOI如何在Java中获取“last saved by”Office文件属性   to date JavaTo_date()在可调用语句中   向maven添加依赖项时出现java问题   java Selenium服务器,在ASP中单击定位器。NET网页工作不稳定