<프로그램의 빌드(컴파일) 과정>
메모리 관리를 본격적으로 배우기 앞서, 프로그램의 빌드(컴파일) 과정에 대해 알아보겠습니다.
컴파일 과정은 작게 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로 변환해줍니다.
'[Computer Science] > [운영체제(OS)]' 카테고리의 다른 글
[운영체제(OS)] 9-3) 연속 메모리 할당과 단편화 (0) | 2023.03.08 |
---|---|
[운영체제(OS)] 9-2) Static Linking vs. Dynamic Linking(shared Library) (0) | 2023.03.07 |
[운영체제(OS)] 9-1. Memory-Management 메모리 시스템, 주소의 할당(Address Binding) (0) | 2023.03.06 |
[운영체제(OS)] 8-3) 교착상태(Deadlock) 탐지, 회복 (0) | 2023.02.22 |
[운영체제(OS)] 8-2) 교착상태(Deadlock) 예방, 회피 (0) | 2023.02.21 |