컴파일러란?
우리도 한국어, 영어 등의 언어가 존재하지만, 컴퓨터에도 마찬가지로 언어가 존재한다.
컴퓨터는 2진수를 통해 통신하는데, 이를 사람이 보고 해석하기란 불가능에 가깝다.
따라서 사람들은 어셈블리어를 만들어 컴퓨터와의 소통을 시작하였다.
어셈블리어
사람들이 직접 2진수를 쓰지 않고 기호로 표기하였다.
예를 들면 ADD(덧셈) -> 0010, SUB(뺄셈) -> 0101 등과 같이 말이다.
이렇게 기호로 표기된 언어(어셈블리어)를 어셈블러에 넣으면
컴퓨터 언어로 전환해주는데, 이때 어셈블러란 번역을 전담하는 SW이다.
그러나, 이러한 어셈블러는 CPU가 바뀌면 새롭게 만들어야 했다.
고급 언어
CPU 별 다른 어셈블러를 만들어야 한다는 사실을 불편하게 여겨
우리는 고급 언어를 탄생시켰다.
0과 1을 신경 쓰지 않고, 영어와 아주 비슷한 언어를 말이다.
C, FOTRAN, BASIC, PASCAL, JAVA, C# 등등 우리가 현재
프로그래밍 할 때 사용하는 언어들이다.
어셈블러와 마찬가지로 고급 언어로 작성된 코드를 컴퓨터 언어로 바꿔줘야 하는데,
컴퓨터 언어로 바꿔 주는 번역기를 바로 컴파일러라고 한다.
(이때, 모든 컴파일러는 기계어로 번역해 주는 것이 아니다.)
컴파일러
그래서 컴파일러의 정확한 정의가 무엇일까.
컴파일러는 한 언어로 쓰여진 프로그램(source program)을 읽어서,
다른 언어로 된 의미가 같은 프로그램(target program)으로 번역해주는
프로그램(program)이다.
위에서 프로그램이라는 언어가 세 번 나오는데, 각각의 프로그램은 다른 뜻을 가진다.
첫 번째 프로그램은 소스 코드를 의미하며,
두 번째 프로그램은 소스 코드가 컴파일러를 통해 나온 결과물을 의미하고,
세 번째 프로그램은 소스 코드를 결과물로 바꾸어 주는 것을 지칭한다.
+) 저급 언어로 번역시 compiler, 동일 언어로 옮길 시 rewritter, 고급 언어로 번역 시 decompiler이다.
컴파일러의 탄생 배경
1950년대
고급 언어 프로그래밍 언어가 나타났던 시기
당시 나타났던 언어 중 하나로 지금도 쓰이는 것으로 FORTRAN, LISP, COBOL, ALGOL 등이 있다.
1952년
그레이스 호퍼가 자신이 개발한 UNIVAC용
프로그래밍 언어 A-0을 기계어로 번역하는 컴파일러를 개발하였다.
영어로 코딩할 수 없을까를 고민하다가, 한 사람이 6개월 걸리는
미분해석기 프로래밍을 컴파일러를 통해 18분만에 해결했다.
그레이스 호퍼는 1906년에 출생하여 1992년까지 생존한 인물로
세계제2차대전에 참전하여 해군 제독으로 미 병기국 계산팀에 배치되었다.
1957년
최적화 기능이 탑재된 포트란 컴퓨터가 등장하였다.
컴파일러를 만들었던 주요 인물들
데니스 리치
1972년경 Sun사 근무 시절 Unix를 어셈블리어로 만들었다.
이 과정에서 어셈블리어를 쓰기 귀찮아서 언어를 개발하였는데, 그 언어가 C이다.
C의 전 작품으로 B가 있다.
브야네 스트롭스트룹
1987년경 C++을 만들었다.
리차드 스톨만
1987년 GNU 프로젝트의 컴파일러로 gcc를 제작하였다.
제임스 고슬링
1994년 경 Java 언어 발명하였다.
컴파일러와 virtual machine을 개발하였다.
앤더스 헤일스버그
2000년 C# 개발팀의 주요 인물이다.
그 이전에 이미 Turbo Pascal, Delphi를 개발하였다.
컴파일러와 인터프리터의 차이
라면 끓이는 방법으로 비유를 하자면
컴파일러는 라면을 끓이는 방식을 다 외워 한 번에 끓이는 것이고,
인터프리터는 라면을 끓이는 방식을 한 줄씩 읽고 실행하는 것이다.
컴파일러 기술의 응용
1. 컴파일러 제작
2. IDE: 편리한 IDE 제작 시에도 중요한 기술
3. 버그 잡는 도구
4. 품질 검사 도구
5. 최적화, 병렬화
6. 디컴파일러
7. 바이너리 분석
8. 국내 전문 회사
프로그램 처리 과정
컴파일러의 각 단계
어휘 분석(Lexical analysis)
source program을 읽어서 문법의 최소 단위인 토큰을 생성하는 일
- 토큰: 키워드, 연산자, 식별자, 상수
구문 분석(Syntax analysis)
토큰을 읽어 오류를 검색하고 올바른 문장에 대한 구문구조를 만든다.
구문 구조는 주로 트리 형태로 나온다.
의미 분석(semantics analysis)
type checking(형 검사)을 통해
각 연산자가 원시 언어의 정의에 맞는 피연산자를 가지는가를 검사
중간 코드 생성(Intermadiate code generation)
구문구조를 이용하여 코드 생성 또는 문법 규칙에 의해 생성된다.
코드 최적화(code optimization)
코드 분석 후 시간, 공간 등 최적화하는 단계이다.
이 단계는 선택적이지만 공간적, 시간적 효율화를 위해 필수적이다.
코드 생성(code generation)
목적 코드를 생성한다.
-> assemble language, machine code
'Computer Science > 컴파일러개론(Compiler)' 카테고리의 다른 글
[컴개/CI] 모호성(Ambiguity) (0) | 2023.10.20 |
---|---|
[컴개/CI] 구문 분석 (0) | 2023.10.20 |
[컴개/CI] 어휘 분석기 만들기 (1) | 2023.10.19 |
[컴개/CI] Token (1) | 2023.10.19 |
[컴개/CI] 어휘 분석(Lexical Analysis) (0) | 2023.10.19 |