본문 바로가기
Computer Science/FAQ

컴파일러와 인터프리터의 차이점은 무엇인가요?

by minhi 2024. 9. 4.

방학 동안 CS 책 한 권을 완독했고 앞으로는 (가능한) 하루에 CS 관련 빈출 질문 하나씩 공부하고 정리해보기로 했다.

 

그 첫번째 질문은 '컴파일러와 인터프리터의 차이점은 무엇인가요?'이다.

 

컴파일러 언어
코드가 실행되기 전 단계인 컴파일 타임소스 코드 전체를 한 번에 머신 코드로 변환한 후 실행한다.

 

구체적인 과정은 아래와 같다.

  • 전처리: 소스 코드의 주석을 제거하고 헤더 파일을 병합하여 매크로를 치환한다.
  • 컴파일러: 오류 처리, 코드 최적화 작업을 하며 어셈블리어로 변환한다.
  • 어셈블러: 어셈블리어를 목적 코드로 변환한다.
  • 링커: 프로그램 내에 있는 라이브러리 함수 또는 다른 파일들과 목적 코드를 결합하여 실행 파일을 만든다.

 

인터프리터 언어
코드가 실행되는 단계인 런타임소스 코드 한 줄바이트 코드로 변환한 후 실행한다.

 

구체적인 과정은 아래와 같다.

  • 소스 코드 로딩
    • 디스크로부터 하나 또는 여러 개의 파일을 로딩하거나 REPL을 통해 사용자로부터 직접 입력 받는다.
    • 로딩 결과, 소스 코드 문자열을 출력한다.
  • 소스 코드 토큰화
    • 인터프리터는 일반 문자열을 이해할 수 없기 때문에 소스 코드 문자열을 토큰화한다.
    • 소스 코드 토큰화 결과, 토큰 시퀀스를 출력한다.
  • 토큰을 구문 트리로 변환
    • 토큰의 우선 순위를 토대로 토큰 시퀀스를 추상 구문 트리로 변환한다.
  • 바이트 코드 생성
    • 바이트 코드는 operator와 operand에 대한 바이트 시퀀스로 이루어진다.
    • 이 과정은 선택적이나, 인터프리터의 성능*과 재사용성**을 높일 수 있다는 장점을 갖는다.
  • 프로그램 실행
    • 구문 트리 또는 바이트 코드를 가상 머신을 이용해 실행한다.

* 코드에 대한 구문적, 논리적 분석 없이 바로 명령을 수행한다.

** 한 번 생성된 바이트 코드는 저장되어 그 이후로 프로그램이 실행될 경우 인터프리터는 앞의 과정을 반복하지 않고 바이트 코드를 재사용한다.

더보기
  • 머신 코드
    • CPU가 이해할 수 있는 바이너리 코드
    • 머신 코드는 CPU에 의해 바로 실행할 수 있다.
  • 바이트 코드
    • 가상 머신이 이해할 수 있는 바이너리 코드
    • 바이트 코드는 가상 머신에 의해 각각의 하드웨어 아키텍처에 맞는 기계어로 다시 컴파일된다.
    • ex) Java의 target 폴더에 .class 파일, Python의 __pyache__ 폴더에 .pyc 파일

 

컴파일러와 인터프리터의 비교
  컴파일러 인터프리터
입력 소스 코드 전체를 입력으로 받는다. 소스 코드 한 줄을 입력으로 받는다.
출력 머신 코드를 출력한다. 바이트 코드를 출력한다.
실행 프로그램 실행이 컴파일과 별개로 이루어진다. 프로그램 실행이 인터프리터의 일부로 이루어진다.
오류 모든 오류를 한꺼번에 표시한다. 줄의 오류를 하나씩 표시한다.
개발 속도 개발 과정에서 컴파일 시간이 소요되므로 개발 속도가 느리다. 개발 속도가 빠르다.
실행 속도 이미 기계어로 변환되어 있으므로 실행 속도가 빠르다. 실행 시마다 기계어로 변환해야 하므로 실행 속도가 느리다.
언어  C, C#, C++, Java PHP, Perl, Ruby, Javascript, Python

 

덧붙여 컴파일러 언어는 컴파일 과정에서 코드 최적화와 오류 검사가 이루어지므로 안정적이라는 장점이 있고,

 

컴파일된 실행 파일은 특정 운영 체제와 아키텍처에 종속되기 때문에 다른 환경에서 실행하려면 별도의 컴파일 과정이 필요하다는 점에서 인터프리터 언어는 유연하다는 장점이 있다.

 

즉, 실행 속도안정성이 중요한 경우 컴파일러 언어가, 개발 속도유연성이 중요한 경우 인터프리터 언어가 적합하다.

 

어떤 글에서는 컴파일러 언어와 인터프리터 언어의 이러한 특징들을 바탕으로 컴파일러 언어를 프로그래밍 언어계의 거북이인터프리터 언어를 프로그래밍 언어계의 토끼라고 설명하기도 한다.

 

 

 

 

 


다음 자료를 공부하여 정리한 글로, 아직 많이 부족해 틀린 내용이 있을 수도 있습니다.

 

혹시 있다면 댓글로 알려주세요. 수정하고 더 공부해나가겠습니다-

 

인터프리터의 기본 동작

인터프리터 vs 컴파일러: 프로그래밍 언어계의 토끼와 거북이

Compiler vs Interpreter - Difference Between Them