danbibibi
article thumbnail

프로그램 생성 과정

소스코드는 다음 4가지 과정을 거쳐 실행가능한 프로그램이 됩니다.

  1. 전처리 : 헤더파일 혹은 매크로를 치환하여 .i 파일로 저장 (#include, #define 등)
  2. 컴파일 : 저수준의 언어인 어셈블리어로 컴파일 후 .s 파일로 저장 (ex. c++ -> 어셈블리어)
  3. 어셈블 : 저수준 언어인 어셈블리어를 링커가 읽을 수 있는 목적파일로 변환하여 .o 파일로 저장 ( 기계어로 최종 번역 )
  4. 링킹 : 목적파일들을 하나로 묶어 실행파일(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 프로젝트

'프로그래밍 > 기타' 카테고리의 다른 글

TOTP(Time Based One Time Password)  (0) 2024.04.15
협업을 위한 컨벤션, Gitmoji  (0) 2023.09.04
UML 클래스 다이어그램  (0) 2023.01.28
profile

danbibibi

@danbibibi

꿈을 꾸는 시간은 멈춰 있는 것이 아냐 두려워하지 마 멈추지 마 푸른 꿈속으로