dis — Python 바이트코드 역어셈블러
dis — Python 바이트코드 역어셈블러
dis 모듈은 CPython 바이트코드를 역어셈블링하여 분석하는 것을 지원합니다. 이 모듈이 입력으로 받는 CPython 바이트코드는 Include/opcode.h 파일에 정의되어 있으며 컴파일러와 인터프리터가 사용합니다. (CPython 구현 세부 사항) 바이트코드는 CPython 인터프리터의 구현 세부 사항입니다. 바이트코드가 Python 버전 간에 추가·제거·변경되지 않으리라는 보장은 없습니다. 이 모듈의 사용이 Python VM이나 Python 릴리스 간에 동작할 것이라고 간주해서는 안 됩니다.
본문
명령줄 인터페이스
dis 모듈은 명령줄에서 스크립트로 호출할 수 있습니다:
python -m dis [-h] [-C] [-O] [-P] [-S] [infile]
허용되는 옵션:
-h,--help— 사용법을 표시하고 종료합니다.-C,--show-caches— 인라인 캐시를 표시합니다 (3.13에서 추가).
바이트코드 분석
바이트코드 분석 API는 Python 코드 조각을 Bytecode 객체로 감싸 컴파일된 코드의 세부 사항에 쉽게 접근하게 해 줍니다 (3.4에서 추가). current_offset가 None이 아니면 역어셈블된 코드의 명령 오프셋을 가리킵니다. show_caches가 True이면 인터프리터가 바이트코드를 특수화하는 데 사용하는 인라인 캐시 항목을 표시합니다.
Bytecode 객체의 메서드:
dis()— 바이트코드 연산의 형식화된 뷰를 반환합니다(dis.dis()와 동일하지만 여러 줄 문자열로 반환).info()—code_info()처럼 코드 객체에 대한 자세한 정보가 담긴 여러 줄 문자열을 반환합니다.
분석 함수
dis 모듈은 입력을 원하는 출력으로 직접 변환하는 다음 분석 함수들도 정의합니다.
dis.code_info(x)— 주어진 함수, 제너레이터, 비동기 제너레이터, 코루틴, 메서드, 소스 코드 문자열 또는 코드 객체에 대한 자세한 코드 객체 정보가 담긴 여러 줄 문자열을 반환합니다.dis.show_code(x, *, file=None)— 주어진 객체에 대한 자세한 코드 객체 정보를file(지정하지 않으면sys.stdout)로 출력합니다.dis.dis(x=None, *, file=None, depth=None, show_caches=False, adaptive=False, show_offsets=False, show_positions=False)—x객체를 역어셈블합니다.x는 모듈, 클래스, 메서드, 함수, 제너레이터, 비동기 제너레이터, 코루틴, 코드 객체, 소스 코드 문자열 또는 원시 바이트코드의 바이트 시퀀스를 나타낼 수 있습니다. 모듈이면 모든 함수를, 클래스면 모든 메서드(클래스·정적 메서드 포함)를 역어셈블합니다. 중첩 코드 객체도 재귀적으로 역어셈블합니다.
버전 변경: 3.7(재귀 역어셈블과 depth 매개변수 추가), 3.7(코루틴과 비동기 제너레이터 객체 처리), 3.11(show_caches와 adaptive 매개변수 추가), 3.13(show_offsets 매개변수 추가).
dis.findlinestarts(code)— 코드 객체의co_lines()메서드를 사용하여 소스 코드에서 줄의 시작인 오프셋을 찾는 제너레이터 함수입니다.dis.get_instructions()— 주어진 코드의 각 연산 세부 사항을 담은Instructionnamedtuple 시퀀스를 생성하는 반복자입니다.
Python 바이트코드 명령
get_instructions() 함수와 Bytecode 클래스는 바이트코드 명령의 세부 사항을 Instruction 인스턴스로 제공합니다.
class dis.Instruction — 바이트코드 연산에 대한 세부 사항입니다.
dis는 각 바이트코드 명령의 의미도 문서화합니다. 예를 들어:
LIST_APPEND(i)— 리스트 컴프리헨션을 구현하는 데 사용됩니다.MAP_ADD(i)—value = STACK.pop(); key = STACK.pop(); dict.__setitem__(STACK[-i], key, value)를 구현합니다. 딕셔너리 컴프리헨션에 사용됩니다 (3.1에서 추가).DELETE_NAME(namei)—del name을 구현하며,namei는 코드 객체의co_names속성의 인덱스입니다.DELETE_ATTR(namei)—obj = STACK.pop(); del obj.name을 구현합니다.DICT_UPDATE(i),DICT_MERGE(i)— 딕셔너리를 만드는 데 사용되며, 후자는 중복 키에 예외를 발생시킵니다.CALL_INTRINSIC_2— 두 인자로 내장 함수를 호출하며 성능이 중요하지 않은 기능에 사용됩니다.