컴파일러는 고급 언어로 쓰인 프로그램을 어떤 특정 컴퓨터에서 직접 실행이 가능한 형태의 프로그램으로 번역해주는 컴퓨터 프로그램이다.
일반 컴파일러 구조
컴파일러의 일반적인 구조는 다음과 같이 생겼다.
크게 프론트 앤드와 백앤드로 나눌 수 있다
프론트앤드: 소스 언어에 의존하는 부분으로, 소스 프로그램을 분석하고, 중간 코드를 생성한다.
백엔드: 목적 기계에 의존하는 부분으로, 중간 코드를 특정 기계를 위한 목적 코드로 번역한다.
프론트앤드
프론트앤드는 언어에 의존하므로, 각 언어마다 하나씩 필요하다.
기계에 비하면 언어의 문법이 명확히 정의되어있기 때문에 프론트앤드는 잘 정립되어있는 부분이다.
프론트앤드의 기능에 대해 살펴보자면, 프론트앤드의 역할은 소스 프로그램을 읽어들이고, 어휘분석, 구문 분석을 통해 중간 코드를 생성하는 것이다.
Lexical Analyzer (Scanner)
이 과정에서는 소스 프로그램을 읽어들이고, 이를 바탕으로 일련의 토큰을 생성한다.
토큰은 문법적으로 의미를 가지는 최소의 단위를 말한다. 프로그램은 토큰의 열로 구성되어있으며,
토큰의 종류는 특수 형태와 일반 형태로 나눌 수 있다.
일반 형태: 언어 설계자가 정의- 키워드, 연산자 기호, 구분자...
특수 형태: 프로그래머가 사용한 명칭, 상수
생성된 토큰은 효율적으로 사용할 수 있도록 정수 인코딩된다.
# 예
if a>10 then
# 토큰은 다음과 같다.
if, a, >, 10, then
# 이를 정수로 바꿔 사용한다.
29, 1, 20, 2, 35
Symtax Analyzer (Parser)
일련의 토큰을 입력으로 받아 소스 프로그램에 대한 문법 에러를 체크하고, 올바른 문장에 대해 구문 구조를 만든다.
구문 구조의 경우 트리 형태로 만들어 출력한다.
트리를 만드는 방법은 parss tree 방식과 abstact syntax tree가 있는데, 요즘 대부분의 컴파일러는 abstact syntax tree를 사용한다.
Semantic Analyzer
구문 분석 결과(트리)를 바탕으로 소스프로그램이 언어의 정의에 의미적으로 일치하는지 검사한다. 또한 이 때 중간 코드의 생성에 이용할 자료형 정보들을 수집한다.
대표적으로 형 검사가 있다
Intermediate Code Generator
중간 코드의 생성은 sementic analyzer를 통한 검사가 완료된 후의 트리 결과를 바탕으로 만들어진다.
Back-End
백엔드는 프론트앤드에서 생성된 중간 코드에 대한 목적 프로그램을 생성하는 부분이다.
백앤드는 머신에 의존하므로, 각 목적 기계마다 하나씩 필요하다..
백엔드의 기능에 대해서 살펴보면,코드 최적화기를 통해 생성된 중간코드를 효율적으로 만든다. 이후 목적 코드 생성기를 통해 목적 프로그램을 출력한다.
Code Optimizer
최적화기는 같은 의미를 유지하면서 코드를 효율적으로 만들어 코드 실행시 메모리나 실행시간을 절약하는데에 목적이 있다.
이 단게는 선택적으로 생략할 수 있다.
최적화기의 위치에 따라서 precode optimizer와 postcode optimizer로 나눌 수 있다.
Precode Optimizer: 중간 코드를 이용해 최적화 수행, 이후 목적 코드 생성
Postcode Optimizer: 목적 코드 생성 후 목적코드를 최적화 하는 것
Target Code Generator
목적 코드 생성기는 중간코드 혹은 optimizer로 처리된 코드를 받아 그와 의미가 동등한 목적 기계에 대한 코드를 생성한다.
생성기는 각 변수들에 대한 기억장소를 할당해야 하고, 중간 코드의 의미와 일치하는 기계 명령어들을 효과적으로 선택하는 코드 생성 알고리즘을 사용해야 한다.
이를 위해서 생성기는 크게 4가지의 일을 행한다
- 목적 코드 선택과 생성 :
- 레지스터의 운영 : 레지스터를 효율적으로 활용하여 임시 변수의 사용을 줄이고, 실행속도를 줄인다
- 기억 장소 할당
- 기계의존적인 코드 최적화 : 연속적인 명령들을 의미적으로 동등한 하나의 명령어/속도가 빠른 명령어로 대체
Error Recovery
컴파일러에서 중요한 기능 중 한가지는 error recovery이다.
컴파일러는 에러들을 검출, 처리, 리포팅하는 error handling routine을 가지고 있다.
'Computer Science > Compiler' 카테고리의 다른 글
[Compiler] 12. Symbol Table (1) (0) | 2024.03.26 |
---|---|
[Compiler] 02. 형식 언어 (1) - 언어 (0) | 2024.03.12 |
[Compiler] 01. 컴파일러 개론 (3) - 컴파일러 자동화 도구 (0) | 2024.03.06 |
[Compiler] 01. 컴파일러 개론 (1) - 번역기 (0) | 2024.03.06 |