dis — Python 바이트코드 역어셈블러

dis — Python 바이트코드 역어셈블러

dis 모듈은 CPython 바이트코드를 역어셈블링하여 분석하는 것을 지원합니다. 이 모듈이 입력으로 받는 CPython 바이트코드는 Include/opcode.h 파일에 정의되어 있으며 컴파일러와 인터프리터가 사용합니다. (CPython 구현 세부 사항) 바이트코드는 CPython 인터프리터의 구현 세부 사항입니다. 바이트코드가 Python 버전 간에 추가·제거·변경되지 않으리라는 보장은 없습니다. 이 모듈의 사용이 Python VM이나 Python 릴리스 간에 동작할 것이라고 간주해서는 안 됩니다.

출처: Python documentation

본문

명령줄 인터페이스

dis 모듈은 명령줄에서 스크립트로 호출할 수 있습니다:

python -m dis [-h] [-C] [-O] [-P] [-S] [infile]

허용되는 옵션:

  • -h, --help — 사용법을 표시하고 종료합니다.
  • -C, --show-caches — 인라인 캐시를 표시합니다 (3.13에서 추가).

바이트코드 분석

바이트코드 분석 API는 Python 코드 조각을 Bytecode 객체로 감싸 컴파일된 코드의 세부 사항에 쉽게 접근하게 해 줍니다 (3.4에서 추가). current_offsetNone이 아니면 역어셈블된 코드의 명령 오프셋을 가리킵니다. show_cachesTrue이면 인터프리터가 바이트코드를 특수화하는 데 사용하는 인라인 캐시 항목을 표시합니다.

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_cachesadaptive 매개변수 추가), 3.13(show_offsets 매개변수 추가).

  • dis.findlinestarts(code) — 코드 객체의 co_lines() 메서드를 사용하여 소스 코드에서 줄의 시작인 오프셋을 찾는 제너레이터 함수입니다.
  • dis.get_instructions() — 주어진 코드의 각 연산 세부 사항을 담은 Instruction namedtuple 시퀀스를 생성하는 반복자입니다.

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 — 두 인자로 내장 함수를 호출하며 성능이 중요하지 않은 기능에 사용됩니다.

더 알아보기 (Learn more)