파이썬의 구현체

CHAN·2023년 6월 17일
0

CS

목록 보기
1/14
post-thumbnail

파이썬은 인터프리터 언어인가?

제일 처음의 접근은 “파이썬은 인터프리터 언어일까?”라는 의문에서 시작해보겠다.

인터프리터언어란 코드를 실행할 때 별도의 컴파일 작업을 거치기보다는, 한 줄씩 기계어로 변환한 뒤 해당 명령어를 즉각 실행하는 것으로 한 줄씩 해석하고 실행하므로 속도가 느리다.

파이썬은 소스코드를 바이트코드로 컴파일 하고, 바이트코드를 한 줄씩 분석해가며 기계어로 번역을 하는데.. 우리는 컴파일 과정을 보고도, “파이썬 == 인터프리터 언어”라고 단정 지을 수 있을까?

초창기 프로그래밍 역사를 살펴보게되면 ‘인터프리터 언어’를 정의내릴 때 확실한 분류가 아닌 구현의 방식에 따라 정하는 것이었다. 즉, 파이썬의 소스코드가 바이트코드로 컴파일 과정이 일어난다 할지라도 이는 CPU에 의해 동작되는 것이 아닌 가상머신 위에서 동작되며 사용자에게는 암시적으로 단순하게 .py라는 파일만 실행을 하기 때문에 인터프리터의 구현방식이라고 말을 할 수 있다.

또한 python이라는 것은 언어 하나만 일컫는 말이 아니다. 인터프리터, 가상머신, 바이트코드로의 컴파일러 역할을 모두 수행하는 전체를 말하는 ‘구현체’를 뜻한다. 즉, 전체적인 과정을 다 표현한 말이된다. 파이썬 공식 웹사이트에서 다운받을때도 우리는 패키지 전체를 받는 작업을 하는 것이다.

위를 바탕으로 우리는 다음과 같이 말을 할 수 있다. “파이썬은 인터프리터 언어이다. 라는 말이 일반적이게 되었지만 정확한 표현은 파이썬은 컴파일러와 인터프러터가 가능한 실행 구현체이다”

계속 설명을 하게되면 이번 포스팅의 주제에 벗어날 것같아서 이쯤하고, 다시 본론으로 들어가겠다. 파이썬 구현체에는 종류가 다양하며 이번 포스팅에서는 CPython, PyPy, Cython, Jython 등을 알아보겠다.


Cpython

▶ 파이썬의 공식 구현체로, c/c++로 작성된 인터프리터이다. 즉, 가장 일반적으로 사용되는 파이썬 버전이다.
▶ CPython은 인터프리터 이면서 컴파일러이다. 우리가 작성하는 Python 코드를 bytecode로 컴파일 하고 실행한다. 다시 말해, python 코드를 C언어로 바꾸는 것이 아니라 컴파일하여 bytecode로 바꾸고 그 다음에 interpreter(virtual machine)가 실행한다.
▶ Cpython은 gil이라는 전역락이 걸려있기 때문에 싱글 스레드로 동작을 하게 된다. 이것이 파이썬의 장점이자 단점으로 Cpyhton이외에도 다른 구현체에도 적용이 되어있다. 이는 gil포스팅을 다룰때 더 자세하게 설명하겠다.

bytecode를 보기 위해서는 dis 모듈을 통하여 바이트코드를 역어셈블하여 분석해 볼 수 있다.

위와 같이 우리가 작성한 소스코드는 바이트코드로 해석이 되며 가상머신에 의해 바이너리 코드로 변환이 된다. Cpython으로 작성된 코드는 공식 문서를 통해서 확인해볼 수 있다.
https://github.com/python/cpython


pypy

▶ PyPy는 파이썬 언어의 정적 타입으로만 구현된 파이썬 인터프리터로서 통칭 RPython이라 불린다.RPython은 그 자체로 언어가 아니며, Python Language의 부분집합이다.
▶ 소스코드는 RPython 툴체인에 의해 추적 JIT 컴파일러에 의해 바이트코드로 빠르게 컴파일 된 이후 C기반의 바이너리 코드로 변환 후 실행이 된다.
▶ Just-In-Time(JIT)컴파일러를 사용하여 CPython보다 빠르게 실행이 된다. 특히 CPU 사용량이 많은 파이썬 코드에서 빠른 실행속도를 보인다. 그러나 PyPy가 CPython보다 느리게 실행되는 몇가지 경우가 있다. 예를들어 JIT컴파일러는 코드 실행 시작 시간에 추가 오버해드를 초래할 수 있다. 따라서 매우 짧은 실행 시간을 가지는 코드의 경우 PyPy보다 CPython이 더 빠를 수 있다. 또한 CPython확장 모듈을 지원하지는 않는다.


Cython

▶ 쉽게 말하면 C언어에 python문법을 사용할 수 있도록 하는 언어이다. 따라서 cython은 컴파일 언어라 할 수 있고, 표준 c/c++ 컴파일러를 사용하여 기계어로 번역되는 과정을 거친다.
▶ .pyx 확장자를 가진 파일에 Cython 코드를 작성하게 되면, C 함수와 상호 작용할 수 있는 확장 기능을 사용할 수 있다. 이후 Cython 컴파일러를 사용하여 Cython 코드를 파싱하고 타입 추론을 수행하여 C 코드로 변환하는 컴파일 과정을 거친다. 마지막으로 변환된 C 소스 코드를 C 컴파일러를 사용하여 기계어로 컴파일하며 실행된다.

번외로 C언어와 Python문법의 중간 형식인 Cython은 속도차이가 Cpython과 비교하면 빠르다는 결과가 담겨있는 Cython 공식문서를 확인하며 Cython은 마무리 하겠다.
https://cython.readthedocs.io/en/latest/src/quickstart/cythonize.html


Jython

▶ Jython은 자바 가상 머신에서 동작하는 것으로 Python syntax로 작성된 코드를 JVM이 이해할 수 있는 바이트코드로 만들고, 이 바이트코드를 자바가상머신(JVM)이 실행한다.
▶ GC가 variable counting이 아닌 JVM에서 사용되는 GC으로 구현 되어있기 때문에 GIL을 사용하지 않는다는 장점이 있다.

Jython은 Python과 원활한 상호작용을 할 수 있다. 이는 Jython 공식문서에서 확인할 수 있다.
https://www.jython.org/


IronPython

▶ 마이크로소프트에서 개발하는 파이썬의 구현체 중 하나이며, C#의 .NET 프렘임워크를 사용하였다.
▶ 간단한 과정은 다음과 같다.
visual studio -> 도구 -> NuGet -> 패키지 관리자 콘솔 -> IronPython설치 -> DDL자동참조 -> 파이썬파일(.py)불러와 실행


마무리

백준 알고리즘을 풀때, 여러 Python 구현체가 있다는 것에서 호기심이 생겨 알아보게 되었다. 비록, 알고리즘 언어로만 사용을 하지만, 내가 사용하는 언어가 최소한 어떻게 돌아가는지는 알아야 한다고 생각한다. 마지막으로 간단하게 정리하며 마무리 하겠다.

Cpython : 가장 일반적인 기본 Python
pypy : JIT컴파일러를 사용한 파이썬 구현체
Cython : Python 확장 모듈을 작성하기 위한 언어
Jython : JVM을 사용하며, Python과 상호작용이 가능
IronPython :  Python코드를 .NET 언어로 컴파일하여 실행
profile
크게 보는 습관

0개의 댓글