본문 바로가기

컴퓨터공학/python

[python] 파이썬이 동작하는 방식에 대해서2 (가상머신)

이번 글에서는 파이썬이 소스코드를 동작시키는 과정을 살펴보도록 하겠습니다.

이런 다이어그램을 보신적이 있으신가요?

컴파일러가 인터프리터안에 포함되어있는걸 보고 놀라지 않으셨으면 좋겠습니다.

인터프리터는 컴파일러와 가상머신이라는 두 부분으로 나누어져 있기때문입니다.

 

그렇다면 컴파일러가 하는 일은 무엇일까요?

컴파일러는 우리가 작성한 소스 코드를 바이트 코드로 변환시켜 주는 역할을 합니다.

 

바이트코드란?

lower level 코드이며 플랫폼에 독립적이며 소스코드를 내부적으로 저장하고있죠.

 

 

그렇다면 파이썬 가상머신(PVM)란 무엇일까요?

바로 파이썬의 런타임 엔진입니다.

다시말해 PVM은 python 시스템의 일부이기 때문에 별도의 설치가 필요하지 않고 항상 존재합니다.

 

 

그럼 본격적으로 소스코드를 동작시키는 과정에 대해 알아볼까요?

 

먼저  소스 코드( .py확장자가 있는 파일)를 실행할 때 Python은 먼저 이를 바이트 코드로 컴파일합니다. 

바이트 코드는 바이너리 기계 코드가 아니며 대상 시스템에서 직접 실행할 수 없습니다.

실제로 Python 가상 머신(PVM)이라고 하는 가상 머신에 대한 명령 집합이죠.

 

그렇게 컴파일한 후 바이트 코드는 실행을 위해 PVM으로 전송됩니다.

 

PVM은 바이트코드를 실행하는 인터프리터라고 할 수 있으며 Python 시스템의 일부입니다.

 

바이트코드는 플랫폼에 독립적이지만 PVM은 대상 시스템에 따라 다릅니다.

 

Python 프로그래밍 언어의 기본 구현은 C 프로그래밍 언어로 작성된 CPython입니다.

 

CPython은 파이썬 소스 코드를 바이트 코드로 컴파일하고 이 바이트 코드는 CPython 가상 머신에 의해 실행됩니다.

 

 

Cpython interpreter의 컴파일러가 하는 일에 대해 조금 더 구체적으로 들어가볼까요?

 

이것은 크게 4가지의 파트로 나누어 설명할 수 있습니다.

Parse tree와 AST 구조도

첫번째,

소스 코드가 Parse Tree로 변환됩니다.

두번째

Parse Tree를 AST(Abstract Syntax Tree) 로 변환시켜 줍니다.

세번째

AST를 CFG(Control Flow Graph)로 변환시켜 줍니다.

Control Flow Graph(CFG)

네번째

CGF로 부터 바이트코드를 생성합니다.

 

 

그렇게 소스 코드가 바이트코드로 변환되면 PVM으로 전달이 되고

이후 코드의 명령을 반복하는 거대한 loop를 돌게 합니다. 

 

 

 

 

이렇게 이번 글에서는 파이썬이 동작하는 방식에 대해서 알아보았습니다.

파이썬 공식 문서에 의하면 3.9버전 이후에는 Parse 모듈은 더 이상 사용되지 않을 것이고 향후 제거될것이라고 하며 

AST 모듈을 이용하여 AST 생성 및 컴파일 단계를 이용할 수 있다고 하니 참고하시기 바랍니다.