Python(파이썬)의 Interpreter(인터프리터) 확인하기

파이썬은 인터프리터 언어라고 알려져있다.

따라서 보통 생각하는 파이썬의 실행 과정은 다음과 같을 것이다.

 

https://indianpythonista.wordpress.com/2018/01/04/how-python-runs/

하지만 파이썬 인터프리터는 사실 Compiler(컴파일러)와 VM(Virtual Machine)으로 구성돼 있다!

https://indianpythonista.wordpress.com/2018/01/04/how-python-runs/

 

컴파일러에 대한 오해 해결하기

컴파일러만 거치면 바로 기계어(machine code)가 생성되는 거 아닌가? 뒤에 과정은 뭐야? 라고 생각할 수도 있다. 하지만 컴파일러의 역할은 현재 언어low-level 언어로 변경하는 것으로 꼭 변환 대상이 기계어일 필요는 없다.

 

실제로 컴파일러는 변경 대상 및 결과에 따라 다음과 같이 4 가지로 나뉜다.

1. 입력 코드를 바로 기계어로 변환하는 정적 컴파일(Static Compilation)
2. 입력 코드를 바이트코드로 변환하는 바이트코드 컴파일(Bytecode Compilation)
3. 바이트코드 등의 중간 코드를 기계어로 변환하는 AOT 컴파일(Ahead-Of-Time Compilation)
4. 실행시 최초 한 번에 한해 컴파일을 거치는 JIT 컴파일(Just-In-Time Compilation)

 

파이썬의 컴파일러 : 바이트코드 컴파일

파이썬 컴파일러는 입력 코드를 바이트코드로 변경하는 컴파일러다. 입력 코드를 바이트 코드로 변경할 경우, platform independent(플랫폼 독립적)인 특성을 가지게 된다. 이 경우 바이트 코드를 실행할 VM만 있으면 어떤 플랫폼에서도 사용할 수 있다는 장점이 있다.

JVM과 유사하다고 함

 

파이썬 컴파일러로 얻은 바이트 코드 확인하기 

바이트 코드는 알아보기 힘든 형태로 구성돼있지만 disassembler를 이용하면 그 내용을 확인할 수 있다. 이미 컴파일러를 거쳤기 때문에 disassembler를 거치더라도 일반적인 소스 코드 형태와는 다른 것을 알 수 있다.

https://medium.com/@kaushik.k/internal-working-of-python-415572929e7a

 

바이트 코드를 어떻게 얻는 지

바이트 코드 생성 과정은 파이썬 인터프리터의 종류에 따라서 다르다.

파이썬 인터프리터는 어떻게 구현됐는지에 따라서 CPython, Jython, PyPy 등 다양한 인터프리터가 존재한다.

기본적으로 파이썬은 CPython 인터프리터를 사용하며 각 인터프리터의 특징은 다음과 같다.

  • CPython : C로 구현, Jython 보다 빠름
  • Jython : Java로 구현
  • PyPy : 자주 쓰이는 코드를 캐싱하는 JIT 컴파일 방식으로 속도 개선

 

가장 많이 사용되는 CPython을 기준 바이트 코드 생성 과정을 요약하면 다음과 같다.

- 미리 정해진 규칙으로 소스 코드를 parse tree로 변경한다. 
- parse tree를 단순화한 Abstract Syntax Tree(AST)로 변경한다.
- AST를 Control Flow Graph(CFG)로 변경한다.
- 생성된 CFG를 참고하여 바이트 코드를 생성한다.

 

파이썬 코드의 실행 과정

컴파일러를 통해 얻은 바이트 코드를, 파이썬 VM이 한줄씩 읽으면서 기계어로 변환하면서 코드가 실행된다.

최종적으로 파이썬 VM이 바이트 코드를 한줄씩 기계어로 변환하며 코드실행시키기 때문에, 파이썬이 인터프리터 언어라고 불리는 거 같다.

https://www.c-sharpcorner.com/article/why-learn-python-an-introduction-to-python/

결국 파이썬의 코드 실행 과정을 쭉 따라가면 다음과 같을 것이다.

1. 컴파일러가 소스코드를 입력 받음
2. 문법 오류(Syntax Error)가 있는지 컴파일러가 확인
3. 문법 오류가 있다면 에러 메시지 남기고 중단
4. 문법 오류가 없다면 컴파일러는 소스 코드를 Bytecode로 변환
5. Bytecode가 파이썬 VM에 전달
6. Bytecode와 함께 inputs과 library modules이 파이썬 VM에 입력
7. 파이썬 VM이 한줄씩 Bytecode 처리
8. 런타임 에러(Runtime Error)발생 시 에러 메시지 남김
9. 런타임 에러가 없다면 성공!

참고

 

How Python runs?

First article of 2018 is up! And I decided to go with a very subtle topic this time. Have you ever thought how the Python code is actually executed by the Python interpreter? What steps are carried…

indianpythonista.wordpress.com

 

Internal working of Python

Introduction

medium.com

 

Why are some languages called platform dependent if I can always share the source code?

I was reading about erlang when I read that it is platform-independent, using BEAM as the VM, now I understand that a VM compiles the byte code to machine code and this makes that language machine-

softwareengineering.stackexchange.com

 

How Does Python Code Run: CPython And Python Difference

Refer to this article to learn the execution process of the Python code. This article will provide you the clear difference between CPython and Python.

www.c-sharpcorner.com