컴파일러란?
컴파일러는 프로그래밍 언어로 작성된 코드를 기계어로 변환하는 프로그램이다. 컴파일 과정은 소스 코드를 한 번에 전체적으로 분석하고, 이를 실행 파일로 변환하여 이후 실행할 때 별도의 변환 과정 없이 실행 가능하게 만든다.
컴파일러의 주요 특징
- 전체 번역: 프로그램 전체를 한 번에 번역한다.
- 빠른 실행 속도: 실행 파일로 변환되기 때문에 실행 시 속도가 빠르다.
- 에러 탐지: 컴파일 시점에 대부분의 문법적 오류를 발견할 수 있다.
대표적인 컴파일러 기반 언어
- C
- C++
- Java (컴파일 후 바이트코드로 변환, JVM에서 실행)
인터프리터란?
인터프리터는 소스 코드를 한 줄씩 읽고, 실행 시마다 즉석에서 기계어로 변환하며 실행하는 프로그램이다. 인터프리터는 실행 단계에서 소스 코드의 각 명령어를 번역하고 실행한다.
인터프리터의 주요 특징
- 실시간 번역: 코드를 실행할 때 줄 단위로 번역한다.
- 유연성: 실행 중에도 코드 수정이 가능하다.
- 디버깅에 유리: 코드 실행 중 에러가 발생한 지점을 즉시 확인할 수 있다.
인터프리터의 작동 방식
인터프리터는 흔히 "큰 while문 내부에서 switch문을 사용하는 방식"으로 동작한다고 설명된다. 이는 인터프리터가 소스 코드의 각 명령어를 읽고 적절한 동작을 수행하는 방식과 유사하다.
코드 예시:
#include <stdio.h>
#include <string.h>
void interpret(const char *code) {
const char *pc = code; // Program Counter
while (*pc != '\0') {
switch (*pc) {
case 'L':
printf("LOAD operation\n");
break;
case 'A':
printf("ADD operation\n");
break;
case 'S':
printf("STORE operation\n");
break;
case 'J':
printf("JUMP operation\n");
break;
default:
printf("Unknown command: %c\n", *pc);
}
pc++;
}
}
int main() {
const char *program = "LASJX"; // Example program
interpret(program);
return 0;
}
위 코드는 간단한 인터프리터의 동작 방식을 보여준다. program 문자열의 각 명령어를 읽고, switch 문을 통해 ALU(산술논리연산장치)와 유사한 동작을 수행한다.
실제 인터프리터 언어들의 런타임을 빌드해서 코드를 살펴보면 위와 유사한 방식으로 동작한다.
실제 파이썬 인터프리터가 어떻게 동작하는지 설명된 cpython의 md 파일의 일부이다
인터프리터의 첫 번째 작업은 바이트코드 명령어를 디코딩하는 것이다.
바이트코드는 16비트 코드 단위(_Py_CODEUNIT) 배열로 저장됩니다. 각 코드 단위는 8비트 opcode와 8비트 oparg를 포함하며, 둘 다 부호 없는 정수이다.
이 바이트코드가 while 루프에 들어가 swith문에 해당 opcode에 따라 실행되게 된다.
나중에 기회가 된다면 파이썬 인터프리터에 대해 자세히 다뤄보도록 하겠다.
대표적인 인터프리터 기반 언어
- Python
- JavaScript
- Ruby
컴파일러와 인터프리터의 차이점
구분컴파일러인터프리터
번역 방식 | 전체 소스를 한 번에 번역 | 한 줄씩 번역 및 실행 |
실행 속도 | 빠름 | 비교적 느림 |
에러 탐지 | 컴파일 시점에 대부분의 오류 탐지 | 실행 중 오류 발견 |
실행 파일 | 독립 실행 파일 생성 | 별도의 실행 파일 없음 |
용도 | 성능이 중요한 프로그램 | 스크립트와 프로토타이핑에 적합 |
컴파일러와 인터프리터의 장단점
컴파일러의 장점
- 실행 속도가 빠르다.
- 실행 파일이 독립적으로 동작하여 배포가 용이하다.
- 대부분의 오류를 컴파일 단계에서 잡아낼 수 있다.
컴파일러의 단점
- 소스 코드 수정 후 실행 파일을 다시 생성해야 한다.
- 컴파일 과정이 오래 걸릴 수 있다.
인터프리터의 장점
- 코드 실행 중 수정이 가능하다.
- 디버깅과 테스트에 유리하다.
- 플랫폼 독립적인 경우가 많다.
인터프리터의 단점
- 실행 속도가 느릴 수 있다.
- 배포 시 소스 코드가 함께 제공되어야 한다.
- 실행 중 오류로 인해 프로그램이 중단될 가능성이 있다.
'CS' 카테고리의 다른 글
밑바닥부터 만드는 컴퓨팅 시스템 ch03 (0) | 2024.12.08 |
---|---|
RISC vs CISC: 컴퓨터 아키텍처의 두 가지 접근법 (0) | 2024.08.23 |
정적 배열(Static Arrays)과 동적 배열(Dynamic Arrays) (0) | 2024.07.12 |
하이퍼바이저(Hypervisor) (0) | 2024.07.07 |
도커와 VM의 차이 (0) | 2024.07.07 |