개요
- 컴퓨터의 언어인 2진수를 사용하면, 모든 프로그램이 0과 1의 전쟁이므로 불편함
- 어셈블리를 사용하면 2진수를 사용하지 않고 기호로 표기할 수 있으나, CPU가 달라지면 코드를 다시 짜야하는 불편함이 존재
이러한 이유로 고급언어가 탄생했다. 고급언어는 0/1 신경쓰지 않고, 기계마다 다르지도 않고 영어와도 비슷하다. 단 이를 번역하는 프로그램이 조금 복잡한 일을 해야하는데, 이때 번역기를 '컴파일러'라고 한다. (꼭 기계어로만 번역되는 것은 아님)
컴파일러란?

한 언어로 쓰여진 프로그램(source program)을 읽어서 다른 언어로 된 의미가 같은 프로그램(target program)으로 번역해주는 프로그램을 말한다.
- 고급언어를 저급언어로 번역하면 Compiler
- 동일 언어로 옮기면 Rewritter
- 저급언어를 고급언어로 번역하면 Decompiler
컴파일러의 탄생
세계 최초의 컴파일러 제작자는 해군 제독이자 프로그래머인 그레이스 호퍼(Grace Hopper, 1906 ~ 1992)이다.
1950년대는 FOTRAN,LISP,COBOL 등 고급 프로그래밍 언어가 나타나던 시기였고, 1952년 그레이스 호퍼는 자신이 개발한 UNIVAC용 프로그래밍 언어 A-0을 기계어로 번역하는 컴파일러를 개발했다. 당시 한 사람이 6개월 걸리는 미분 해석기 프로그래밍을 18분만에 해결하는 능력을 가졌다.
이후 1957년 IBM의 존 배커스가 최적화 기능이 탑재된 포트란 컴파일러를 개발했으며, 그 외 관련 주요 인물로는 C언어를 만든 데니스 리치, Unix의 창시자 켄 톰슨, C++의 창시자 비야네 스트롭스트룹, GCC의 제작자인 리처드 스톨만, Java를 개발한 제임스 고슬링, 그리고 C# 개발을 이끈 앤더스 헤일스버그 등이 있다.
컴파일러와 인터프리터의 차이 비유
라면 끓이는 것을 예시로 들자면, 컴파일러는 끓이는 방법을 다 읽고 외워서 라면을 끓이는 방식이다. 반면 인터프리터는 끓이는 방법을 한 줄씩 읽고 실행하는 방식이다.
컴파일러 기술의 응용
- 컴파일러 제작
- IDE 개발
- 버그 잡는 도구
- 품질 검사 도구
- 최적화, 병렬화
- 디컴파일러
- 바이너리 분석
- DL 컴파일러
등이 있다.
프로그램 처리 과정

컴파일러의 각 단계

- Lexical analysis(어휘분석)
source program을 읽어서 문법의 최소 단위인 토큰(token)을 생성하는 일이다.
토큰(token): 키워드, 연산자, 식별자, 상수
A := B + 3;
- A,B (variable)
- := (assignment symbol)
- + (plus operator)
- 3 (numeric)
- ; (delimeter)
위 예시 식에서는 토큰 6개가 나온다.
- Syntax analysis (구문분석)
토큰을 읽어 오류를 검사하고, 올바른 문자에 대한 구문 구조를 만든다. 주로 트리 형태로 만든다.
- Semantic analysis (의미분석)
Type checking(형 검사), 각 연산자가 원시 언어의 정의에 맞는 피연산자를 가지는지 검사한다.
- Intermediate code generation (중간 코드 생성)
구문 구조를 이용하여 코드 생성을 하거나, 문법 규칙에 의해 생성한다.
ex) position := initial + rate * 60
ex)
temp1 := inttoreal(60)
temp2 := id3 * temp1
temp3 := id2 + temp2
id1 := temp3
- Code optimization (코드 최적화)
코드 분석 후 시간, 공간 등을 최적화 한다. 선택적 단계이나, 공간적,시간적 효율화를 위해 필수적이다.
- Code generation (코드 생성)
목적 코드를 생성한다. assemble language, machine code
'CS > 컴파일러개론' 카테고리의 다른 글
| [컴파일러개론] syntax_derication (구문과 유도) (0) | 2025.11.09 |
|---|---|
| [컴파일러개론] Lexical Analysis (어휘분석) (0) | 2025.11.08 |