3. 컴파일 단계

JUSTICE_DER·2023년 12월 17일
0

C++

목록 보기
17/20

참고
컴파일 과정별 세부작업

컴파일 과정 2

컴파일이란 프로그래밍언어를 기계어로 변환하여 실행가능한 프로그램을 생성하는 과정

이는 컴파일러와 링커에 의해 수행된다.
아래의 과정을 수행하여 코드로부터 실행파일을 생성한다.

전처리기들을 전처리기 토큰들로 처리하는 전처리 단계
해당 토큰들을 어셈블리어로 변환하는 컴파일 단계
어셈블리어에서 기계어인 목적 코드로 변환하는 어셈블리 단계
(컴파일러)

파일당 1개씩 생긴 목적 코드들을 하나로 결합하여 하나의 실행파일을 만드는 링킹 단계
(링커)

1. 전처리 단계

1-1. 문자해석

1-2. 전처리 토큰 분리

  • 주석은 모두 공백문자 하나로 변경한다.
  • 전처리 토큰 생성 (아래는 전처리 토큰의 예시)
    ㄴ 헤더이름 <iostream> / 식별자 / 문자,문자열 / 연산자
    ㄴ maximal munch 문제 - 가능한 긴 전처리 토큰을 생성
    a++ + ++b 라면, a++ ++ +b 이렇게 가능한 긴 연산자로 묶으려고 한다

    당연히 오류가 생긴다? 고 하는데 오류 없이 된다..

1-3. 전처리기 실행

  • 전처리기 토큰으로 분리했으니, 전처리기를 실행
    ㄴ 전처리기는 전처리 토큰으로 분리가 안되나??
  • #include : 지정된 파일의 내용 복사
  • #define : 코드 치환
  • #pragma : 컴파일러 명령문 해석
    등등 전처리기 지시자어 포함된 문장으로 컴파일 전 작업을 함.
  • header를 포함하고서도 전처리 1~3단계를 수행함.
    ㄴ 모두 전처리 된 상태로 만들때까지 수행함.

1-4. 문자, 문자열 변경

2. 컴파일 단계

2-1. 해석유닛 생성

  • 전처리기 토큰들이 컴파일 토큰으로 변환되고,
    컴파일 토큰은 컴파일러에 의해 해석되어 해석유닛이 됨.
    ( 전처리기 토큰 - 컴파일 토큰 - 해석유닛(TU) )
  • 해석 유닛은 소스파일 별 하나씩만 존재

2-2. 인스턴스유닛 생성 - 무슨말?

  • 해석유닛을 분석하여 필요한 템플릿 인스턴스를 확인
  • 확인되면 인스턴스화 진행하고 인스턴스유닛이 생성됨.
  • 인스턴스유닛을 바탕으로 (# 3. 어셈블리 단계) 기계어인 "목적코드" 생성

3. 링킹 단계

  • 컴파일러가 생성한 목적코드와 외부 라이브러리 파일을 묶어
    "하나의 실행파일"을 생성.


C++ 프로그래밍 언어로 작성된 소스코드를,
기계어로 번역하여 컴퓨터가 실행가능한 실행파일로 만드는 것.

  • 라이브러리를 사용하는 C++ 소스코드

    • C++ Standard 라이브러리
      ㄴ 모든 프로그래밍 언어는 자주 수행되는 작업을 위해 내장기능을 제공
    • C++ 외부 라이브러리
  • 전처리 단계 (전처리기) (준비물 추가, 가지치기)

    • 전처리기는 코드를 정리
      ㄴ주석, 공백, 개행 등을 제거
    • 전처리기는 프로그램에 헤더파일을 포함시킴
      ㄴ포함시킨 헤더파일 또한 헤더파일이 있다면 또 추가, 코드 또 정리
    • 그렇게 소스코드를 바탕으로
      전처리가 된 중간 파일(intermediate code)을 생성
    • 파일마다 각각 생성
  • 컴파일 단계 (컴파일러) - 컴파일타임 (문법확인, 번역)

    • 일부 C++컴파일러에서는 전처리기의
      중간 파일을 바탕으로 바로 기계어 코드를 만들어내기도 한다.
    • 보통은 코드가 문법에 맞는지 확인한다.
    • 문법에 맞는다면,
      중간파일을 바탕으로
      어셈블리 코드로 구성된 어셈블리 파일을 생성한다.
  • 어셈블리 단계 (어셈블러) (번역)

    • 어셈블리 파일을 바탕으로 기계어로 구성된
      목적코드(object code)를 생성
  • 링킹 단계 (링커) (하나로 연결, 마무리)

    • 이렇게 되면, 모든 C++ 소스코드에 대해
      목적코드 obj 파일이 각각 1개씩 생기게 되는데,
      이 목적코드들과 라이브러리들까지 연결하여
      하나의 실행파일을 생성한다.
    • ㅁ만약 라이브러리를 찾을 수 없거나
      하나로 연결할 수 없다면 컴파일러에게 오류 전달
      및 에러 출력.
  • 실행단계? (로더) - 런타임 (실제 작업물을 실행)

    • 실행파일을 실행할 수 있어야 한다.
    • 로더는 실행파일을 RAM에 로드하여
      CPU가 프로그램을 실행할 수 있도록 한다.
    • 결국 실행되고, 출력이 표시된다.
    • ㅁ런타임에 컴파일러가 오류유효성검사를 위해 대기하다가,
      입력값이나 어떤 논리적 오류가 발생하면 런타임오류를 출력하며
      프로그램을 종료시킨다.
    • ㅁconst는 런타임시점에 확인한다?
profile
Time Waits for No One

0개의 댓글