컴파일
컴파일 과정이란 사람이 작성하는 High Level Programming Language로 구성된 소스 코드를 기계가 이해할 수 있는 Low Level Programming Language로 바꾸는 과정을 의미합니다. 그 중에서 컴파일러가 어떻게 동작하는지 간단하게 정리해보았습니다.
컴파일러
소스 코드가 기계어로 변환되기 위해선 Front End → Middle End(IR) → Back End의 변환을 거쳐야 합니다.
Front End
Front End는 C나 Java 등의 언어의 문법을 해석하는 역할을 합니다. Front End는 다음과 같은 순서로 진행됩니다.
- Scanner가 소스 코드를 받습니다.
- Scanner는 소스 코드를 의미가 있는 단어로 쪼개어 단어들을 토큰으로 만드는 역할을 합니다.
- 숫자, +, - while, if 등이 토큰입니다.
- 토큰은 Parser로 전달됩니다.
- Parser는 Context-Free syntax를 이해하고 Context-Sensitive 분석을 합니다.
- Context-Free syntax란 이전의 문맥이 상관없지만, Context-Sensitive는 문맥 또한 고려합니다.
- Context-Free syntax를 제공하면, 그거에 맞춰서 코드를 생성합니다.
- Context-Sensitive 분석을 한 뒤 IR을 생성합니다.
Context-Sensitive Analysis
문법적으로는 문제가 없을 수 있지만, 의미론적으로 문제가 되는 경우가 있을 수 있습니다. 예를 들어 타입이 다른 경우가 있을 수 있습니다. 따라서 컴파일러는 여러 가지 질문에 대해 답변을 할 수 있어야 합니다.(x는 정의되어 있는지, 타입에 맞는지 등)
IR(Intermediate Language)
IR은 Front End와 Back End 사이에서 중간 코드를 최적화하는 Optimizer입니다. 불필요한 루프를 없애거나, 사용하지 않는 변수의 정리 등을 수행합니다.
Back End
컴파일러의 백엔드는 IR 형태의 코드를 탐색하고 메모리와 레지스터에 할당할 값들을 결정하고, 코드를 삽입합니다.
728x90
'CS > 프로그래밍 언어 (Programming Language)' 카테고리의 다른 글
[프로그래밍 언어] 프로그래밍 언어의 컴파일 과정 (0) | 2025.01.13 |
---|