엔지니어 블로그
[Python] CPython 본문
CPython
코드로 작성된 프로그램을 실행하기 위해서는 Compile 이라는 과정을 거치게 된다. 간단히 설명하자면 프로그래밍 언어로 작성된 고수준 언어를 저수준 언어로 번역하는 프로그램이다. JAVA,C 등의 많은 프로그래밍 언어에서 Complier가 이 과정을 수행하고 있으며, Compiler가 없다면 프로그램을 실행하는 것은 불가능 할 것이다.
하지만 Compile이 필요하지 않은 언어도 있다. 대표적인 Interpreter 언어 Python이다. 개발자 입장에서 Compile 과정이 필요없다. 소스코드를 한줄씩 읽어 바이트코드로 변환해주고 Python Virtual Machine을 통해 실행 결과를 얻는다. Python에서 Interpretion을 담당하고 있는것이 CPython이다.
하지만 CPyhon의 내용을 잠시만 들여다봐도 내부에서 Compile 과정이 일어난다. 그렇다면 Python은 Interpreter 언어로 불리는 것이 맞는걸까?
1. CPyhton이란?
CPython은 Python의 표준 구현체다. python.org 제공 배포판이 바로 CPython이고, 일반적으로 사용하는 python 명령어는 CPyhton을 Interpreter로 한다.
- 이름의 의미
- C로 구현된 Python Interpreter
- 특징
- C언어로 구현되어 있어 Python과 C의 결합이 용이
- 표준 라이브러리를 비롯한 대부분의 라이브러리가 CPyhon에 최적화
2. CPython의 소스코드 실행 과정
Python 소스코드가 실제로 CPython에서 실행되는 과정은 다음과 같다.
소스코드
-> 어휘분석
-> 구문분석
-> 의미분석
-> 바이트코드(.pyc) 생성
-> PVM에서 해석 및 실행
3. 그렇다면 왜 Python은 Interpreter 언어로 불리는가?
위의 실행 과정을 보면 일반적인 Compiler의 작동과 비슷하다. 그럼에도 불구하고 Python이 Interpreter 언어로 불리는 이유는 다음과 같다.
- CPython 내부의 Compiler가 생성한 결과가 기계어가 아닌 중간 표현형식인 Bytecode
- Bytecode는 실행 시점에 PVM에서 다시 해석하여 CPU에서 실행 가능한 명령어로 변환
- 명시적인 Compile이 필요 없음
4. Why C?
CPython의 코드는 순수한 C로 작성되어 있다. 그렇다면 왜 굳이 C로 작성했을까? 이것을 알기 위해 컴파일러 작동 방식을 알아 볼 필요가 있다.
1. Self-Hosting Compiler
셀프 호스팅 컴파일러는 컴파일 하는 언어로 작성된 컴파일러다. Go 언어가 대표적 예시다.
2. Source-to-Source Compiler
소스 투 소스 컴파일러는 컴파일러가 있는 다른 언어로 작성된 컴파일러다. Python이 그 예시다.
Go언어의 경우 개발 초기 C로 작성된 컴파일러를 사용했지만 현재 Go로 작성된 컴파일러를 사용한다. 일반적으로 무엇이든 실행하기 위해 먼저 확립된 언어로 작성하게 된다. Python도 마찬가지로 C로 작성된 컴파일러를 사용했고 여전히 사용중이다. .ssl, sockets 저수준 운영체제 API에 액세스 하기 위해 C를 유지중이다.(Windows,Linux 커널의 네트워크 소켓 작업, 파일 시스템 작업 등 많은 API가 C로 작성됨)
4. Jython,PyPy..
CPython외에도 다양한 Interpreter가 존재한다. Jython,IronPython,PyPy가 대표적이다. 각각 Java,.NET,Python을 통해 Interpreter를 작성한 것이다.
5. 결론
Python의 내부 실행 과정을 살펴봤다. CPython이라는 Interpreter가 작동하고 있었고, 실제로 내부에서 Compile이 발생한다. 하지만 이것은 사용자가 확인할 수 있는 지점이 아닌점, 사용자는 명시적으로 Compile 작업을 수행하지 않는다는 점으로 미루어 봤을 때 Python은 Interpreter 언어로 보는 것이 타당하다고 생각한다.
'Programming Language > Python' 카테고리의 다른 글
[Python] Threading #1 Mutex로 스레드 제어 (1) | 2025.04.01 |
---|---|
[Python] Dictionary 정렬 (0) | 2025.03.10 |