컴파일러
컴파일러란?
`컴파일러` : 프로그래밍 언어로 작성된 소스 코드를 컴퓨터가 이해할 수 있는 기계어로 변환하는 소프트웨어 도구이다.
`컴파일` : 고수준 언어 > (컴파일러) > 저수준 언어
따라서, 컴파일하여 실행 가능한 `바이너리 파일`을 생성하여 컴퓨터에서 직접 실행할 수 있고,
최적화된 코드를 생성하여 실행 속도를 향상할 수 있다.
컴파일러 구조
컴파일러는 입력받은 소스 프로그램을 후단부가 이해할 수 있는 코드로 번역하는 `전단부`,
해당 코드를 입력받아 동작시킬 기계에서 적합한 코드로 번역하는 `후단부`로 구분할 수 있다.
전단부는 언어에 의존적이고, 후단부는 기계에 의존적이기 때문에,
전단부는 후단부가 이해할 수 있는 별도의 코드인 `중간 코드`를 생성한다.
컴파일러는 이러한 단계로 실행된다.
------ 전단부 ------
1. 어휘 분석(Lexical Analysis)
2. 구문 분석(Synatax Analysis)
3. 중간 코드 생성(Intermediate Code Generation)
------ 후단부 ------
4. 코드 최적화(Code Optimization)
5. 목적 코드 생성(Target Code Generation)
어휘 분석
`스캐너`라고도 불리며, 입력으로 들어오는 소스 코드를 읽어 토큰(Token)을 생성하는 과정이다.
`토큰` : 프로그래밍 언어에서 문법적으로 의미를 갖는 최소한의 단위를 의미한다. (ex. 키워드, 식별자, 연산자 등)
구문 분석
`파서`라고도 불리며, 스캐너에서 출력된 토큰을 입력받아 코드의 구조 분석하고, 파싱 트리(Parsing Tree)와 추상 구문 트리(Abstract Syntax Tree)를 생성한다.
`파싱 트리` : 모든 구문적 세부사항을 표현한다.
(ex. `1 + 2 * 3`은 연산자 우선순위와 결합 규칙을 모두 포함)
`추상 구문 트리` : 파싱트리에서 불필요한 구문 요소를 제거하여 핵심 의미만 표현한다.
(ex. `1 + 2 * 3`은 덧셈과 곱셈 노드만 포함하고, 연산자 우선순위는 추상화된 형태로 표현)
중간 코드 생성
파서에서 출력된 트리를 바탕으로, 중간 코드를 생성한다.
(ex. U-Code, Java의 바이트 코드 등)
> 중간 코드를 만드는 이유는? <
언어와 기계 사이의 의존성을 독립적으로 유지하기 위해서이다.
만약에 중간 코드가 존재하지 않는다면, 특정 컴파일러는 특정 기계에서 특정한 언어만 인식할 수 있는 컴파일러가 된다.
중간 코드를 만들어, 동일한 소스 코드가 여러 플랫폼에서 실행될 수 있도록 한다.
중간 코드를 생성하면, 후단부에서는 이를 기계어로 변환하기만 하면 되므로
여러 플랫폼에 맞는 다양한 목적 코드를 쉽게 생성할 수 있다.
코드 최적화
전단부에서 생성된 중간 코드를 바탕으로 비효율적인 코드를 찾아 최적화하여 실행 속도를 개선한다.
로컬 최적화(Local Optimization)과 전역 최적화(Global Optimization)로 구분된다.
- `로컬 최적화` : 코드 블록 내에서 수행되는 최적화
: 상수 연산 (ex. a = 2 * 3 * 4 → a = 24로 치환)
: 상수 전파 (ex. a = 5, b = a + 5 → a = 5, b = 10으로 치환)
: 불필요한 로드, 중복을 제거
: 식의 대수적 간소화
: 연산 강도 경감 (시간이 많이 소요되는 연산을 시간이 적게 걸리는 연산으로 대치)
- `전역 최적화` : 프로그램 전반에 걸쳐 수행되는 최적화
: 공통 부분식 축약
: 코드 이동 (반복문 내, 값이 변하지 않는 코드를 밖으로 이동)
: 코드 삭제 (도달할 수 없는 코드 삭제)
목적 코드 생성
최적화 완료된 중간 코드를 바탕으로, 특정 기계에서 실행할 수 있는 기계어를 생성한다.
(하드웨어에 의존적인 작업들 진행)
'💠기타 > 컴퓨터 과학 (CS)' 카테고리의 다른 글
[컴파일러] Tokenizer, Lexer, Parser에 대해 알아보자 (0) | 2024.09.02 |
---|---|
[네트워크] TCP 연결 해제할 때, 포트를 바로 닫지 않는 이유는? (0) | 2024.08.07 |
[운영체제] CPU의 구조/원리 (1) | 2024.07.18 |
[CS50] 「3」 스크래치(엔트리), C언어 자료형 (0) | 2024.06.11 |
[CS50] 「2」 의사 코드, 정렬, 탐색, 시간 복잡도 (1) | 2024.06.11 |