Szukaj…


Stałe w module 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', '...

Co to jest kod bajtowy Pythona?

Python jest tłumaczem hybrydowym. Podczas uruchamiania programu najpierw składa go w kod bajtowy, który następnie można uruchomić w interpreterie języka Python (zwanym także maszyną wirtualną Python ). Moduł dis w standardowej bibliotece może być użyty do uczynienia kodu bajtowego Pythona czytelnym dla człowieka poprzez dezasemblację klas, metod, funkcji i obiektów kodu.

>>> 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

Interpretator Pythona jest oparty na stosie i wykorzystuje system „pierwszy na ostatnim”.

Każdy kod operacji (opcode) w języku asemblera Python (kod bajtowy) pobiera określoną liczbę elementów ze stosu i zwraca określoną liczbę elementów do stosu. Jeśli na stosie nie ma wystarczającej liczby elementów na kod operacji, interpreter Pythona ulegnie awarii, prawdopodobnie bez komunikatu o błędzie.

Demontaż modułów

Aby zdemontować moduł Python, najpierw należy go przekształcić w plik .pyc (skompilowany w Pythonie). Aby to zrobić, uruchom

python -m compileall <file>.py

Następnie uruchom tłumacza

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

Spowoduje to skompilowanie modułu Python i wyprowadzenie instrukcji kodu bajtowego za pomocą dis . Moduł nigdy nie jest importowany, więc można go bezpiecznie używać z niezaufanym kodem.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow