Skip to content
Jade Kim edited this page Jul 1, 2015 · 8 revisions

CPython internals: A ten-hour codewalk through the Python interpreter source code

Interpreter and source code overview - Lecture 1

  • 바이트 코드로 컴파일한 다음, 바이트 코드를 인터프리터가 해석함.
  • 컴파일 과정이 보이지 않을 뿐 존재함.

코드 구조

# 2.7.x 기준
Include/
Objects/ # 파이썬 객체
Python/ # 인터프리터
Lib/ # 표준 라이브러리 (Python 구현)
Modules/ # 모듈 (C 구현)

Opcodes and main interpreter loop - Lecture 2

# 실제 파일 이름, 로그나 디버깅시 출력하는 파일명, 명령어
# 첫번째 파라미터 잘못됨 (2강에서 정정함, 파일 내용을 넘겨야함;)
>>> c = compile('test.py', 'test.py', 'exec')
>>> c # 코드 객체
<code object <module> at 0x10e72e330, file "test.py", line 1>
>>> [byte for byte in c.co_code]
['e', '\x00', '\x00', 'j', '\x01', '\x00', '\x01', 'd', '\x00', '\x00', 'S']
>>> [ord(byte) for byte in c.co_code] # ascii 코드로 변환
[101, 0, 0, 106, 1, 0, 1, 100, 0, 0, 83]

바이트 수는 11개 인데 바이트 코드는 13개? 바이트 코드 포맷이 압축되었기 때문.

~/test [ python2.7 -m dis test.py  
# 줄     # 줄에 포함된 바이트 코드   
# value stack 에 object 1 를 push (function stack 과 다른 addtional stack)                                                             ] 
  1      0 LOAD_CONST          0 (1) 
# value stack top 에서 값을 꺼내서 x 메모리 위치에 넣음
         3 STORE_NAME          0 (x)
  2      6 LOAD_CONST          1 (2)
         9 STORE_NAME          1 (y)
# x 가 가르키는 object 를 읽어서 value stack 에 push.
# 실제로는 value stack 에서 object 를 referencing 함.
# object 1 의 refcount 1 증가.
  3     12 LOAD_NAME           0 (x)
        15 LOAD_NAME           1 (y)
# binary operation 은 value stack 에서 두개를 꺼내서,
# 연산후 결과를 저장함.
        18 BINARY_ADD     
# object 3 을 z 에 저장.     
        19 STORE_NAME          2 (z)
# value stack 에 3을 넣고,
  4     22 LOAD_NAME           2 (z)
# top 값을 출력한다.
        25 PRINT_ITEM          
        26 PRINT_NEWLINE       
        27 LOAD_CONST          2 (None)
        30 RETURN_VALUE        

LOAD_xx : value stack 에 object push STORE_xx : value stack 의 top 을 저장

# opcode.h
...
#define HAVE_ARGUMENT	90
# .. 아래는 argument 가 있는 bytecode

세번째 컬럼 숫자는? Lib/dis.py 참고

byteplay 모듈 추천.

# Python/ceval.c
PyObject *
PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
{
    register PyObject **stack_pointer;  /* Next free slot in value stack */

Frames, function calls, and scope - Lecture 3

Clone this wiki locally