E&K Labs
Published in

E&K Labs

CPython 분석하기

python 3.10 release image

가끔 프로그래밍 입문자들은 종종 의외로 개발자로서 너무 당연하게 받아들여져 온 것들에 대해 질문을 하곤 합니다.

산술 연산이 어떻게 동작하는지, 연산자를 사용해서 객체를 다루는 것과 메서드를 사용하는 것의 차이 등…

대다수의 개발자들은 “원래 그런 것이다.”, “그냥 받아들여라.”라는 느낌으로 말씀하시는 분도 계시고, 종종 해당 언어 선에서 설명을 해주시곤 합니다.

하지만 그도 그럴 것이 라이브러리로 제공된 함수가 아닌 본질적인 내용을 다루기 위해서는 해당 언어의 구현체 소스 코드를 분석할 필요가 있으며, Python의 경우 CPython이 그 예시입니다.

만약 당신이 Python을 공부하고 있지만 어떤 인터프리터를 사용하는지 모르시는 경우, 높은 확률로 CPython을 사용하고 계신 겁니다.

다양한 인터프리터가 존재하지만 이 글에서는 CPython에 대해서만 다뤄보겠습니다.

들어가기에 앞서…

아마 이 글에서 모든 내용을 다루기 어렵고 부족한 부분도 많을 겁니다.

이 글의 작성자인 저는 IT 학과에 재학 중인 학생이며, 글을 읽는 충분히 전문적인 실력을 가지지 못했을 지도 모릅니다.

기본적으로 이 글에서는 제가 탐색 및 분석하면서 겪은 과정에 대해서 설명할 것이며, 아쉬운 부분이나 추가 팁에 대해서는 댓글로 지적을 해주시면 감사하겠습니다.

소스코드를 다운로드 하기

파이썬은 오픈 소스 언어입니다.
Python.org 또는 Github(cpython)에서 쉽게 다운로드 할 수 있습니다.

파일 열고 분석을 준비하기

자신이 익숙하다고 느끼는 IDE를 이용해서 해당 프로젝트를 엽니다.
일반적으로 Visual Studio나 Clion을 추천드리고 싶습니다.

분석을 시작하기

여기서부터는 예시를 이용해서 설명을 하겠습니다.

제가 준비한 시나리오는 다음과 같습니다.

list의 extend와 더하기 연산자의 차이를 설명하기 위해서 내부 구조를 분석하려고 합니다.
extend가 무엇을 반환하는지, None 이외의 다른 값을 반환하는지 알고 싶습니다.

저는 가장 먼저 list가 내부에서 어떻게 정의가 되고 있는지 탐색했습니다.
저는 List가 들어가는 코드 중 가장 그럴듯한 구조체를 찾았습니다.

Jetbrain IDE에서는 find in files를 이용해서 프로젝트 전체를 대상으로 특정 구조체를 탐색할 수 있습니다. (Ctrl + Shift + f / Cmd + Shift + f)

특정 위치에서 PyListObject를 찾을 수 있습니다.

또한 이곳에 extend함수에 해당하는 _PyList_Extend를 찾았습니다.

같은 방식으로 검색을 한 번 더 시도하면 구현부를 찾을 수 있습니다.

그리고 같은 파일에 list_extend가 있습니다.

goto문으로 error레이블로 보내버리는 코드가 있기는 하지만 결과적으로 NULL을 반환하는 것을 알 수 있습니다.

마무리

이렇게 열심히 구현체를 분석을 한다고 해서 코딩 실력이 크게 늘어나지도 않고, 실무에서도 아마 이렇게까지 분석할 일이 크게 발생하지도 않습니다.

기껏해야 해당 라이브러리를 뜯어보는 정도로만 분석하곤 하죠.

대부분 builtins.py나 site-package만 분석해도 원하는 것을 얻을 수 있기도 하고요.

하지만 이런 언어의 구현체를 분석하는 것이야말로 학생으로 IT를 즐길 수 있는 가장 쓸데없어 보이는 도전이 아닌가 생각합니다.

--

--

우리는 아름답고 멋진 블로그 글을 작성합니다. 주 업무는 IT 에서 개발을 하며, 그 외 다양한 예술활동을 합니다.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store