나도 CPython 파헤치기

이주환·2023년 8월 11일
1

안녕 씨파이썬?

목록 보기
1/3
post-thumbnail

Hello, CPython

CPython Tutorial을 시작하기에 앞서 이전 챕터에서 IDE 구성 및 필수 커맨드 툴 킷 설치 방법을 다루지만 기본적인 환경 구축이 되어 있는 상태였기 때문에 CPython 컴파일 부터 시작한다.

CPython 시작 환경 구성


책에서 권장하는 버전
Python: 3.9

실습 환경
PC: Macbook M1 Pro
Python: 3.9
IDE: Visual Studio Code

git clone --branch 3.9 https://github.com/python/cpython.git

💻 실습

3.1 macOS에서 CPython 컴파일하기: @book p.21

Github에서 클론 해서 가져온 프로젝트 CPython 루트 디렉터리에 configure 파일이 존재한다. 이 파일을 실행 하면 빌드 과정을 자동화 할 수 있는 Makefile을 생성한다.

$ ./configure

바이너리 파일 빌드 명령어

$ make -j2 -s

위 과정을 거치는데 몇 분 정도 소요된다. 그 시간동안 책을 조금 읽고 있었는데, 책에서는 빌드 중 오류가 발생 하면 make는 일부 패키지가 빌드 되지 않았다고 표시한다.

빌드 되지 않은 패키지들을 개발에 사용하지 않을거라면 괜찮다고 안내한다.
자세한 내용은 공식문서에서 확인 하라고 한다.

일단, 위에 안내하는 명령어를 입력 후 에러가 나타났다. 혹시 모를 찜찜함에 공식문서에 접속하여 가이드를 따라 명령어를 다시 입력했다.

주의 사항
>> 3. 테스트는 경험 상 시간이 오래 걸렸으니 빌드 후 파이썬만 실행 하는 것을 추천

공식문서 안내 가이드

1. Build Python, on UNIX and macOS use

./configure --with-pydebug && make -j

2. and on Windows use:

PCbuild\build.bat -e -d

3. Run the tests

./python -m test -j3

본인과 환경이 비슷하다면 위 명령어를 입력 하는 순간 권한 없음 오류를 만난다.

명령어 수정 후 테스트 실행

./python.exe -m test -j3

출력 된 결과

== Tests result: FAILURE ==

398 tests OK.

2 tests failed:
    test___all__ test_urllib2_localnet

25 tests skipped:
    test_curses test_dbm_gnu test_devpoll test_epoll test_gdb
    test_ioctl test_lzma test_msilib test_multiprocessing_fork
    test_ossaudiodev test_smtpnet test_socketserver test_spwd
    test_startfile test_tix test_tk test_ttk_guionly test_urllib2net
    test_urllibnet test_winconsoleio test_winreg test_winsound
    test_xmlrpc_net test_zipfile64 test_zoneinfo

Total duration: 14 min 1 sec
Tests result: FAILURE


Hello, CPython!

본인은 Mac OS임에도 exe 확장자를 실행 시켰는데, 윈도우용 바이너리라서 exe확장자가 붙은 것이 아니라고 알려준다.
macOS는 대소문자를 구분하지 않는 파일 시스템을 사용하기 때문에 디렉터리 혼동을 피하고자 확장자를 추가 했다고 하며, make install 또는 make altinstall을 시스템 설치 전에 실행 하면 확장자를 제거한 파일이 생긴다고 한다.

👏 원리 설명

3.4 make 입문: @book p.26

C언어 컴파일 과정에서 make {cfile.c}로 컴파일 할 때 시스템의 외부 라이브러리를 링크 하는데 라이브러리 위치를 명시 하지 않는 것 처럼 CPython에서도 주로 Make와 configure를 통해 C/C++ 프로젝트 빌드 자동화에 사용한다.

이렇게 위 처럼 ./configure 를 통해 autoconf가 필요한 라이브러리들의 위치를 찾아서 Makefile에 붙여 넣는다.

생성 된 Makefile은 셸 스크립트와 비슷하며 타깃이라는 명령 집합으로 이루어져 있다.

예를 들어 docclean 타깃은 생성 된 문서 파일들을 rm 명령으로 삭제 한다고 가정한다.

docclean:
	-rm -rf Doc/build
    -rm -rf Doc/tools/sphinx Doc/tools/pygments Doc/tools/docutils

make docclean으로 위 처럼 작성 된 타깃을 실행 해볼 수 있다.

아래는 make 타깃 실행 규칙이다.

$ make [options] [target]

make를 인자 없이 실행 하면 기본 타깃이 실행 된다.

  • CPython의 기봇 타깃인 all은 CPython 전체를 컴파일한다.

make options table


옵션 표와 함께 make 실행하기

$ make -j2 -s [target]
  • j2: make가 2개의 작업을 동시에 실행 함
    - CPU 코어가 2개 이상이라면 코어 개수 만큼의 작업을 동시에 실행함
  • s: make가 실행한 명령을 출력하지 않음

CPython: build target table


CPython: test target


이 아래로 정리, 설치, 기타 이 3개의 타깃 테이블과 설명이 존재 하는데 필요 할 때 따로 찾아보고 더 이상 기록에 남기진 않겠다.

👏 원리 설명

프로파일 기반 최적화: @book p.35

PGO
최초 컴파일 후에 일련의 테스트를 실행 해 애플리케이션을 프로파일링 하는 최적화 방식

컴파일러는 분석된 프로파일을 사용 해 바이너리를 수정 해서 성능을 개선한다.

프로파일링 사용하기

$ ./python.exe -m test --pgo

0:00:00 load avg: 1.80 Run tests sequentially
0:00:00 load avg: 1.80 [ 1/43] test_array
0:00:01 load avg: 1.80 [ 2/43] test_base64
0:00:02 load avg: 1.80 [ 3/43] test_binascii
0:00:02 load avg: 1.80 [ 4/43] test_binop
0:00:02 load avg: 1.80 [ 5/43] test_bisect
0:00:02 load avg: 1.89 [ 6/43] test_bytes

이 테스트는 자주 사용되는 C 확장 모듈과 타입을 사용하기 때문에 프로파일링에 적합하다.
PGO 프로세스는 시간이 많이 걸리기 때문에 컴파일 시간을 짧게 유지 하기 위해 이 책에서는 제외 됐다.

하지만, 수정한 CPython을 실제 환경에 배포 하려면 리눅스와 macOS에서는 ./configure 를 --enable-optimization 플래그와 함께 실행 하고, 윈도우는 Build.bat을 --pgo 플래그와 함께 실행 하라고 되어있다.

요약

앞으로 소스 코드를 탐색 하고 수정 하면서 컴파일 단계를 많이 반복하게 될테니 개발 환경에 재컴파일 바로가기를 추가 해 시간을 절약 하도록 하자.

profile
안녕하새우

1개의 댓글

comment-user-thumbnail
2023년 8월 11일

이렇게 유용한 정보를 공유해주셔서 감사합니다.

답글 달기