컴파일 과정
C/C++ 컴파일러는 여러분이 작성한 코드를 기계어로 바꿉니다.
- 여기서는 lexical analyzer, pre processor 등의 일련의 프로그램들을 모두 묶어 편의상 컴파일러로 통칭합니다.
이 과정을 정의하는 방법은 다를 수 있지만, 여기서는 7단계로 나눠 보겠습니다.
컴파일 과정 - 1. 어휘 분석(Lexical analysis)
키워드, 식별자(함수 혹은 변수의 이름)등을 토큰이라는 형태로 만들어 잘라냅니다.
사람들의 언어에 비유해 보면 하나의 긴 글을 각 품사를 이루는 어휘들로 잘라내는 일입니다.
Var = A + 1; 이라는 식이 있다면 Var, =, A, +, 1, ; 로 각각 분리됩니다.
- Var 와 A는 Identifier 라는 품사를, =과 +는 Operator 라는 품사를,
- 1은 Constant 라는 품사, ;는 Punctuator 라는 품사에 해당하는 어휘들이 됩니다.
이 단계는 매우 복잡하고 공부할 분량이 많으므로, 더욱 상세히 알아보고자 하신다면 다른 문서를 추가로 참고해 주세요.
컴파일 과정 - 2. 전 처리(Preprocessing)
전처리 구문은 전체적인 코드의 변환에 앞서 선행되어 처리해야 할 일들을 기술합니다.
이는 매크로나 컴파일러 지시자 혹은 조건부 컴파일등을 의미합니다.
컴파일 과정 - 3. 구문 분석(Syntax analysis)
각각의 토큰들을 언어의 문법체계에 맞춰 분석합니다.
보통의 경우 아래와 같은 트리 형태를 생성하게 됩니다.
컴파일 과정 - 4. 의미 분석(Semantic analysis)
분석된 구문에 대해 의미를 부여합니다.
이 과정에서 심볼 테이블이라는 것을 생성하며, 변수나 함수 등의 정보를 파악합니다.
컴파일 과정 - 5. 분석 (Analysis)
프로그램의 흐름을 파악합니다.
컴파일 과정 - 6. 최적화(Optimization)
분석 단계에서 수집한 정보를 바탕으로 프로그램을 최적화 합니다.
컴파일 과정 - 7. 코드 생성(Code generation)
어떤 한 언어에서 다른 언어로 그 결과를 만들어 냅니다.
C/C++ 언어의 경우 컴파일 결과로 기계어를 얻게 됩니다.
이러한 작업을 위해서는 컴파일러 마다 다르지만, 보통 2단계로 나누어 처리하며,
이 경우 1에서 4까지의 과정을 front-end 라 하며, 5에서 7과정을 back-end 라고 합니다.