수색…


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 가상 시스템 이라고도 함)에서 실행할 수 있습니다. 표준 라이브러리의 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

파이썬 인터프리터는 스택 기반이며 선입 선출 시스템을 사용합니다.

파이썬 어셈블리 언어 (바이트 코드)의 각 연산 코드 (opcode)는 스택에서 고정 된 수의 항목을 취하여 고정 된 수의 항목을 스택에 반환합니다. opcode에 스택에 충분한 항목이 없으면 오류 메시지없이 파이썬 인터프리터가 중단됩니다.

모듈 분해

파이썬 모듈을 디스 어셈블하려면 먼저 .pyc 파일 (파이썬 컴파일)로 변환해야합니다. 이렇게하려면 다음을 실행하십시오.

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

이것은 파이썬 모듈을 컴파일하고 dis 와 함께 바이트 코드 명령어를 출력합니다. 신뢰할 수없는 코드와 함께 사용하는 것이 안전하기 때문에 모듈을 가져올 수 없습니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow