Buscar..


Constantes en el módulo dis

EXTENDED_ARG = 145 # All opcodes greater than this have 2 operands
HAVE_ARGUMENT = 90 # All opcodes greater than this have at least 1 operands

cmp_op = ('<', '<=', '==', '!=', '>', '>=', 'in', 'not in', 'is', 'is ...
       # A list of comparator id's. The indecies are used as operands in some opcodes

# All opcodes in these lists have the respective types as there operands
hascompare = [107]
hasconst = [100]
hasfree = [135, 136, 137]
hasjabs = [111, 112, 113, 114, 115, 119]
hasjrel = [93, 110, 120, 121, 122, 143]
haslocal = [124, 125, 126]
hasname = [90, 91, 95, 96, 97, 98, 101, 106, 108, 109, 116]

# A map of opcodes to ids
opmap = {'BINARY_ADD': 23, 'BINARY_AND': 64, 'BINARY_DIVIDE': 21, 'BIN...
# A map of ids to opcodes
opname = ['STOP_CODE', 'POP_TOP', 'ROT_TWO', 'ROT_THREE', 'DUP_TOP', '...

¿Qué es el código de bytes de Python?

Python es un intérprete híbrido. Al ejecutar un programa, primero lo ensambla en un código de bytes que luego puede ejecutarse en el intérprete de Python (también denominado máquina virtual de Python ). El módulo dis en la biblioteca estándar se puede usar para hacer que el bytecode de Python sea legible al desensamblar clases, métodos, funciones y objetos de código.

>>> def hello():
...     print "Hello, World"
...
>>> dis.dis(hello)
  2           0 LOAD_CONST               1 ('Hello, World')
              3 PRINT_ITEM
              4 PRINT_NEWLINE
              5 LOAD_CONST               0 (None)
              8 RETURN_VALUE

El intérprete de Python se basa en la pila y utiliza un sistema de último en entrar, último en salir.

Cada código de operación (código de operación) en el lenguaje ensamblador de Python (el bytecode) toma un número fijo de elementos de la pila y devuelve un número fijo de elementos a la pila. Si no hay suficientes elementos en la pila para un código de operación, el intérprete de Python se bloqueará, posiblemente sin un mensaje de error.

Desmontaje de módulos.

Para desensamblar un módulo de Python, primero se debe convertir en un archivo .pyc (compilado por Python). Para hacer esto, corre

python -m compileall <file>.py

Luego, en un intérprete, ejecute

import dis
import marshal
with open("<file>.pyc", "rb") as code_f:
    code_f.read(8) # Magic number and modification time
    code = marshal.load(code_f) # Returns a code object which can be disassembled
    dis.dis(code) # Output the disassembly

Esto compilará un módulo de Python y dará salida a las instrucciones del código de bytes con dis . El módulo nunca se importa, por lo que es seguro utilizarlo con código no confiable.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow