[2일차] | 컴퓨터 밑바닥의 비밀 | 책너두

Heechan Kang·2024년 4월 10일
post-thumbnail

1.2 컴파일러는 어떻게 작동하는 것일까?

  • 컴파일러의 사용은 매우 간단하다. 그러나 이 이면에는 많은 과정이 숨어 있다.

1.2.1 컴파일러는 그저 일반적인 프로그램일 뿐, 대단하지 않다.

  • 컴파일러
    • 고수준 언어를 저수준 언어로 번역하는 프로그램.
    • 복잡도가 높은 프로그램이지만, 결국 일반적인 프로그램일 뿐이다.

1.2.2 각각의 토큰 추출하기

  • 컴파일러가 가장 먼저 하는 일은 소스 코드를 토큰으로 분리하는 것이다.

  • 이 과정을 어휘 분석(lexical analysis; lexing)이라고 한다.

    • 예시

      • 원본 코드

        int a = 1;
        int b = 2;
        
        while (a < b) {
          b = b - 1;
        }
      • 토큰화된 코드

        T_Keyword    int
        T_Identifier a
        T_Assign     =
        T_Int        1
        T_Semicolon  ;
        T_Keyword    int
        ...

1.2.3 토큰이 표현하고자 하는 의미

  • 렉싱을 거친 토큰을 이용하여 해석(parsing)을 진행한다.
  • 이 과정에서 문법적 오류를 확인하고, 구문 트리(syntax tree)를 생성한다.

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

  • 컴파일(해석) 과정에서 문법적 오류를 확인하기에 구문 트리에는 문법적 오류가 없다.
  • 그러나 아직 의미적 오류는 확인하지 않았고, 이에 대한 검사가 필요하다.
  • 이 과정을 의미 분석(semantic analysis)이라고 한다.
    • 정수에 문자열을 더하거나, 비교의 좌우에 다른 타입의 변수를 사용하는 등의 오류를 확인한다.

1.2.5 구문 트리를 기반으로 중간 코드 생성하기

  • 의미 분석을 통과한 구문 트리를 기반으로 중간 코드를 생성한다.
    • 중간 코드(Intermediate Representation; IR)는 CPU에 종속되지 않는 코드이다.
    • 이 과정에서 최적화가 진행되기도 한다.

1.2.6 코드 생성

  • 중간 코드를 기반으로 CPU에 맞는 어셈블리어로 변환하고, 다시 이를 기계어로 변환한다.
  • 하지만 지금까지의 과정은 하나의 파일에 대한 컴파일이었고, 여러 파일을 컴파일 할 때는 링크(link)라는 과정이 필요하다.
profile
안녕하세요!

0개의 댓글