Документация по Python

Модуль dis

В: Документация по Python

Константы в модуле 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', '... 

Что такое байт-код Python?

Python - это гибридный интерпретатор. При запуске программы, она первая монтирует его в байт - код , который затем может быть запущен в интерпретаторе Python (также называемой виртуальной машины Python). dis модуль в стандартной библиотеке можно использовать , чтобы сделать Python байткодом читаемый человеком разборкой классы, методы, функции и объекты кода.

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


 

Интерпретатор Python основан на стеке и использует систему «первым пришел - последним вышел».

Каждый код операции (код операции) на языке ассемблера Python (байт-код) берет фиксированное количество элементов из стека и возвращает фиксированное количество элементов в стек. Если в стеке недостаточно элементов для кода операции, интерпретатор Python завершится сбоем, возможно, без сообщения об ошибке.

Разборка модулей

Чтобы разобрать модуль Python, первое это должно быть превращено в .pyc файл (Python скомпилирован). Для этого запустите

 python -m compileall <file>.py

 

Затем в переводчике запустите

 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

 

Это будет компилировать модуль Python и вывод инструкцию байткода с dis.Модуль никогда не импортируется, поэтому его можно использовать с недоверенным кодом.

Еще от кодкамп
Замечательно! Вы успешно подписались.
Добро пожаловать обратно! Вы успешно вошли
Вы успешно подписались на кодкамп.
Срок действия вашей ссылки истек.
Ура! Проверьте свою электронную почту на наличие волшебной ссылки для входа.
Успех! Ваша платежная информация обновлена.
Ваша платежная информация не была обновлена.