출처: https://3months.tistory.com/307 [Deep Play]

3-2/기초컴파일러

컴파일러 구조 개요

코딩하는 랄뚜기 2021. 9. 5. 17:14

컴파일러 구조

컴파일러 구조도

컴파일러는 위와 같은 순서로 돌아간다.

1. Scanning = Lexical Analysis(어휘 분석) - 주어진 문장이 어떤 단어를 포함하고 있는지 확인한다. 가장 작은 의미있는 단어를 'token'이라고 하는데 이를 구분한다.

2. Parsing = Syntax Analysis(구문 분석) - 추출된 token들이 문장의 구성 요소 가운데 어디에 해당하는지 확인한다. 확인하면서 Parse tree 또는 Syntax tree(구문 트리)를 생성한다.

3. Semantic Analysis(의미 분석) - 의미 분석을 수행하는 단계지만 형식 언어는 의미를 가지고 있지 않기 때문에 주로 type을 검사한다.

검사한 내용을 tree에 추가해준다.

4. Intermediate Code Generation - 생성된 tree를 기반으로 intermediate code를 생성한다. target machine의 특성을 고려하지 않기 때문에, 모든 프로그래밍 언어와 target machine에 대해 각각의 compiler를 생성해야 한다는 부담이 줄어든다.

intermediate code가 없는 경우

 

intermediate code가 있는 경우

5. Intermediate Code Optimization - 코드의 실행 시간을 줄이거나 메모리 소모량을 줄이기 위해 코드 최적화를 수행한다.

Machine independent optimization(target machine의 특성에 독립적인 최적화)

Machine dependent optimization(target machine의 특성을 고려하여 최적화)로 나누어 진다.

6. Code generation - 최적화된 intermediate code를 기계어 혹은 어셈블리어로 구성된 target code(목적 코드)를 생성한다.

 

예시

예시 코드

 

예시를 Lexical Analysis한 테이블

위의 예시를 Lexical Analysis 해서 table에 저장한 결과이다. 이 때, 2a를 분석하는 경우에 Lexial error가 날 것이다. d는 자료형이 없지만 이 과정에서는 에러가 나지 않는다.(5번의 경우 +를 빼줘야 한다! 잘못 만듦)

Lexical Analysis한 테이블을 바탕으로 위와 같은 symble table을 만든다.
위에 테이블을 바탕으로 tree를 생성 int a,b;

생성된 테이블을 바탕으로 tree를 만드는데 여기서 'c = b a'나 'a+b=c'와 같은 경우는 tree를 못 만들기 때문에 Syntatic Error가 발생하게 된다. tree를 parsing하면서 자료형을 symbol table에 입력한다.

컴파일러 모듈 분류 방법

컴파일러를 전단부와 후단부로 나눈 논리적 구조

컴파일러를 위와 같이 전단보와 후단부로 나눌 수 있는데 그 기준은 machine에 independent한지(전반부) dependent한지(후반부)이다.

 

생성규칙에 맞는 문장인지 확인하기

생성규칙

ni=(po-60);는 문법에 맞는 문장일까?

맞는 문장이다 ㅋㅋ

 

 

'3-2 > 기초컴파일러' 카테고리의 다른 글

NFA->DFA, State Minimization  (0) 2021.09.18
Finite Automata  (0) 2021.09.18
Chomsky hierarchy  (0) 2021.09.10
Formal language, Formal grammar  (0) 2021.09.09
Introductory Concept  (0) 2021.09.05