Python은 인터프리터 언어인가?

Python은 인터프리터 언어인가?
Photo by NATHAN MULLET / Unsplash

파이썬은 흔히 '인터프리터 언어'라고 불린다.

🤔: "파이썬은 코드를 한 줄씩 읽고 실행하는 인터프리터 언어이다."

C++이나 Go 같은 언어는 소스 코드를 기계어로 번역하는 컴파일 과정을 거치지만, 파이썬은 코드를 한 줄씩 읽어 실행된다는 설명이다. 하지만 과연 Python을 단순히 "인터프리터 언어"라고 정의할 수 있을까?

이 질문에 대한 답을 찾기 위해, Python이 실제로 어떻게 실행되는지 살펴보자.

파이썬은 어떻게 실행되​​는가?

Python 코드는 다음 단계를 거쳐 실행된다:

  1. Python Source Code 작성
  2. Byte Code로 변환 (컴파일 과정)
  3. PVM(Python Virtual Machine)에서 Byte Code 실행
이미지 출처: https://medium.com/@kaushik.k/internal-working-of-python-415572929e7a

예를 들어, 아래와 같은 간단한 Python 코드를 실행한다고 가정해 보자:

print("hello world")

이 코드를 실행하면 Python 인터프리터는 내부적으로 이를 Byte Code로 변환한다. 변환된 Byte Code는 다음과 같이 확인할 수 있다:

import dis
dis.dis('print("Hello World")')
  0           0 RESUME                   0

  1           2 PUSH_NULL
              4 LOAD_NAME                0 (print)
              6 LOAD_CONST               0 ('Hello World')
              8 CALL                     1
             16 RETURN_VALUE

이처럼 Python 코드는 실행 전에 Byte Code로 변환되며, 변환된 Byte Code는 __pycache__ 디렉토리에 저장되는 .pyc 파일 형태로 캐싱될 수 있다.

이후 PVM(Python Virtual Machine)이 Byte Code를 한 줄씩 읽고 실행하는 과정을 거친다. 이로 인해 Python은 플랫폼 독립적인 언어가 될 수 있으며, OS에 맞는 PVM만 있으면 동일한 코드가 어디서든 실행될 수 있다.

__pycache__ 에 저장되는 .pyc(byte code) 파일들

CPython은 무엇인가?

Python을 사용하다 보면 CPython이라는 용어를 자주 접하게 된다. CPython은 C 언어로 작성된 Python의 기본 구현체로, 공식 Python 구현체를 의미한다. 즉, 우리가 일반적으로 사용하는 Python 인터프리터는 사실상 CPython을 의미한다.

Python 공식 GitHub 저장소를 살펴보면 CPython이 존재하는 것을 확인할 수 있다:

GitHub - python/cpython: The Python programming language
The Python programming language. Contribute to python/cpython development by creating an account on GitHub.

Python도 결국 내부적으로는 C 언어로 작성되어 있기 때문에, Python Code에서 Byte Code로의 Complie을 거치지 않고 바로 C 언어로 작성된 함수를 호출할 수도 있다. 대표적으로 Numpy 라이브러리가 이러한 방식을 활용한다.

NumPy는 수학 연산 속도를 극대화하기 위해 Python 인터프리터를 거치지 않고 C 언어에서 직접 실행되는 구조를 가지고 있다. 실제로 NumPy의 GitHub 저장소를 확인하면, 코드의 상당 부분이 C 언어로 작성되어 있음을 알 수 있다.

https://github.com/numpy/numpy

Numpy의 언어 구성

그럼 다른 Interpreter도 존재하는가?

Python은 단 하나의 인터프리터만 존재하는 것이 아니다. 대표적인 Python 구현체들을 살펴보면 다음과 같다:

  • CPython: C 언어로 작성된 표준 Python 구현체.
  • Jython: Python 코드를 Java Byte Code로 변환하여 JVM에서 실행하는 구현체.
  • IronPython: .NET 프레임워크를 활용한 구현체.
  • PyPy: JIT(Just-In-Time) Compiler를 사용하는 구현체.

특히 PyPy는 JIT(Just-In-Time) 컴파일을 사용하여 실행 성능을 극대화한다. JIT 컴파일러는 프로그램이 실행되는 시점에서 즉시(Just-In-Time) 코드를 컴파일하는 방식으로, Java의 JVM과 유사한 원리로 동작한다.

