본문 바로가기

CS 공부/컴파일러

[컴파일러] 컴파일러: 원리, 기법, 도구 - 컴파일러의 개요

컴파일러는 front end, middle end, back end의 세가지 단계로 구성되어 있다.

  • front end: 토큰화를 위한 어휘 분석(Lexing), 파스 트리 구성을 위한 구문 분석(Parsing), 중간 코드를 위한 의미 분석 등을 처리한다.
  • middle end: 중간 코드에 대해 프로그램의 분석과 최적화를 처리한다.
  • back end: 각각의 CPU 아키텍처에 대해 코드 최적화를 수행하며 최종 코드를 생성한다.

먼저 우리는 front end에서 다루는 어휘 분석과 구문 분석, 그리고 의미 분석에 대해 알아볼 것이다.

컴퓨터 언어는 다음의 두가지 요소로 구성된다.

- 언어의 구문(syntax of language): 프로그램의 모양 -> 코드의 모양
- 언어의 의미(semantics of language): 프로그램의 의미 -> 코드의 의미(동작)

언어의 의미와 구문은 문맥 자유 문법(context-free grammer)와 BNF라는 표기법을 이용해 표현 가능하다. 이중에서 우리가 중요하게 봐야 할 것은 문맥 자유 문법이다. 문맥 자유 문법은 언어의 구문을 표현하는것에도 프로그램을 중간 코드로 번역할 때에도 유용하다. 구문 중심 번역이라고 하는 번역 기술은 컴파일러의 front end에서 사용되며 우리가 공부해볼 내용이다.

컴파일러라고 하면 if-else나 while같은 제어문, 함수와 같은 기능이 있는 복잡한 컴퓨터 언어를 위한 프로그램이라고 생각할수 있지만 기본적인 개념과 구문 중심 변환 번역을 배우기 위해 중위 표현식을 후위 표현식으로 바꾸는 간단한(?) 컴파일러를 만들어 볼 것이다. (책에서는 C 언어로 만들지만 고대(..) 의 C 언어는 이해가 떨어질것같아 Python으로 실습해 보려고 한다.)

만들어볼 컴파일러는 크게 어휘 분석기(lexer), 구문 중심 번역기(syntax-directed translator)로 이루어져 있는데 여기서 번역기는 일반적인 구문 분석기(parser)와 중간 코드 생성 과정을 합쳐 놓은것이다.

처음에는 간단한 중위표현식-후위표현식 컴파일러를 만들지만 기본적인 부분은 동일하기 때문에 기능을 계속해서 확장해 나가며 나중에는 복잡한 lexer와 parser로 이루어진 보다 일반적인 프로그래밍 언어도 만들어 볼 것이다.

References