[Computer Science]/[운영체제(OS)]

[운영체제(OS)] 프로그램의 컴파일 과정

극꼼 2023. 3. 7. 10:01
반응형


<프로그램의 빌드(컴파일) 과정>

메모리 관리를 본격적으로 배우기 앞서, 프로그램의 빌드(컴파일) 과정에 대해 알아보겠습니다. 

컴파일 과정은 작게 Compiling, Linking과정으로 나뉩니다. 

- Source Code Compiling : 소스코드는 개발자가 이해하기 쉬운 언어이지 컴퓨터가 이해할 수 있는 언어가 아닙니다. Compiler는 이 코드를 Assembly 언어로 번역해주고, Assembler는 Assembly언어를 컴퓨터가 이해할 수 있도록 Low Level의 언어(이진수 파일)로 변환하는 과정을 거칩니다. 이 과정을 통틀어서 Compiling이라 합니다.

- Object Code를 Executable 파일로 Linking : 이렇게 만들어진 오브젝트 코드를 Linker가 Linking해줍니다. Linker는 여러 소스 코드(오브젝트 코드)들을 하나로 합치고 거기에 Library도 합쳐서 실행파일(=Target fiel)을 만들어줍니다.


C# Compiler를 예시로 들어보자면 다음과 같은 단계를 밟습니다.

 

1. Source Code(A.cs, B.cs, C.cs) -> Managed Module로 Compiling.

C# compiler는 소스코드를 MSIL(Microsofr Intermediate Language)로 변환해주고, 필요한 메타데이터를 생성합니다. 

이때의 MSIL, 메타데이터는 PE(Portable Executable)에 포함됩니다.

 

Managed Module : 다음과 같은 부분들을 포함하는 표준적인 윈도우 Portable Executable(PE)입니다.

  • PE Header : 일반적인 object file 형식과 유사합니다.
  • CLR Header : managed module, location, metadata를 실행하는데 필요한 CLR 버전을 포함하고, 진입점(entry point)도 포함합니다.
    • 진입점 : 프로그램 진입점이 있어야 exe파일로 만들 수 있음. [ex] Main()
  • Metadata : 데이터 타입과 기본 값을 포함하는 변수, 우리의 프로그램에 정의된 메서드 등을 포함한 table information을 포함합니다.
  • MSIL : 개체에 대한 메서드를 로드, 저장, 초기화, 호출하는 명령 포함하고, 산술, 논리 연산, 제어 흐름, 예외 처리 등 기타 작업에 대한 명령 포함합니다. 

2. Managed Module -> assembly / assemblies로 결합.

C# 컴파일러, Assembly Linker는 컴파일링된 여러 Managed Module과 리소스 파일들, Manifest에 라이브러리를 합쳐서 하나의 assembly, 실행 파일로 만들어줍니다. 

* 어셈블리 내의 클래스는 namespace를 통해 구분합니다.

 

다음에 있을 포스팅에서 이 Linker에 대해 더 자세히 설명할겁니다.

 


3. CLR(Common Language Runtime)을 로딩하고, CLR로 실행.

CLR은 JIT(Just-In-Time) 컴파일러를 제공하는데, 이 컴파일러는 MSIL을 대상 컴퓨터가 읽을 수 있는 native code로 변환해줍니다.

 

반응형