다시 돌아와서, Python은 정말 인터프리터 언어일까?

위키백과에서도 Python의 정의를 찾아보면 "인터프리터를 사용하는 객체지향 언어"라는 다소 모호한 표현을 사용하고 있다. 심지어 영문 위키백과 버전에는 'Interpreted Language'라는 용어조차 등장하지 않는다.

즉, ‘인터프리터 언어’ 혹은 ‘컴파일러 언어’라는 개념은 특정 프로그래밍 언어의 절대적인 속성을 의미하는 것이 아니라, 해당 언어의 실행 방식이 어떻게 구현되었느냐에 따라 달라질 수 있다. Python 역시 PyPy라는 구현체를 통해 JIT 컴파일 방식을 사용하여 성능을 극대화할 수 있다. 대표적으로 Python과 함께 '인터프리터 언어'로 불리는 JavaScript 역시 최근에는 V8 엔진 등을 통해 내부적으로 컴파일 과정을 거쳐 실행 성능을 최적화한다.

Is Python interpreted, or compiled, or both?
From my understanding: An interpreted language is a high-level language run and executed by an interpreter (a program which converts the high-level language to machine code and then executing) on…

앞으로 Python은 어떻게 발전할 것인가?

Python은 오랫동안 "배우기 쉽고 사용하기 쉬운 언어"로 자리 잡아 왔지만, 성능(Performance) 측면에서는 C, Rust, Go 같은 언어보다 상대적으로 느리다는 단점을 지적 받아 왔다. 특히 이러한 점이 대규모 데이터 처리나 실시간 애플리케이션 개발에서 발목을 잡아왔다. 이를 극복하고자 최근 CPython은 컴파일 단계에서 다양한 최적화 기법을 도입하며 성능을 꾸준히 개선하고 있다. 더불어 JIT-compiler의 도입도 준비하며 다양한 실험을 진행하고 있다.

What’s new in Python 3.14
Editor, TBD,. This article explains the new features in Python 3.14, compared to 3.13. For full details, see the changelog. Summary – release highlights: PEP 649: deferred evaluation of annotations…
PEP 744 – JIT Compilation | peps.python.org
Earlier this year, an experimental “just-in-time” compiler was merged into CPython’s main development branch. While recent CPython releases have included other substantial internal changes, this addition represents a particularly significant departure f…
Peephole: CPython은 어떻게 코드를 최적화하는가
많은 스크립트 언어는 ”실행 성능(속도)”이 좋지 않다는 큰 단점을 지니고 있습니다. 이를 해결하기 위해 JIT 런타임을 붙이거나 개발자 스스로 코드를 최적화하기도 하지만 개발자 스스로 코드를 최적화한다고 하여(좋은 코드를 작성했다고 했을 때) 투자하는 시간에 비해 큰 성능향상을 얻기는 어렵습니다. Python은 이러한 문제를 조금이나마 해소시키고자 Peephole이라는 Python 바이트코드 최적화를

Python의 Byte Code Optimization의 일종인 Peephole optimizer

최근 언어와 프레임워크들이 점점 쉬워지고 워낙 고수준으로 추상화되어 개발자가 직접 바이트코드를 보거나 관여할 일은 없어지고 있다. 하지만 내부적으로 들여다보면 언어가 어떻게 컴파일되고, 최적화되는지는 지금도 매우 중요하고 파이썬 개발자도 관심을 가져야 할 영역이라고 생각한다.

N = 1000000
# 1 For-loop
result1 = []
for i in range(N):
  result.append(i)
  
# 2 List comprehension
result2 = [i for i in range(N)]

#2 List Comrehension 방식이 #1 For-loop에 비해 2~3배 이상 빠르다. List Comprehension은 Byte Code를 처리할 때 내부적으로 Function Call 횟수를 줄일 수 있다.

나도 이제부터라도 관심을 가지고 열심히 공부해봐야겠다 😊

Reference

