---
title: "인터프리터는 코드를 한 줄씩 읽는 도구일까"
author: "Lee"
published_at: "2026-10-26T05:44:02.407Z"
updated_at: "2026-09-30T10:01:25.548Z"
tags: ["컴퓨터공학","프로그래밍언어"]
canonical_url: "https://ariser.io/@writer_a1cd615ab19e/%EC%9D%B8%ED%84%B0%ED%94%84%EB%A6%AC%ED%84%B0%EB%8A%94-%EC%BD%94%EB%93%9C%EB%A5%BC-%ED%95%9C-%EC%A4%84%EC%94%A9-%EC%9D%BD%EB%8A%94-%EB%8F%84%EA%B5%AC%EC%9D%BC%EA%B9%8C"
ai_assisted: false
---

# 인터프리터는 코드를 한 줄씩 읽는 도구일까

[원문](https://ariser.io/@writer_a1cd615ab19e/%EC%9D%B8%ED%84%B0%ED%94%84%EB%A6%AC%ED%84%B0%EB%8A%94-%EC%BD%94%EB%93%9C%EB%A5%BC-%ED%95%9C-%EC%A4%84%EC%94%A9-%EC%9D%BD%EB%8A%94-%EB%8F%84%EA%B5%AC%EC%9D%BC%EA%B9%8C)

인터프리터는 프로그램의 표현을 받아 그 의미를 실행하는 도구다. 소스 한 줄을 읽고 즉시 수행한다고만 생각하면 여러 구현을 놓친다. 구문 트리를 순회해 계산할 수도 있고, 먼저 변환한 바이트코드를 가상 머신에서 실행할 수도 있다. 실행 대상의 표현과 이를 수행하는 규칙이 핵심이며, 텍스트 줄의 경계는 본질적인 조건이 아니다.

![1+2×3 구문 트리의 곱셈을 먼저 평가해 6을 얻고 덧셈으로 7을 만드는 인터프리터](/api/v1/media/0231b184-bc94-4b54-ad83-3849dcd2cccb)

*인터프리터는 프로그램 구조에 평가 규칙을 적용하며 반드시 소스 줄 단위로 실행하지 않는다.*

## 작은 계산기의 실행 규칙

`1 + 2 * 3`을 구문 트리로 만들었다고 하자. 덧셈 노드의 왼쪽은 1이고 오른쪽은 곱셈 노드다. 인터프리터는 각 노드의 규칙을 적용해 자식 값을 계산하고 곱셈 결과 6을 얻은 뒤 최종 7을 만든다. 변수 노드라면 이름에 연결된 값을 환경에서 찾고, 조건문 노드라면 조건 결과에 따라 한 경로를 선택한다.

함수 호출과 반복은 실행 환경과 상태를 더 요구한다. 인수를 연결하고 지역 이름의 범위를 만들며, 복귀할 위치와 예외 처리를 관리해야 한다. [Cornell의 인터프리터 소개](https://cs3110.github.io/textbook/chapters/interp/intro.html)는 앞부분의 프로그램 분석과 실행 의미를 연결해 설명한다. 인터프리터도 토큰화나 구문 분석 같은 준비 단계를 가질 수 있다.

## 바이트코드로 실행해도 인터프리터다

소스를 간단한 명령의 열로 바꾼 뒤 실행 루프가 명령을 골라 처리할 수 있다. 스택 기반 가상 머신에서는 값을 올리는 명령과 덧셈 명령이 스택을 이용하고, 레지스터 기반 가상 머신은 가상 레지스터를 사용할 수 있다. 구조를 미리 분석하므로 같은 문자열을 매번 처음부터 해석할 필요가 없다.

여기서 가상 머신의 명령은 호스트 CPU가 직접 아는 명령과 다를 수 있다. 인터프리터의 실행 루프가 해당 명령을 읽고 여러 호스트 명령으로 수행한다. 이 추가 선택과 관리 비용이 생길 수 있지만, 구현의 이식성과 실행 상태 관찰, 동적 기능 지원에 유리한 점도 있다. 바이트코드라는 이름만으로 자동으로 빠르거나 느리다고 판단할 수는 없다.

## 컴파일과 해석이 섞일 수 있다

JIT가 자주 실행하는 부분을 기계어로 바꾸면 초기에는 해석하던 프로그램이 이후 다른 경로로 실행될 수 있다. 일부 함수만 컴파일하거나 여러 최적화 단계로 이동하는 실행 환경도 있다. 따라서 언어를 컴파일 언어와 인터프리터 언어로 완전히 나누는 것은 구현 선택을 지나치게 단순화한다. 같은 언어에도 다른 실행기가 존재할 수 있다.

동적 타입과 인터프리터도 같은 개념은 아니다. 타입 검사의 시점은 언어와 실행 규칙에 관한 문제이고, 해석은 프로그램을 수행하는 방법이다. 정적 타입을 검사한 중간 프로그램을 해석할 수도 있고, 동적 타입 언어를 기계어로 컴파일할 수도 있다. 서로 자주 함께 쓰이는 특성이어도 논리적으로 별도 축이다.

인터프리터는 작은 도메인 언어, 설정 규칙, 교육용 언어 구현에서 유용하다. 실행 상태를 직접 관리하므로 오류 위치나 단계별 결과를 제공하기 쉽다. 그러나 외부 작업을 수행하는 기능을 추가하면 의미와 수명, 오류 규칙을 신중히 설계해야 한다. 단순한 표현식 계산기와 실제 범용 실행기의 복잡도는 크게 다르다.

이 개념을 학습할 때는 프로그램 표현, 환경, 실행 상태, 평가 규칙을 따로 적어 보면 좋다. 어떤 노드나 명령이 어떤 값을 만들고 상태를 어떻게 바꾸는지 명확해진다. 인터프리터는 줄 단위 읽기라는 이미지보다 프로그램의 의미를 구체적인 실행 규칙으로 구현한 시스템이라고 이해하는 편이 정확하다.

### 참고 자료

- [Cornell CS3110 — Interpreters](https://cs3110.github.io/textbook/chapters/interp/intro.html)
