Python/ETC / / 2023. 4. 6. 11:23

[파이썬 기본 다지기] 파이썬에서 print("Hello, world")는 어떻게 나오는 걸까? 파이썬의 실행 방식 간략하게 알아보기

1. 파이썬이란?

1-1. 파이썬은 크게 두가지 의미에서 사용된다

  • 프로그래밍 언어 Python의 언어 사양 - 문법이나 작동방식등을 모아둔 것
  • 언어의 사양에 따른 처리방식의 대표격 CPython
    • 귀도 반 로섬이 개발한 본체 CPython의 처리계통을 말한다.
    • 이번 글에서는 CPython을 기준으로 운영체제는 리눅스(도커)를 사용한다.

1-2. 그 외의 파이썬 인터프리터 예시

  • PyPy : 파이썬으로 실행되는 파이썬
  • Jython : 자바로 실행되는 파이썬
  • Pyodide : WebAssembly를 대상으로 하는 파이썬

2. 프로그래밍 언어의 실행방식

2-1. 인터프리터 방식

  • 소스 코드를 한줄 씩 읽어가며 순차적으로 해석하며 움직이는 실행방식
    • 이 순차 해석을 실행하는 프로그램을 인터프리터라고 부른다
    • 스크립트 형식의 언어에 많이 사용되며, Python, Ruby, JavaScript 등이 있다.

2-2. 컴파일 방식

  • 소스코드를 사전에 기계어로 변환 - 컴파일 - 하고나서 실행하는 방식
    • C, C++, Go, Rust등이 있다.

하지만 위의 방식들은 어디까지나 간단하게 범주를 나눈 것으로, 실제로는 입력 형식이나 결과물에 따라 다양한 중간 표현식도 자주 사용.


3. 파이썬이 실행될 때에 대한 간략한 개요

def hello():
	#This is a comment line
    print("Hello, world")
    
if __name__ == "__main__":
	hello()​

3-1. 프로그래밍 언어와 소스 코드

  • 프로그램의 소스코드는 다른 문자열
  • 문자열에 의미를 가지게 하는 것을 언어라고 부른다
    • 예를 들어 "1+2"는 수식인지, 한국어인지, 파이썬의 코드인지 아니면 자바스크립트의 코드인지 모른다.
    • 언어에 따라 같은 문자열이라도 해석이 달라진다
  • 언어 중에서도 특히 컴퓨터에게 해석을 부탁하는 것이 프로그래밍 언어

 

3-2. 프로그래밍 언어와 추상구문트리

  • 프로그래밍 언어는 소스코드의 문자열을 해체해서 컴퓨터가 해석하기 쉬운 형식으로 교환하는 것이 필수적이라고 볼 수 있다.
    • 이 교환을 하는 과정을 Parse(파스)라고 부르며, 이것을 실행하는 것을 Parser(파서)라고 부른다
    • 컴퓨터가 해석하기 쉬운 형태 = Abstract Syntax Tree, AST
  • 프로그래밍언어는 인간이 AST를 구축하기 쉽게 하기위해 존재한다.
  • 이때 파이썬의 파서는 파이썬 3.9 이전과 이후로 나뉜다. 
    • 파이썬 3.9부터는 PEG - Parsing Expression Grammer, PEP617 - 파서를 사용한다.
    • 그 이전에는 LL(1)파서가 이용되었고, 이 파서는 Python 3.10에서 삭제된다.
    • 이 글에서는 3.11.0을 사용한다
  • 주된 흐름은 "구문분석 -> 토큰화 -> 추상화 -> AST -> 컴파일 -> 바이트 코드 -> 실행"으로 이루어진다.
  • 이때 토큰화를 할 때, Tokenize Module이 그 역할을 해준다.
    • 표준 라이브러리인 tokenize모듈은 파이썬 소스코드를 토큰으로 분해해서 출력한다.
    • 토큰은 의미를 가지는 최소 단위

  • 그 후 추상화를 할 때, AST Module이 그 역할을 해준다.
    • 표준 라이브러리인 AST모듈은 파이썬 소스코드를 추상화해서 출력한다.
    • AST는 프로그램으로서 의미를 가지는 정보를 구조체로 표현한 것으로, 이 때 주석은 포함되지 않는다.

  • 그 후 바이크 코드로 변환할 때, dis Module이 그 역할을 해준다.
    • 파이썬 바이트 코드를 역 어셈블한(합친) 결과를 출력
    • 파이썬 바이트 코드는 Python VM(가상머신)이 해석한 기계어

정리하자면 다음과 같다

"구문분석 -> 토큰화(tokenize Module)->

 추상화 -> AST(AST Module) ->

 컴파일 -> 바이트 코드(dis Module) -> 실행"

 

3.2 파이썬 가상머신에 의한 바이트코드 실행

  • 파이썬 가상머신은 파이썬의 바이트 코드를 순차 실행하는 가상 머신이다.
    • 실제 컴퓨터에서는 CPU가 메모리상의 기계어를 순차실행하고 있다.
    • 실제 코드는 Python/ceval.c에 기술되어 있는 거대한 루프이다.
    • 기억 영역에 스택 구조를 사용하는 스택 머신이라고 불리는 계산 모델이다.
728x90
반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유