Different types of Python interpreters
Python is, in essence, a specification for the Python programming language, which can be implemented in a variety of ways. A different…
[파이썬] Interpreter(인터프리터) 알아보기
Python(파이썬)의 Interpreter(인터프리터) 확인하기 파이썬은 인터프리터 언어라고 알려져있다. 따라서 보통 생각하는 파이썬의 실행 과정은 다음과 같을 것이다. 하지만 파이썬 인터프리터는 사실 Compiler(컴파일러)와 VM(Virtual Machine)으로 구성돼 있다! 컴파일러에 대한 오해 해결하기 컴파일러만 거치면 바로 기계어(machine code)가 생성되는 거 아닌가? 뒤에 과정은 뭐야? 라고 생각할 수도 있다. 하지만 컴파일러의 역할은 현재 언어를 low-level 언어로 변경하는 것으로 꼭 변환 대상이 기계어일 필요는 없다. 실제로 컴파일러는 변경 대상 및 결과에 따라 다음과 같이 4 가지로 나뉜다. 1. 입력 코드를 바로 기계어로 변환하는 정적 컴파일(Static Compil…
What’s new in Python 3.14
Editor, TBD,. This article explains the new features in Python 3.14, compared to 3.13. For full details, see the changelog. Summary – release highlights: PEP 649: deferred evaluation of annotations…
C언어와 속도 격차 좁힌다··· 파이썬 새 버전, 인터프리터 개선해 30% 성능↑
올해 말 출시 예정인 파이썬 3.14에 새로운 인터프리터가 추가되면서, 기존 코드 수정 없이도 최대 30% 성능 향상이 가능해진다. 첫 번째 베타 버전은 2025년 5월 공개될 예정이다.
파이썬은 인터프리터 언어일까? - 테크톡 발표
파이썬은 인터프리터 언어일까?각자 관심있는 주제를 조사하여 간단히 발표하는 테크톡에서, 나는 평소에 명확히 이해되지 않았던 인터프리터 언어라는 개념에 대해 발표했다. 개요 컴파일이란? 인터프리터란? 가상머신과 바이트코드 파이썬은 무엇인가? 결론…
A quick overview of the Python Virtual Machine — Pt. 1
This is the part one of a series covering aspects of Virtual Machines and how an interpreted programming language performs it’s executions.
In the Making of Python Fitter and Faster
How Python’s recent performance improvements work under the hood

Read more

[논문 리뷰] Search-R1: Training LLMs to Reason and Leverage Search Engines with Reinforcement Learning

[논문 리뷰] Search-R1: Training LLMs to Reason and Leverage Search Engines with Reinforcement Learning

들어가며 이번 시간에는 LLM이 검색 엔진과 상호작용하며 추론(Reasoning)을 수행할 수 있는 강화 학습 프레임워크 Search-R1을 소개합니다. 최근 OpenAI의 Deep Research나 여러 최신 연구에서 알 수 있듯, LLM의 추론 능력뿐 아니라 실시간 검색과 결합된 Reasoning이 큰 주목을 받고 있습니다. 하지만 기존의 RAG(Retrieval-Augmented Generation)이나 Tool-Use 방식은 * 복잡한 다단계

By Yongwoo Song
[독서] 게으른 완벽주의자를 위한 심리학

[독서] 게으른 완벽주의자를 위한 심리학

✒️일을 시작할 수 있는 비결은 그것이 쉽지 않을 것임을 인정하는 것이다. 운이 좋게도 침실을 만드는 일 외에 아무런 할 일도 없는 날은 오지 않는다. 솔직하게 인정하자. 그리고 어려운 일을 할 때 떠오르는 생각과 감정을 통제할 수 있는 전략을 짜자. 시작을 어려워하는 이유는 힘든 감정과 생각에 대응할 전략을 구상하는 대신 이를

By Yongwoo Song
[번역] The Bitter Lesson

[번역] The Bitter Lesson

The Bitter Lesson The Bitter Lesson Rich Sutton March 13, 2019 AI 연구 70년에서 배울 수 있는 가장 큰 교훈은 연산력을 활용하는 일반적인 방법론이 결국 가장 효과적이며, 그것도 큰 차이로 효과적이라는 점입니다. 이러한 결과의 근본적인 이유는 무어의 법칙, 더 정확히는 연산 단위당 비용이 지속적으로 기하급수적으로 감소한다는 일반화된 법칙 때문입니다. 대부분의

By Yongwoo Song