이번 사내 짜투리 프로젝트로 Python 뽀개기를 하고 있다.
물론 Python은 정확히 2년전에 공부를 시작 했었고, 프로젝트도 해본 상태여서 그런지 그렇게 부담은 되지 않는다. 이번 Python 뽀개기의 개인적인 목표는 2.2 이후로 변한 내용을 다시 짚어 보는것과 Python을 Python 답게 쓰는 연습, 그리고 마지막 제일 중요한 C 확장모듈과 확장형에 대한 확실한 이해를 목표로 하고 있다.
어제 확장 모듈과 확장형에 대한 부분을 봤는데, 전에 책을 봤을때와는 다르게 아주 쉽게 다가 왔다. 아무래도 C언어로 프로젝트를 하다보니 C언어 자체에 대한 익숙함과 평상시의 Python 언어의 익숙함이 이런 이해의 폭을 넓힌거 같다.
Python의 헤더 파일을 뒤집어 보고 있으면서 재밋는 표현들도 발견하고 그러는 상황이다.
예를들어 TYPE *PyObject_New(TYPE, PyTypeObject *type) 이라는 함수가 있다. 물론 이것은 C 확장형을 만들때 생성자 부분에서 쓰는 C 함수 이다. 매우 재미난것이 인자로 TYPE을 받아서 쓰는 부분을 넣었다. 그러니까 구조체 자료형이 들어가는것이다. C에서 이런 기능이 지원이 되나? 하고 책을 찾아 봤는데 그런 부분이 없어서 헤더 파일을 찾아 봤더니(objimpl.h) 아래와 같은 define이 되어 있더라.
#define PyObject_New(type, typeobj) ( (type *) _PyObject_New(typeobj))
매크로를 이용해 첫번째 인자로 받은 구조체 형태로 type casting을 하는 부분이다. 매크로를 이용해 여러가지 다양한 결과를 볼 수 있다는것은 알고 있었지만, 이런식의 프로그래밍 방식이 API를 받아서 쓰는 사람들에게 아주 편리하게 다가올 수 있다는것을 느꼈다.
매크로의 강력한 힘을 볼 수 있는 대목이지 않을까 한다.
아무튼 얼마간 Python의 C API부분을 파볼려고 한다. SWIG를 이용해 간단하게 모듈을 만들 수 있지만 조금더 스크립트 언어 자체가 어떻게 구현이 되어 있는지 보기 위해서 분석이 필요할거 같다.
또 한가지 알아볼것은 reference count가 어떻게 구현이 되고 그것을 이용해서 Garbege Collection을 어떤 방식으로 하는지 코드 레벨에서 알아보고자 한다. 한마디로 Memory Manage를 어떤 방식으로 할까? 하는 의문을 좀 풀어보고자 한다.
Python 이번 기회에 꼭 뽀개고 말리라!
Python과 C by from __future__ import dream is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.