본문 바로가기

코딩 이야기/컴파일러

컴파일러 공부하고 개발하기 #01 - 구문 해석, 의미 해석, 중간 표현의 생성, 코드 생성

반응형

서론

 

지난번에 이어서 이번에는 전처리와 어셈블 사이의 중간 과정인 컴파일에 대해 다뤄볼 것이다. 전처리, 컴파일, 어셈블, 링크를 전체를 묶어 컴파일 과정이라 부르긴 하나, 진짜 컴파일은 전처리와 어셈블 사이의 컴파일이 진짜 컴파일이다. 전 글의 '(좁은 의미의)컴파일'이다.

 

 

 

컴파일의 4단계

 

  1. Syntax anlayzing(구문 해석)
  2. Semantic analysis(의미 해석)
  3. IR, intermediate representation(중간 표현의 생성)
  4. Code generation(코드 생성)

 

Syntax anlayzing(구문 해석)이란?

 

소스 코드를 해석해서 컴퓨터가 이해하기 쉬운 형식으로 바꿔줘야한다. 그렇다면 '컴퓨터가 이해하기 쉬운 형식'은 무엇일까? 바로 구문 트리이다. 이후 구문 트리에 대해서 따로 깊게 다룰 것이다.

 

 

Semantic analysis(의미 해석)이란?

 

소스코드를 구문해석하여 구문 트리를 만든 후 이를 해석해서 필요 없는 부분을 제거하거나 추가해서 추상 구문 트리를 만든다. 이 과정을 의미 해석이라 한다.

 

이러한 작업들이 의미 해석이라 할 수 있다.

 

  • 어떤 변수가 로컬 변수인지 글로벌 변수인지 구별하기
  • 변수 선언과 참조를 연결 짓기
  • 변수나 식의 타입을 체크하기
  • 변수를 참조하기 전에 초기화하고 있는지 조사하기
  • 리턴 값이 있는 함수가 값을 제대로 반환하고 있는지 체크하기

이러한 작업들을 통해 추상 구문 트리를 만든다.

 

IR, intermediate representation(중간 표현의 생성)이란?

 

컴파일러 내부에서만 사용되는 중간 표현 구조로 추상 구문 트리를 변환한다. 중간 표현을 생성하는 가장 큰 이유는 여러 종류의 프로그래밍 언어나 기계어에 대응하기 위함이다. 하나의 컴파일러가 여러가지 언어를 컴파일하기도 한다. 예로 GCC는 C언어, C++, 포트란 을 컴파일할 수 있다. 그리고 Cpu 또한 세상에 인텔만 있는 것이 아닌, 다양한 cpu가 존재하기에 cpu용 기계어가 각각 달라서 이에 대해 대처하기 위함이다.

 

Code generation(코드 생성)이란?

 

중간 표현을 어셈블리 언어로 변환한다. 

 

 

 

이제 마지막 단계인 코드 생성 이후 나온 어셈블리 언어를 어셈블 과정에서 처리하게 될 것이다.

 

 

끝맺는 말

 

이전에 한번 학교에서 뭐 발표할 때 조사했던 기억이 살짝 나는 파트이다.

반응형