본문 바로가기
CS/OS

프로세스와 컴파일 과정

by KDGdev 2023. 2. 25.

프로세스와 컴파일 과정


이번 포스팅에서는 소스코드가 어떠한 과정을 거쳐 프로세스, 즉 실행가능한 파일이 되는지 설명해 보겠습니다.

 

컴파일 과정

 

  1.  전처리
    • 첫 번째로 소스코드는 전처리 과정을 통해 주석들이 제거되고 헤더파일을 병합합니다.
    • C언어에서 주로 사용하는 #include<stdio.h> 같은 전처리문은 stdio.h 헤더파일을 선언한 소스코드 파일에 포함시킨다는 의미입니다.
    • #include를 말고도 다양한 전처리문을 처리해주는 과정입니다.
  2.  컴파일러
    • 오류 처리, 코드 최적화 작업을 하며 중간코드인 어셈블리어로 변환합니다
  3. 어셈블러
    • 어셈블리어로 이루어진 코드를 .obj 형태에 목적코드로 변환합니다.
  4. 링커
    • 마지막 단계입니다. 프로그램 내에 있는 라이브러리 함수 또는 다른 파일들과 목적 코드를 결합하여 실행 파일을 만듭니다.
    • 실행파일은 여러분들에게 익숙한 .exe형태의 파일입니다.

 

실제로 실행 가능한 파일을 만드는 링커에 링킹 과정 대해서 더 설명해 보겠습니다.

 

링킹

링킹이란 링커가 목적코드를 실행파일로 변환하는 과정입니다.

 

링킹에는 정적 링킹과 동적 링킹이 있는데 정적 링킹은 정적 라이브러리가 링킹 되는 것, 동적 링킹은 동적 라이브러리가 링킹 되는 것입니다.

 

라이브러리는 .lib의 확장자 형태를 가지고 있습니다.

 

정적 라이브러리와 동적 라이브러리에 대한 설명은 다음과 같습니다.

 

  • 정적 라이브러리
    • 목적 코드와 직접 링킹되어 실행파일에 포함되는 라이브러리입니다. 
    • 컴파일 시 라이브러리가 제공하는 모든 코드(lib)를 실행 파일에 넣는 방식입니다.
    • 실행 파일 내에서 다 해결하기에 외부 의존도가 낮지만 파일 크기가 커져 메모리 효율성이 떨어지는 단점이 있습니다.
  • 동적 라이브러리
    • 완성된 프로그램을 실행할 때 동적으로 포함시키는 라이브러리입니다.
    • 정적 라이브러리와 달리 필요한 부분만 메모리에 올려 사용할 수 있습니다.
    • 그렇기 때문에 메모리 효율성에서의 장점이 있지만 외부 의존도가 높아진다는 단점이 있습니다.

 

동적 링킹의 방법은 프로그램 실행 시 lib을 통해 링킹하며 dll이라는 함수 정보를 통해 참조하는 방식입니다.

 

이 dll을 참조하는 방식에 차이로 명시적 링킹과 암시적 링킹으로 나누어집니다.

 

  • 명시적 링킹
    • 런타임에 요청 시 dll을 로드하고 사용 후 언로드합니다.
    • 필요할 때 선택적으로 dll을 로드하므로 상황에 따라 리소스 교체가 가능하여 메모리 관리가 유리합니다.
  • 암시적 링킹
    • 파일의 실행과 동시에 dll을 로드합니다.
    • 실행 파일은 마치 함수가 정적으로 연결되고 실행 파일 내에 포함된 것처럼 dll의 함수를 호출할 수 있습니다.
    • 명시적 링킹보다 사용이 간단합니다. 마치 dll을 정적 링킹하는 것과 같습니다.

 

 

※ 잘못된 정보, 혹은 다른 의견이 있다면 댓글로 말해주세요. 감사합니다.

'CS > OS' 카테고리의 다른 글

컨텍스트 스위칭  (0) 2023.03.03
프로세스의 메모리 구조  (0) 2023.02.25
메모리 할당  (0) 2023.02.13
가상 메모리 - 페이지 교체 알고리즘  (0) 2023.02.12
가상 메모리  (0) 2023.02.11