컴파일러
컴파일러란?
컴파일러
: 프로그래밍 언어로 작성된 소스 코드를 컴퓨터가 이해할 수 있는 기계어로 변환하는 소프트웨어 도구이다.
컴파일
: 고수준 언어 > (컴파일러) > 저수준 언어
따라서, 컴파일하여 실행 가능한 바이너리 파일
을 생성하여 컴퓨터에서 직접 실행할 수 있고,
최적화된 코드를 생성하여 실행 속도를 향상할 수 있다.
컴파일러 구조
컴파일러는 입력받은 소스 프로그램을 후단부가 이해할 수 있는 코드로 번역하는 전단부
,
해당 코드를 입력받아 동작시킬 기계에서 적합한 코드로 번역하는 후단부
로 구분할 수 있다.
전단부는 언어에 의존적이고, 후단부는 기계에 의존적이기 때문에,
전단부는 후단부가 이해할 수 있는 별도의 코드인 중간 코드
를 생성한다.
컴파일러는 이러한 단계로 실행된다.
------ 전단부 ------
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)' 카테고리의 다른 글
[HTTP] 무상태 프로토콜, HTTP 메시지 구조, HTTP 메서드에 대하여 ! (0) | 2025.03.03 |
---|---|
[컴파일러] Tokenizer, Lexer, Parser에 대해 알아보자 (0) | 2024.09.02 |
[네트워크] TCP 연결 해제할 때, 포트를 바로 닫지 않는 이유는? (0) | 2024.08.07 |
[운영체제] CPU의 구조/원리 (1) | 2024.07.18 |
[CS50] 「3」 스크래치(엔트리), C언어 자료형 (0) | 2024.06.11 |