엔지니어 블로그

[컴퓨터 밑바닥의 비밀] 컴파일러 본문

글공부

[컴퓨터 밑바닥의 비밀] 컴파일러

안기용 2025. 3. 7. 08:57

컴파일러는 어떻게 동작하는가?

1.컴파일러는 단순한 프로그램이다

컴파일러는 고수준언어를 저수준 언어로 번역하는 프로그램이다. 텍스트 형태로 작성된 소스파일을 컴파일러에 input하면 CPU가 실행할 수 있는 기계어로 작성된 실행파일을 output 한다. CPU는 추상적인 명령어를 이해할 수 없기때문에 이러한 작업이 동반된다.

2.토큰 추출하기

컴파일러는 소스코드를 번역하기 위해 토큰을 추출한다. 토큰을 추출하기 위해서는 먼저, 각 항목을 잘게 쪼갠다. 이후 각 항목의 정보와 추가정보를 결합하고 이것을 토큰이라고 부른다. 이렇게 토큰을 추출하는 과정을 어휘분석(lexical analysis)라고 부른다.

3.토큰이 표현하고자 하는 의미

토큰을 추출한 이후에는 전달하고자 하는 토큰 의도를 표현해야한다.

while (표현식)
{
    반복 내용
}

위와같이 while 구문이 input 되었다면, complier의 동작은 다음과 같다.

  1. while 키워드의 토큰을 찾는다.
  2. 다음 토큰이 ( 라는 것을 인지한 상태로 기다린다.
  3. ( 을 만난다면 다음 토큰이 bool 표현식이라는 것을 인지한 상태로 기다린다.

이와 같은 과정에서 실패한다면 sysax error를 내보낸다. compiler는 마지막 토큰은 } 를 만날 때 까지 이 과정을 반복한다.이러한 과정을 해석(parsing)이라고 하며, compiler는 구문에 따라 모든 글자를 놓치지 않고 작업을 진행하게 된다.

컴파일러가 구문에 따라 해석해 낸 구조는 구문트리로 표현되며 이 트리를 생성하는 전체 과정을 구문분석 이라고 한다.

4.생성된 구문트리에 이상은 없을까?

구문트리가 생성된 후 구문트리에 이상이 없는지 검증해야 한다. 예를 들어 정수에 문자를 더하진 않는지, 비교 기호의 좌우에 값 형식이 다르면 안된다. 이 과정을 거치고 나면 컴파일 오류가 없다는 것이 증명되며, 이러한 과정을 의미분석(semantic analysis)라고 부른다.

5.코드 생성

의미 분석이 끝나면 구문트리를 탐색한 결과를 바탕으로 중간 코드를 생성한다. 이후 컴파일러는 중간코드를 어셈블리어 코드로 변환한다. 이 과정이 끝난 후 바로 코드를 실행할 수 있는 것은 아니다.

모든 소스파일에는 대상파일이 존재한다. 모든 대상파일을 묶어 하나의 실행파일로 저장할 필요가 있다. 이때 실행되는 작업이 Link 작업이고 이를 실행하는 프로그램은 Linker다