컴파일러 수업을 들으면서 정리해보았던 내용을 올립니다. 컴파일러는 알면 알수록 더 모르겠어요.. 8ㅅ8 과제하기시러시러. 수업시간엔 나만 이해못하는거같고 흑그그거ㅡㅓ 교수님이 귀엽지 않았다면 진작 드랍했을 과목인듯.. 틀린 부분은 지적 환영합니다.
컴파일러는 단순히 ‘번역기’ 이다. 번역기 중에서도 ‘고급언어로 작성된 프로그램’ 을 넣으면 기계에서 실행 가능한 프로그램으로 번역 해주는 것이 컴파일러이다.
이 때 입력되는 프로그램이 소스 언어로 작성된 소스프로그램이고 결과물로 나온 프로그램이 목적 언어로 작성된 목적 프로그램이다.
크로스 컴파일러는 소스프로그램을 컴파일러가 실행 되고 있는 기계에 대한 기계어로 번역하는 것이 아니라 다른 기계에 대한 기계어로 번역해주는 컴파일러이다.
컴파일러를 이런 기호로 표현한다고 생각해보자.
이 기호에서 H는 이 컴파일러가 작동할 머신이고, P는 소스프로그램이며, B는 타겟 머신을 나타낸다.
우리가 크로스 컴파일러를 이용해서 결과적으로 원하는 것은 타겟머신인 B머신에서 작동하는 프로그램이므로,이러한 모양의 B머신에서 돌아가는, B머신을 위한 언어로 작성된 프로그램이다.
우리에겐 고급언어로 작성된, P언어로 작성된 B를 위한 프로그램 (1)가 주어져 있다. 또한 머신 H에서 P언어로 작성된 프로그램을 머신 H를 위한 기계어로 번역하는 컴파일러 (2)를 가지고 있다.
주어진 프로그램(1)을 컴파일러(2)를 이용해서 번역하면 H머신에서 작성된, 머신 B를 위한 기계어로 번역해주는 크로스 컴파일러(3)가 결과물로 나오게 된다.
이제 주어진 프로그램(1)을 (3)을 이용해서 번역하게 되면 B머신에서 작성된, P언어를 B머신에서 사용할 수 있는 기계어로 번역하는 B머신에서 사용가능한 컴파일러(4)가 결과로 나온다.
이 컴파일러(4)를 통해 주어진 프로그램(1)을 번역하면 B머신에서 실행가능한 프로그램(5)이 결과로 나오게 된다.
일련의 과정을 한눈에 보면 다음과 같다.
인터프리터도 컴파일러와 비슷한 역할을 한다.
다만 컴파일러는 고급언어로 쓰여진 프로그램을 목적 프로그램으로 번역한 후, 실행프로그램으로 바꾸어서 그 실행프로그램을 실행하는 반면, 인터프리터는 소스프로그램의 의미를 직접 실행한다.
컴파일러는 크게 front-end와 back-end로 나뉜다.
front-end는 소스언어와 관계가 있는 부분이다. 소스프로그램을 분석하고 중간코드를 생성하는 역할을 한다.
back-end는 목적기계와 관계가 있는 부분이다. (의존적이다.) front-end에서 생성한 중간코드를 목적 코드로 번역하는 부분이다.
front-end는 언어와 관계 있는 부분이기 때문에 각 언어마다 하나씩 필요하고, back-end는 목적 기계와 그러하기 때문에 목적 기계당 하나씩 필요하다.
front-end부분은 다음과 같은 세가지 부분으로 구성된다.
어휘분석 , 구문분석, 중간코드 생성
front-end 부분의 결과물은 중간 코드가 된다.
어휘분석은 어휘분석기(다른 말로 Scanner라고도 한다.)에 의해 이루어진다. 어휘분석 부분에서는 소스프로그램을 읽어들여서 token을 생성한다.
a = b - 20;
라는 문장을 읽어들였을 때, 어휘분석 단계에서는 이 문장을 a
, =
, b
, -
, 20
, ;
라는 토큰으로 분리한다.
이 때 =
, -
, ;
,는 특수 형태의 토큰이고, a
,b
,20
은 일반 형태의 토큰이라고 한다.
이 토큰들을 처리해 주기 위해서는 토큰들을 가리키는 번호를 지정해주게 된다.
구문 분석 구간은 구문분석기(syntax analyzer / parser)를 통해 이루어지는 부분이다.
이전 단계의 결과물인 token을 입력으로 받아서 소스프로그램에 대한 에러를 체크하고, 에러가 없는 문장은 구문구조를 만든다.
어휘분석단계와 구문분석 단계에서 소스프로그램에 대한 정보를 수집해서 symbol table에 저장한다.
중간코드 생성 부분은 중간 코드 생성기를 통해 이루어지는 부분이다. 이전 단계의 결과물인 AST를 입력으로 받아, 의미검사를 하고 그에 해당하는 중간코드를 생성한다.
일련의 과정을 통해 중간코드를 생성한다.
back-end 부분은 다음과 같은 두가지 부분으로 나뉜다.
코드 최적화, 목적 코드 생성
중간코드를 입력받아 최적화된 코드를 생성하는 부분이다.
생략하기도 한다.
최적화된 중간코드 또는 중간 코드를 입력으로 받아 목적 기계에 대한 코드(목적 코드)를 생성하는 부분이다.
back-end 부분의 결과물은 목적 프로그램이 된다.
컴파일러 입문 (오세만 저)