1. 컴파일러 언어
소스 코드 전체를 기계어로 한 번에 변환한 후 실행하는 방식입니다.
1
2
3
4
5
6
7
// C++ 예시
#include <iostream>
int main() {
std::cout << "Hello World"; // 이 코드는 바로 실행되지 않음
return 0;
}
실행 과정
- 소스코드 작성
- 컴파일 (전체 코드를 기계어로 변환)
- 실행 파일 생성
- 프로그램 실행
장점
- 실행 속도가 빠름
- 컴파일 시점에 에러 검출
- 한번 컴파일하면 실행 파일만으로 동작
단점
- 개발 속도가 상대적으로 느림
- 플랫폼 의존적
- 컴파일 시간이 필요
2. 인터프리터 언어
소스 코드를 한 줄씩 읽어가며 바로 실행하는 방식입니다.
1
2
3
// JavaScript 예시
console.log("첫 번째 줄"); // 즉시 실행
console.log("두 번째 줄"); // 이전 줄 실행 후 실행
실행 과정
- 소스코드 작성
- 한 줄씩 즉시 해석하여 실행
- 별도의 실행 파일 없음
장점
- 즉시 실행 가능
- 플랫폼 독립적
- 개발 및 디버깅이 쉬움
단점
- 실행 속도가 상대적으로 느림
- 런타임 에러 가능성 높음
실제 동작 비교
컴파일러 언어 (C++)
1
2
3
4
5
6
7
8
// 전체 코드를 먼저 컴파일
int main() {
int x = 10;
int y = 20;
int result = x + y; // 모든 코드가 기계어로 변환된 후 실행
printf("%d", result);
return 0;
}
인터프리터 언어 (JavaScript)
1
2
3
4
5
// 한 줄씩 실행
let x = 10; // 1. 이 줄 실행
let y = 20; // 2. 이 줄 실행
let result = x + y; // 3. 이 줄 실행
console.log(result); // 4. 이 줄 실행
하이브리드 방식
현대의 많은 언어들은 두 가지 방식을 혼합하여 사용합니다.
Java의 경우
- 소스코드(.java) → 바이트코드(.class) 컴파일
- JVM이 바이트코드를 인터프리팅
- 자주 사용되는 코드는 JIT 컴파일러가 기계어로 변환
JavaScript의 V8 엔진
- 인터프리터로 코드 실행
- 자주 실행되는 코드는 JIT 컴파일러로 최적화
언어별 분류
컴파일러 언어
- C
- C++
- Rust
- Go
인터프리터 언어
- JavaScript
- Python
- Ruby
- PHP
이러한 차이점을 이해하면 각 언어의 특성과 용도에 맞는 적절한 선택을 할 수 있습니다.