byidev.com
2024-03-25 13:31:37

 

1. 소스코드 (Source Code)

  • 개발자가 텍스트 에디터나 IDE를 사용하여 C 언어로 프로그램을 작성한다.
  • 해당 파일은 '.c' 확장자를 가진다.

2. 전처리기 (Preprocessor)

  • 전처리기는 소스 코드를 받아서 전처리 단계를 수행.
  • 매크로 확장, 헤더 파일 포함, 조건부 컴파일, 주석 제거 등의 작업을 수행.
  • 전처리된 파일은 컴파일러로 전달 되기 전의 임시 파일 '.i' 확장자를 가진다.

3. 컴파일러 (Compiler)

  • 전처리된 소스 코드를 컴파일러에 전달하여 기계어로 번역한다.
  • 컴파일러는 소스 코드를 분석하고 목적 코드를 생성한다.
  • 생성된 목적 코드는 어셈블러로 전달. '.s' 확장자를 가진다.

4. 어셈블러 (Assembler)

  • 목적 코드를 받아 어셈블러가 해당 아키텍처에 맞는 기계어 코드로 변환한다.
  • 해당 단계에서는 소스 코드를 직접 기계어로 변환하는 과정이다.
  • 생성된 기계어 코드는 링커로 전달. '.o' 확장자를 가진다.

5. 링커 (Linker)

  • 링커는 여러 개의 오브젝트 파일과 라이브러리 파일을 받아 하나의 실행 파일로 결합한다.
    • 이때 라이브러리등의 파일은 '.a' 확장자로 전달된다.
  • 외부 참조를 해결하고 실행 파일에 필요한 모든 구성 요소를 포함.
  • 최종적으로 실행 파일이 생성되어 사용자가 실행할 수 있게된다.
    • Windows => {file}.exe
    • Unix => {file}.out

6. 로케이터 (Locator)

  • 로케이터는 실행 파일을 메모리에 로드하고 실행할 때의 주소를 지정하는 역할이다.
  • 프로그램의 각 섹션(코드, 데이터 등)이 메모리에서 어디에 위치해야 하는지 결정.
  • 실행 파일이 메모리에 로드될 때 로케이터는 각 섹션의 주소를 지정하여 올바른 동작을 유도.
    • 코드 (Code)
      • 코드 영역은 실행할 프로그램의 코드를 메모리에 저장.
    •  데이터 (Data)
      • 데이터 영역은 프로그램의 전역 변수와 정적 변수를 메모리에 저장.
    • 스택 (Stack)
      • 스택은 함수 호출 및 지역 변수의 할당과 관련된 메모리를 저장.
      • 함수가 호출될 때마다 해당 함수의 지역 변수와 매개 변수가 스택에 할당.
      • 스택은 후입선출(LIFO, Last In First Out) 구조를 가지며 자동으로 관리됨.
    • 힙 (Heap)
      • 힙은 동적으로 할당된 메모리를 저장하는 영역.
      • 프로그램 실행 중 필요한 크기의 메모리를 동적으로 할당하고 해제할 수 있다.
      • 힙은 사용자가 직접 관리해야 하며 메모리 누수 (Memory Leak)와 같은 문제 유발 우려.
      • malloc, calloc, realloc 함수를 사용하여 힙 메모리 하당, free 사용하여 할당 해제.
    • BSS (Block Started Symbol)
      • BSS 영역은 초기화되지 않은 전역 변수 및 정적 변수를 저장.