Рубрики
Без рубрики

COMO CREAR BYTECODE PELADO EN PYTHON

Ridentución Est Es ООН ООН Учебное пособие в ООН COMO CREAR BYTECODE PELADO, O BYTECODE CRUDO EN PYTHON … Теги с Python, Bytecode, программированием, учебником.

Rentucción.

ESTE ES ООН Учебное пособие по уходу за кодом Pelado, o Bytecode Crudo En Python, Primero Había Arrancado Учебник HACER ESTE RU github.io Перо деспомиас ООН Grupo de Pandilleros Virales Me Golpearon Y Me Hicieron Dar Cuenta de que Нет Тейджа Сентидо Утилизар Эсо Тейендо Эста Маравилла.

До реквизиты

  • Conocimientos Básicos de Python
  • Sabre que es un objeto de bytes (bytes объект)
  • Conocer El Concepto de куча

¿ Qué Es Python?

Python Es Lenguaje de Programación Интерпретация Multiparadigma, SOPORTA POLIMORFIMSO, Programación Orientada Objetos (POO/OOP) Y Programación Imperativa.

¿COMO Funciona?

Python como ya se nombró, es un lenguaje интерпретация, esto quiere decir que pasa través de un интерпретатор que conecta lo que la computadora va hacer, con lo que une excriba. Python No Genera Un Código de Máquina Como Generaría Programa Programa EN C O C ++, Sino Que Funciona Más o Menos Como Java, Tiene Una Maquina Virtual Que Interneta Bytecode. Este Intérprete POR DEFECTO ES CPYSHON E EL QUE SE ENCARGA DE EJECUTAR EL BYTECODE EN TU COMPTADORA. ACA NO VAMOS A UTILIZAR CompiLadores, Si No Que Vamos A Manejar Impliteaciones del Lenguaje, Básicamente Intérpretes que Justamente, Интерпретан El Código Escrito Luego de Trustucirlo A Bytecode. Exhinee Una Ampleia Variedad de Estos, E.g Ironpython (Extrementación en C #), Jython (Extrimentación hecha a puro java), Microphython (версия hecha en c y on optimizada para ejecutarse en microcontrolaDores). Acá Hay un esquema de como python funciona y los pasos que el intreprete toma para llegar a ejecutar el código que vos escribiste.

COMO CREAR BYTECODE Утилизатор

Bueno, TeneMos Dos Cosas, Primero, Bytecode Pelado, ES DECIR, BYTES EN HEXADECIMAL PRECTANDO OPCODES Y PARáMETROS, Y EN SEGUNDO LUGAR, TENEMOS CodeType , ООН Tipo de datos en python que nos sirve para crage bytecode que Sí Sirva . Igualmente Para Armar, Hay Que Saber Como Se desarma, Vamos A Utilizar El Módulo дес Para desarmar Nuestra Función, Este Módulo Es Utiliza Para Des-Ensamblar Funciones, Archivos Y Código.

import dis

def suma(x, y):
    return x+y
dis.dis(suma)

La Salida de Ese Retazo de Código Es La Siguiente.

1. 4           0 LOAD_FAST            0(x)
2.             2 LOAD_FAST            1(y)
3.             4 BINARY_ADD
4.             6 RETURN_VALUE
>>>

COMO Podemos Ver Todo Eso Es Bytecode, Ahora La Explicación.

COMO HABRAN SUSTARCADO, Enumeré LAS LINEAS QUE HAY EN LA LA SALIDA CON EL FIN DE HACER MAS Fácil ESTA ESCHACLACION. CADA Instrucción EN Python Tiene Un On Opcode (Código de Operación) Específico, En Este Caso Usamos 3, Load_fast binary_add return_value Vamos ExplicAr Que Hace Cada Uno.

  • Load_fast: Carga Una Variable A La Cima Del Stage (верхняя часть стека).
  • Binary_add: SUMA LOS DOS Valores Que Hay En La Cima Del Stack Y Los Devualve A La Cima Del Stack.
  • Return_value: Devualve El Valor Que Esté En Tos.

Буэно, Ahora Que ExplicaMos Los Opcodes, PodeMos Darnos Una Idey de Como Funciona Internamente Nuestro Cóestigo, Перо Аун Хей Дадус, Дудас Молестас Перо Некезарии, COMO POR EJEMPLO ESTA » Qué es el 4 en la parte izquierda, EL 4 Que Esta Al Inicio de la Primer Linea? “¿Y el 1?”, “¿ Нет Керриамос Карагар х е y para sumarlos en vez de 0 y 1? “.

Буэно, Вой респондент en orden.

  • EL 4 ES La Línea Донс Comienza El Bytecode Des-Ensamblado.
  • Эстос Нумерос Представлен Эль Смещение Де Лос Байты.
  • Эль 0 número (de ahí el 0 (х) y 1 (Y) ). *

¿Cómo Re-Crowsos Nuestra Función Para Hacerla Bytecode?

Буэно, Lo Primero Que Hacemos ES Importar CodeType y FUNGHTYPE (Para Pasarlo Función) Дел Эль Модуло типы

import dis
from types import CodeType, FunctionType

def suma(x, y):
    return x+y

Luego de Esto, Vamos a Crage Nuestro Cóestigo Objeto

import dis
from types import CodeType, FunctionType

def suma(x, y):
    return x+y

# Esto lo voy a explicar despues, son flags
CO_OPTIMIZED = 0x0001
CO_NEWLOCALS = 0x0002
CO_NOFREE = 0x0002

mi_codigo = CodeType(
    2, #argcount
    0, #kwonlyargcount
    2, #nlocals
    2, #stacksize
    (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE), #flags
    bytes([124, 0, 124, 1, 23, 0, 83, 0]), #codestring
    (0,), #constantes
    (), #nombres de las constantes o globales (names)
    ('x','y',), #nombres de variables (varnames)
    'blog_sin_nombre', #filename
    'suma_crafteada', #name (nombre del codigo/funcion)
    9, #Firstlineno (Primer linea donde aparece este cod.)
    b'', #lnotab
    (), #freevars
    () ,#freecellvars
    )

Буэно Буэно … Mouseas Cosas Nuevas, Vamos Explicar Los Argugeos Ver.

CodeType: argcount, kwonlyargcount, nlocals, stacksize, флаги, кодировщик, константы, имена, varnames, filename, имя, firstlineno, lnotab, freevars, FreeCellvars

argcount. Cantidad de Argingos
kwonlyargcount. Contidad de ключевых слов аргументов
nlocals. Numero de переменные локали (en este caso 2, x ey)
укладки Máximo tamaño en bytes que va en eler el al el el eler (en este caso 2 porque x + y queiere dos espacios en el стека
флаги Las Banderas Son So Lo que Dentinanan Algunas Pudiciones del Bytecode, подмышечные изделия Guiaile Por Esta Releaseensia. Nos Vamos A Adentrar RU Флаги EN Учебник ООН Mas Avanzado.
косо ESTO ES UNA LISTA (Array) de bytes continiendo lasequencia en cuestión, en el 124 forita load_fast, 23 binarial_add y 83 return_value
константы Констанцы Una Tupla Con El Valor de Las (Como Numeros Enterop, False, True, Funciones встроенные …)
имен Una Tupla conteniendo el nombre de las constantes Уверенность
варки NOMBRE DE PRIATY LOSALES
имя файла Esta String Creada El Nombre del Archivo, Cuando Нет SE USA ESTE Valor Puede Ser Custerquier String
название NOMBRE DEL CODE OUTER O LA FUNCION
Firstlineno. Представитель La Primer Línea En La Que Se Ejecuta El Código, Carmance Si Rumberamos ООН Archivo, De Otra Manera Puede Ser Cualquier Numero Entero
lnotab. ESTO ES UN MAPEO ENTRE LOS OFFSETS DEL BYTECODE Объект Y El Offset de Las Lineas, Si No Te Interesa Poner Información de las lyneas, подсчеты USAR B ”
Freevars ESTAS переменные LAS VOY ExplicAr EN Учебник ООН Avanzado, SE UTILIZA EN Закрытие
CellVars SESAS Переменные Сын Официав вкрапления Денро де ООН

UNAS ULTIMAS DOS COSAS PARA Remarcar Antes de Pasar A FUNGHTYPE , la primera es que los 0 que que le siguen a los opcodes E.G [124, 0, …] Son El Auranno, y la segunda es uce cada bytecode puede variar de versión en versión, para saber u orientarte sobre el CodeString, подруги Утилизар Эль Сигуенте фрагмент

def suma(x,y):
    return x+y
suma.__code__.co_code

# Salida esperada en Python 3.7.9 (La versión que yo uso)
# b'|\x00|\x01\x17\x00S\x00'
# Los bytes los interpreta como characters, probablemente para que sea mas legible. (Si ponemos chr(124) nos va a imprmír el carácter |)

” CrafteAndo “La Función

Vamos A Utilizar FunctionType Ahora. FunctionType: код, глобалы, имя, аргументы, закрытие

код Código Objeto (Osea, CodeType)
глобали Un diccionario conteniendo las globales del siguiente modo `{” NOMBRE “: Valornombre}` de ese Modo, Nombre Pasa SER ООН ООН ООН, Y LUEGO SE ACCEDE EL COMO SI FUSE UNA
Имя (негационный) Sobreescribe El Valor Que Tiene El Código Objeto)
argdefs (мастер) Una Tupla Que Essifea El Valor de los Argugeos Por дефект
Закрытие (мастер) Una Tupla Que Suple Los Lazos Para Las Freevars

Bueno, Una Vez Esto Claro, Ahora Solo Nos Quedaría Agregar Una FunctionType Con Nuestro Cóestigo Objeto ( mi_codigo ) y llamarla.

import dis
from types import CodeType, FunctionType

def suma(x, y):
    return x+y

Luego de Esto, Vamos a Crage Nuestro Cóestigo Objeto

import dis
from types import CodeType, FunctionType

def suma(x, y):
    return x+y

# Esto lo voy a explicar despues, son flags
CO_OPTIMIZED = 0x0001
CO_NEWLOCALS = 0x0002
CO_NOFREE = 0x0002

mi_codigo = CodeType(
    2, #argcount
    0, #kwonlyargcount
    2, #nlocals
    2, #stacksize
    (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE), #flags
    bytes([124, 0, 124, 1, 23, 0, 83, 0]), #codestring
    (0,), #constantes
    (), #nombres de las constantes o globales (names)
    ('x','y',), #nombres de variables (varnames)
    'blog_sin_nombre', #filename
    'suma_crafteada', #name (nombre del codigo/funcion)
    9, #Firstlineno (Primer linea donde aparece este cod.)
    b'', #lnotab
    (), #freevars
    () ,#freecellvars
    )

_suma = FunctionType(mi_codigo, {})
resultado = _suma(213,3)
print(resultado)

# Salida esperada
# 216

ESTO ES TODO POR AHORA, Descubs Voy a Dubír Учебное пособие в Отро замыкание .

Агументация

Оригинал: “https://dev.to/torswq/python-bytecode-pelado-i-5e2j”