프로그램 생성 과정
소스코드는 다음 4가지 과정을 거쳐 실행가능한 프로그램이 됩니다.
- 전처리 : 헤더파일 혹은 매크로를 치환하여 .i 파일로 저장 (#include, #define 등)
- 컴파일 : 저수준의 언어인 어셈블리어로 컴파일 후 .s 파일로 저장 (ex. c++ -> 어셈블리어)
- 어셈블 : 저수준 언어인 어셈블리어를 링커가 읽을 수 있는 목적파일로 변환하여 .o 파일로 저장 ( 기계어로 최종 번역 )
- 링킹 : 목적파일들을 하나로 묶어 실행파일(a.out) 생성
위 4가지 동작을 Compiler Coleection(컴파일러 모음집)이라고 부르며,
GCC(GNU Compiler Collection) 과 LLVM(Low Level Virtual Machine)이 잘 알려진 모음집입니다.
컴파일 과정
그럼 이제 컴파일 과정을 조금 더 자세하게 알아볼까요?
컴파일 단계는 다음과 같이 구성됩니다.
Front-end
전처리기 동작을 통해 변환된 소스코드가 올바르게 작성되었는지 확인하는 과정
- 어휘 분석 : 소스코드를 토큰(의미있는 최소 단위)으로 나눔
- 구문 분석 : 문법 오류를 검출하기 위해, 토큰을 parse tree 형태로 변환
- 의미 분석 : parse tree를 순회하며 의마상 오류 검출 (ex. 올바르지 않은 파라미터 및 타입 사용 등)
- 중간 표현 생성 : 언어의 독립 특성을 제공하는 GIMPLE Tree 생성
Middle-end
- GIMPLE Tress를 SAA 형태로 변환 후 아키텍쳐 의존성을 없애는 작업을 진행
- 이후 고급언어와 어셈블리어의 중간단계인 RTL(Register Transfer Language) 생성
- 주로 optimization(최적화)는 이 과정에서 많이 발생함
SSA(Static single-assignment)
데이터 흐름분석과 코드 최적화를 위해 사용되는 중간표현
보통 정적으로 값과 데이터 타입을 결정하기 위해 변수의 배정 또는 흐름을 분리하는 형태에 사용됨
Back-end
- RTL optimization에 의한 RTL최적화 (아키텍처 의존성 없음)
- 아키텍처 별 코드 최적화
GCC 컴파일러
- GNU Compiler Collection
- 단순한 컴파일 과정을 넘어 전처리, 어셈블, 링킹을 함께 수행해 실행 파일을 만드는 역할을 함
- Front-end 부터 Back-end까지 모두 자체적으로 개발해 제공되고 있으며, GPLv3 인증으로 모든 소스가 공개되어 있음
LLVM 프로젝트
- 보통 LLVM 프로젝트라고 부름
- 컴파일러라기 보다는 하나의 프로젝트 이름, 컴파일을 가능하게 하는 모음집 정도
- GCC는 GPLv3 라이센스를 채택하여 모든 소스 코드를 공개해야하는데, 상업적으로 공개하고 싶지 않은 경우 대체제로 사용
- LLVM은 BSD라이센스를 사용하고 있어서 상업적으로 사용하더라도 소스코드를 공개할 필요는 없음 (사용에 대한 출처표기만 하면 됨)
LLVM 프로젝트의
Front-end = Clang 프로젝트
Middle-end = IR (고급언어와 어셈블러의 중간단계)
Back-end = LLVM-core 프로젝트
'프로그래밍 > 기타' 카테고리의 다른 글
ChromeDriver 설치 없이 selenium 실행하는 법, webdriver_manager (0) | 2024.12.11 |
---|---|
TOTP(Time Based One Time Password) (0) | 2024.04.15 |
협업을 위한 컨벤션, Gitmoji (0) | 2023.09.04 |
UML 클래스 다이어그램 (0) | 2023.01.28 |