인터프리터
Interpreter
소스 코드를 한 줄씩 실행하는 프로그램. Python, JavaScript가 대표적. 컴파일러와 대비.
Interpreter
소스 코드를 한 줄씩 실행하는 프로그램. Python, JavaScript가 대표적. 컴파일러와 대비.
인터프리터(Interpreter)는 소스 코드를 한 줄씩 읽어 즉시 실행하는 프로그램입니다. 전체 코드를 먼저 기계어로 번역하는 컴파일러와 달리, 인터프리터는 실행 시점에 코드를 해석합니다. Python, JavaScript, Ruby, PHP 등 많은 스크립팅 언어가 인터프리터 방식을 사용합니다.
인터프리터의 장점은 즉각적인 피드백과 플랫폼 독립성입니다. 코드를 작성하자마자 바로 실행해 볼 수 있고, 인터프리터만 있으면 어떤 운영체제에서도 동일한 코드가 실행됩니다. 또한 REPL(Read-Eval-Print Loop)을 통해 대화형 프로그래밍이 가능합니다.
반면 실행 속도는 컴파일 언어에 비해 느립니다. 매번 코드를 해석해야 하기 때문입니다. 이를 보완하기 위해 현대 인터프리터들은 JIT(Just-In-Time) 컴파일을 활용합니다. V8(JavaScript), PyPy(Python) 등은 자주 실행되는 코드를 런타임에 기계어로 컴파일하여 성능을 크게 향상시킵니다.
실제로는 순수한 인터프리터나 컴파일러는 드뭅니다. Java는 바이트코드로 컴파일 후 JVM이 인터프리트하고, Python도 .pyc 바이트코드를 생성합니다. 이처럼 대부분의 현대 언어는 컴파일과 인터프리트 방식을 혼합하여 사용합니다.
# 인터프리터 언어 실행 방식 비교
# Python - 인터프리터로 직접 실행
python script.py
# Python REPL (대화형 모드)
python
>>> 2 + 3
5
>>> print("Hello!")
Hello!
>>> exit()
# Node.js (JavaScript 인터프리터)
node script.js
# Node.js REPL
node
> const x = [1, 2, 3];
> x.map(n => n * 2)
[ 2, 4, 6 ]
> .exit
# Ruby 인터프리터
ruby script.rb
irb # Interactive Ruby
# 인터프리터 vs 컴파일러 비교 예시
# 인터프리터 언어 (Python)
# - 작성 → 바로 실행
# - 실행 시 한 줄씩 해석
# - 에러가 해당 줄 실행 시 발견됨
# 컴파일 언어 (C)
# - 작성 → 컴파일 → 실행
# gcc main.c -o main
# ./main
# - 모든 에러가 컴파일 시 발견됨
백엔드 개발자: "Python 서버가 트래픽 피크 때 응답이 느려지는데, 인터프리터 언어라서 한계가 있는 건가요?"
기술 리더: "PyPy를 사용하면 JIT 컴파일로 3-5배 빨라질 수 있어요. 아니면 핫 패스만 Cython으로 작성하는 방법도 있습니다."
백엔드 개발자: "기존 코드 수정 없이 PyPy로 바꿀 수 있나요?"
기술 리더: "대부분의 순수 Python 코드는 호환됩니다. C 확장 모듈 사용 여부만 확인하면 돼요."
면접관: "컴파일러와 인터프리터의 차이점을 설명해 주세요."
지원자: "컴파일러는 소스 코드 전체를 기계어나 중간 코드로 변환한 후 실행하고, 인터프리터는 코드를 한 줄씩 읽어 즉시 실행합니다. 컴파일러는 빌드 시간이 필요하지만 실행이 빠르고, 인터프리터는 즉시 실행되지만 상대적으로 느립니다."
면접관: "JIT 컴파일은 어떤 원리인가요?"
지원자: "실행 중에 자주 호출되는 코드를 감지해서 동적으로 기계어로 컴파일합니다. 인터프리터의 유연성과 컴파일러의 성능을 결합한 방식입니다. V8 엔진이 대표적인 예시입니다."
리뷰어: "이 스크립트가 너무 느린데, eval()을 많이 쓰고 있네요."
작성자: "동적으로 코드를 생성해야 해서요. 다른 방법이 있을까요?"
리뷰어: "eval은 매번 인터프리터가 코드를 파싱하고 실행해야 해서 매우 느립니다. 함수를 미리 정의하고 딕셔너리에서 선택하는 방식으로 바꾸면 훨씬 빠를 거예요."
작성자: "보안 문제도 있다고 들었어요. 리팩토링하겠습니다."