-
Notifications
You must be signed in to change notification settings - Fork 0
CPython internals
Jade Kim edited this page Jul 1, 2015
·
8 revisions
CPython internals: A ten-hour codewalk through the Python interpreter source code
- 바이트 코드로 컴파일한 다음, 바이트 코드를 인터프리터가 해석함.
- 컴파일 과정이 보이지 않을 뿐 존재함.
코드 구조
# 2.7.x 기준
Include/
Objects/ # 파이썬 객체
Python/ # 인터프리터
Lib/ # 표준 라이브러리 (Python 구현)
Modules/ # 모듈 (C 구현)
# 실제 파일 이름, 로그나 디버깅시 출력하는 파일명, 명령어
# 첫번째 파라미터 잘못됨 (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 */