본문 바로가기

컴퓨터공학/python

[python] 파이썬이 동작하는 방식에 대해서 1

이번 글에서는 파이썬이 동작하는 방식에 대해서 알아보도록 하겠습니다.

Reference


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

 

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


알아보기에 앞서 가상머신과 커널 그리고 쉘에 대해 간단하게 알아보면서 시작해 보겠습니다.

 

가상머신이란?

 

 

커널(Kernel)이란?

 

컴퓨터 부팅시 부트로더에 의해 로드되어 항상 메모리에 상주하며 s/w h/w 사이의 커뮤니케이션을 관리하는 핵심 프로그램으로

입출력 관리와 s/w의 요청을 h/w가 처리할 수 있도록 변환 해줍니다.

 

쉘(Shell)이란?

 

사용자와 운영체제 사이의 커뮤니케이션이 가능하도록 명령어를 해석해 줍니다.

쉘은 GUI 와 CLI로 나뉩니다.

GUI는 그래픽을 이용해서 

CLI는 명령어를 이용해서 

시스템과 커뮤니케이션 할 수 있는데요 간단하게 정리만 하고 넘어가도록 하겠습니다.

 

GUI(Graphical User Interface)

사용자가 창, 아이콘 메뉴와 같은 그래픽 요소를 사용해 시스템과 상호작용합니다.

그래서 명령을 기억할 필요 없이 마우스 클릭이나 드래그로 작업이 가능합니다.

하지만 메모리 사용량이 많고 실행속도가 느립니다.

 

Ex) 아이콘, 파일탐색기 시작메뉴 등

 

CLI(Command Line Interface)

사용자가 명령(Command Line)을 사용하여 시스템과 상호작용합니다.

명령을 입력하면 터미널 또는 쉘이 해당 명령을 해석함으로써 작용 합니다.

메모리 사용량이 적고 실행속도가 빠릅니다.

 

Ex) CMD, Termainal

 

 

 

 

파이썬은 기본적으로 IDE(통합 개발 환경)라는 GUI 쉘과 편집기가 결합된 도구를 제공해 주고 있습니다.

IDE(PyCharm, Jupyter Notebook 등)를 이용해서 파이썬 코드를 파일로 저장하는 것은

같은 코드를 다른 프로그램에서 다시 작성할 필요 없이 쉽게 재사용할 수 있다는 장점을 지니고 있습니다.

 

코드의 재사용을 위해 소스 코드를 함수 형태로 작성한 후, 다른 소스에서 import 구문을 사용하여 반입하는 방식으로 쉽게 재사용이 가능합니다.

파이썬으로 작성된 파일은 기본적으로 그 자체가 모듈이 될 수 있습니다.

(모듈이란 가져다 사용하기 적합한 형태의 파이썬 파일로, 특정한 상수나, 함수, 클래스를 정의한 내용이 될 수 있습니다.)

 

import로 다른 모듈을 반입하게 되면 파이썬 해석기는 모듈이나 패키지 이름에 기반하여 해당 모듈의 이름으로 되어 있는 디렉토리나 파일을 찾기 시작합니다.

해당 모듈의 파일을 찾았다면, 우선 해당 파일을 한 번 컴파일하여 바이트코드 모듈로 만드는데

이 과정은 해당 모듈의 파일을 처음부터 끝까지 읽어서 실행하는 것과 동일합니다.

따라서 gcd.py 파일은 import gcd를 수행하는 시점에 완전하게 로드되어 평가(실행)됩니다.

그래서 실제 우리가 원하는 동작을 하기 전에 해당 소스코드에 들어있는 내용이 전부 실행되는 것입니다.

 

 

 

 

Compile to byte code

컴파일한다는 것은, 소스 코드를 해석하여 원하는 상태로 변환 하는 것을 의미하고
파이썬에서 컴파일은 소스 코드를 Low Level의, 플랫폼 독립적인코드로 변환 하는 것을 의미합니다.

파이썬의 컴파일 과정은 아래와 같습니다. 

  1. 소스 코드를 Parse Tree 로 변환합니다
  2. Parse Tree 를 AST(Abstract Syntax Tree) 로 다시 한 번 변환 합니다
  3. AST를 제어 흐름 그래프(Control FlowGraph)로 변환 합니다
  4. 제어 흐름 그래프를 Byte code 로 변환 합니다.

이 과정을 거치고 나면, .pyc 파일이 생성 됩니다.
.pyc 파일은 파이썬 3.2 버전 이전에는 .py 파일과 같은 경로에 생성되고
3.2 이후 버전에서는 __pycache__ 디렉터리 아래에 생성 됩니다.

.pyc 파일은 다음과 같은 경우에 유용하게 사용할 수 있습니다

  1. AWS Lambda 에 배포할 때 용량 제한을 피할 수 있습니다.
    (여러 라이브러리는 .pyc 파일로 컴파일된 것만 배포)
  2. 파이썬 프로그램을 작성하여 판매 하는 경우

추가

.pyc 파일을 python app.py 와 같은 명령어로 실행 한다고 반드시 생성 되는 것은 아닙니다.
.py 파일이 다른 스크립트에 의해 import 되었을 경우에만 생성 됩니다.

import 문이 호출되었을 때는 아래와 같은 확인을 합니다

  1. 파이썬은 import 되는 스크립트의 컴파일 된 파일이 존재 하는지 확인 합니다
  2. 없다면, .pyc 파일을 생성하고 불러 옵니다.
  3. 있다면, 내부 timestamp 에서 .py 파일 보다 .pyc 파일이 더 오래 되었는지 확인합니다

→ 한 마디로, 소스 코드가 변경 되면 자동으로 새 .pyc 로 갱신합니다
→ 대화형 프롬프트(REPL) 환경에서 입력한 코드에 대해서는 .pyc 파일을 생성하지 않습니다

 

 

파이썬 가상 머신 PVM

PVM 은 파이썬의 런타임 엔진 입니다.
파이썬 시스템의 일부이기 때문에 별도의 설치가 필요하지 않고, 항상 존재 합니다.

소스 코드를 .pyc 와 같은 바이트 코드 형태로 변환한 뒤 PVM 으로 전달하면
파이썬 가상 머신은 이것을 실행해 줍니다.

 

 

추가로, 프로즌 바이너리는 내가 작성한 파이썬 프로그램을 우리가 아는 실행 파일로(.exe)
변환 하는 것 또한 가능합니다.

이를테면, PyInstaller, py2exe, py2app 등을 통해서 실행 가능한 바이너리로 만들 수 있습니다.

프로즌 바이너리를 만들 때에는 바이트 코드와, 실행 환경(PVM)
그리고 의존성 모듈을 단일 패키지로 만듭니다.
그리고 그 결과물은 실행 가능한 형태 (.exe 등) 가 됩니다.