인터프리터란 무엇인가요?
인터프리터는 프로그램 전체를 별도의 기계어 파일로 먼저 번역하지 않고, 소스 코드를 직접 실행하면서 그 명령을 차례로 수행하는 프로그램입니다. 파이썬과 루비의 표준 구현이 인터프리터예요.
업데이트: 2026년 9월 24일
- 1print("Hello")
- 2total = 2 + 3
- 3print(total)
- 4print("Done")
실행할 때마다 줄을 다시 번역해요. 오타를 켜도 인터프리터는 3번째 줄에 닿기 전에 "Hello"를 출력하고 나서 멈춰요.
python3 hello.py를 입력하면 출력이 나타나요. 그런데 나중에 폴더를 보면 새 프로그램 파일은 생기지 않았어요. 실제로 실행된 프로그램은 python3 자신, 즉 파이썬 인터프리터예요. 인터프리터가 hello.py를 읽고, 각 문장이 무슨 뜻인지 파악해서 그대로 수행한 거예요. 내일 스크립트를 다시 실행하면 인터프리터는 소스를 처음부터 다시 읽어요.
인터프리터는 이렇게 동작해요
인터프리터는 프로그램이 끝날 때까지 한 가지 순환을 반복해요. 다음 명령을 가져오고, 무슨 뜻인지 파악하고, 수행하고, 다음으로 넘어가요. 일하는 동안 프로그램의 변수를 자기 메모리에 보관하기 때문에, total = price * 3은 몇 줄 위에서 정한 price를 쓸 수 있어요.
이것을 가장 분명하게 볼 수 있는 곳이 REPL(읽기, 평가, 출력, 반복)이라고 부르는 대화형 모드예요. 파일 이름 없이 python3를 입력하면 Enter를 누르는 순간 각 줄이 실행돼요.
>>> price = 4
>>> price * 3
12
실제 인터프리터에는 준비 단계가 하나 더 있어요. 표준 파이썬 인터프리터인 CPython은 먼저 파일 전체를 단순한 명령들의 간결한 목록인 바이트코드로 컴파일하고, 그다음 그 바이트코드를 명령 하나씩 실행하는 루프를 돌려요. 한 줄의 바이트코드를 출력해 볼 수 있어요.
파이썬 3.12는 아래처럼 출력해요(다른 버전은 세부 내용이 달라요).
0 0 RESUME 0
1 2 LOAD_NAME 0 (price)
4 LOAD_CONST 0 (3)
6 BINARY_OP 5 (*)
10 STORE_NAME 1 (total)
12 RETURN_CONST 1 (None)
각 줄이 인터프리터 루프의 한 단계예요. price의 값을 가져오고, 상수 3을 가져오고, 둘을 곱하고, 결과를 total에 저장해요. 이 중 어느 것도 기계어가 아니에요. 그 자체가 컴파일된 C 프로그램인 인터프리터가 각 단계를 수행해요.
오류는 그 줄이 실행될 때 드러나요
인터프리터는 실행하면서 나아가기 때문에, 프로그램이 실수에 부딪히기 전에 실제 작업을 할 수 있어요. 이 코드를 실행하면 충돌하기 전에 처음 두 줄이 출력돼요.
Step 1: starting
Step 2: still fine
Traceback (most recent call last):
...
ZeroDivisionError: division by zero
구문 실수는 다르게 동작해요. CPython은 어느 부분이든 실행하기 전에 파일 전체를 바이트코드로 컴파일하기 때문이에요. 3번째 줄을 print("Step 3:" 10)로 바꾸면(쉼표가 빠졌어요) Step 1조차 아무것도 출력되지 않아요.
SyntaxError: invalid syntax. Perhaps you forgot a comma?
그래서 "인터프리터는 코드를 한 줄씩 실행한다"는 말은 반만 맞아요. 문법은 먼저 파일 전체에 대해 검사하고, 0으로 나누기나 존재하지 않는 이름 사용 같은 나머지 오류는 해당 줄이 실행될 때에야 발견돼요. 앞의 경우는 구문 오류를 참고하세요.
컴파일러와 인터프리터의 차이
컴파일러는 프로그램이 실행되기 전에 전체를 별도의 파일로 번역해요. 인터프리터는 매번 프로그램 자체를 실행해요. 실제 차이는 여기서 나와요.
| 컴파일러 | 인터프리터 | |
|---|---|---|
| 일이 일어나는 때 | 프로그램 실행 전에 한 번 | 프로그램을 실행할 때마다 |
| 결과물 | 별도의 파일 (실행 파일 또는 바이트코드) | 별도의 프로그램 파일 없음 |
| 사용자에게 주는 것 | 컴파일된 프로그램 | 소스 코드와, 사용자 컴퓨터에 설치된 인터프리터 |
| 오류 검사 | 실행 전에 프로그램 전체의 문법, 그리고 타입 언어라면 타입 오류까지 | 보통 문법을 먼저 검사하고, 다른 오류는 문제 있는 줄이 실행될 때 나타남 |
| 수정하고 실행하기 | 바꿀 때마다 다시 컴파일 | 저장하고 다시 실행 |
| 속도 | 더 빠름, CPU가 기계어를 직접 실행 | 더 느림, 실행 중에 명령마다 해석 |
| 이식성 | CPU와 운영체제마다 다시 컴파일 | 인터프리터가 있는 곳이면 같은 소스가 실행됨 |
| 대표적인 언어 | C, C++, Rust, Go | Python, Ruby, PHP, Bash |
빡빡한 산술 루프에서는 속도 차이가 실제로 커요. 같은 루프가 CPython보다 컴파일된 C에서 몇 배나 빠르게 돌 수 있어요. 대부분의 시간을 네트워크, 디스크, 사용자를 기다리는 데 쓰는 프로그램이라면 차이가 너무 작아서 느끼지 못하는 경우가 많아요.
컴파일이냐 인터프리트냐는 언어의 성질이 아니에요
언어는 규칙의 모음이고, 컴파일러나 인터프리터는 그 규칙을 구현한 프로그램이에요. 같은 언어를 두 방식으로 모두 실행할 수 있고, 인기 있는 언어 대부분은 둘을 섞어요.
- 파이썬. CPython은 바이트코드로 컴파일한 뒤 인터프리트해요. 또 다른 구현인 PyPy는 자주 실행되는 코드를 실행 중에 기계어로 바꾸는 JIT(Just-In-Time) 컴파일러를 더했어요.
- 자바.
javac가 소스를 미리 바이트코드로 컴파일해요. 그다음 자바 가상 머신이 그 바이트코드를 인터프리트하고, 가장 바쁜 메서드를 기계어로 JIT 컴파일해요. 자바 11부터는java Main.java로 소스 파일 하나를 메모리에서 먼저 컴파일해 바로 실행할 수 있어요. - 자바스크립트. 브라우저와 Node.js는 V8 같은 엔진을 써요. 이 엔진은 처음에는 코드를 인터프리트하다가, 프로그램이 실행되면서 자주 쓰이는 부분을 기계어로 컴파일해요.
- C와 C++. 거의 항상 GCC, Clang, MSVC로 미리 컴파일해요.
python3 app.py # Python: interpreter, bytecode behind the scenes
node app.js # JavaScript: V8 interprets, then JIT-compiles
javac Main.java # Java step 1: compile to Main.class
java Main # Java step 2: the JVM runs the bytecode
어느 쪽이든 인터프리터나 가상 머신은 프로그램의 런타임 환경의 일부예요. 프로그램이 실행되는 곳이라면 어디든 설치되어 있어야 해요.
흔한 오해
- "인터프리터는 각 줄을 기계어로 번역한다." 전통적인 인터프리터는 여러분의 프로그램을 위한 기계어를 만들지 않아요. 명령을 읽고, 인터프리터 안에 이미 컴파일되어 있는 코드로 그것을 수행해요. 실행 중에 기계어를 만드는 것은 JIT 컴파일러가 하는 일이에요.
- "인터프리터 언어에는 컴파일 단계가 없다." CPython, 루비의 YARV, PHP는 모두 먼저 바이트코드로 컴파일해요. 이 단계가 자동이고 눈에 보이지 않아서 놓치기 쉬울 뿐이에요.
- "인터프리터 방식은 느리다." JIT 컴파일이 그 차이를 상당 부분 좁혔어요. V8은 Electron 위에 만들어진 VS Code 같은 대형 애플리케이션을 돌릴 만큼 자바스크립트를 빠르게 실행해요.
- "파이썬이 곧 인터프리터다." 파이썬은 언어예요. CPython, PyPy, MicroPython은 그 언어를 위한 서로 다른 인터프리터이고, 속도와 지원하는 라이브러리가 다를 수 있어요.
다음으로 읽을 내용
비교의 나머지 절반은 컴파일러란 무엇인지, 그리고 컴파일러가 소스 코드를 어떻게 기계어로 바꾸는지에서 읽을 수 있어요. 인터프리터가 함께 가져오는 다른 것들은 런타임 환경 페이지에서 설명해요. 인터프리터를 직접 써 보려면 파이썬 스크립트를 실행해 보거나 파이썬 플레이그라운드를 열어 보세요.
자주 묻는 질문
파이썬은 컴파일러인가요, 인터프리터인가요?
C++는 인터프리터 방식인가요, 컴파일러 방식인가요?
인터프리터와 컴파일러 중 어느 쪽이 더 빠른가요?
REPL이란 무엇인가요?
python3나 node를 입력하면 열려요. 파일을 만들지 않고 작은 아이디어를 시험해 볼 때 유용해요.한 언어가 컴파일 방식이면서 인터프리터 방식일 수도 있나요?
javac가 바이트코드로 컴파일한 다음 JVM이 인터프리트하고 JIT 컴파일해요. 파이썬이나 자바스크립트 같은 언어에도 인터프리터와 컴파일러가 모두 있어요.