컴파일러

1.렉시컬 분석(lexical analysis)

Token 생성 및 테이블 정의를 한다. 코드를 읽을 때 하나 하나 예약어인지 함수인지 변수인지 판단한다.

보통 어휘소를 Token으로 만들어 전달한다.

사진1

2.구문 분석(syntax analysis)

파싱을 하여 생성된 Token으로 구성된 Syntax tree를 만든다. 파싱시 에러가 나면 해당 루틴을 제거하고 계속 진행한다.

예를 들어 Java에서 'c != b !@^ a' 라는 코드는 생성 규칙에 맞지 않아 트리 구조를 만들지 못하여 Syntactic 에러가 발생한다.

추가로 파싱을 하면서 symbol table에 저장된 것들의 자료형을 매칭 시킨다.

사진2

(이 부분은 따로 설명하겠다.)

3. 의미 해석(semantic analysis)

만들어진 구문 트리를 읽으면서 추상 구문 트리(Abstract Syntax Tree) 데이터 구조를 만든다.

해당 트리를 만들면서 아래와 같은 작업을 한다.

  1. 로컬 변수와 글로벌 변수 구별

  2. 변수 선언과 참조 연결

  3. 변수나 식 타입 체크

  4. 변수 초기화 확인

  5. 리턴 값 유효성 확인

4.중간 코드 생성(intermediate code generation)

추상 구문 트리가 완성되면, 컴파일러 내부에서만 사용 되는 중간 표현(IR, Intermediate Representation)구조로 추상 구문 트리를 변환한다.

중간 표현을 생성하는 이유는 여러 종류의 프로그래밍 언어를 생산지가 여러 구조의 CPU의 기계어와 대응 시키기 위해서이다.

사진3

5.코드 최적화(optimization)

컴파일의 4단계에는 들어가지 않지만 실제 컴파일러 과정에는 코드 최적화를 하는 단계가 존재한다.