[C# 기초강좌] 2. 닷넷의 실행구조
이 글은 제가 과거에 운영했던 사이트인 http://dotnet.mkexdev.net 의 글을 옮겨온 것입니다. 원본 글은 2010년에 작성되었습니다.
그 전에 운영했었던 사이트(mkex.pe.kr)은 흔적도 없이 사라 졌습니다. 그속의 글들도 모두... 그래서 이 사이트도 사라지기 전에 옮기고 싶은 글을 조금씩 이 블로그로 이동시키려 합니다.
(원본글) http://dotnet.mkexdev.net/Article/Content.aspx?parentCategoryID=1&categoryID=5&ID=666
이 글은 닷넷 기초 지식을 전파하기 위해 2010경에 작성되었으며, 당시 윤성우의 프로그래밍 스터디그룹 네이버 카페에도 필진으로 참여하여 연재했던 글이기도 합니다. 현재 시점에서 조금 달라진 부분이 있을 수 있으나 기본 원리와 언어 기초에 해당하는 부분은 크게 변하지 않았을 것으로 생각하며 이런 부분들을 감안해서 봐 주시기 바랍니다.
“닷넷 실행환경의 핵심 엔진은 CLR 입니다”
안녕하세요. 박종명입니다. 닷넷 두 번째 강좌를 진행하도록 하겠습니다
이번에는 닷넷 기반 프로그램이 어떤 과정을 통해 실행되는지 그 흐름을 살펴 보도록 하겠습니다
닷넷은 자바와 많은 부분이 닮아 있는데요. 실행 구조 역시 큰 맥락에서는 자바의 그것과 유사하다고 할 수
있겠습니다. 자 이제 닷넷의 실행 흐름의 세계로 같이 가시죠~~
닷넷 프로그램의 실행환경의 중심에 있는 것이 바로 CLR(Common Language Runtime, 공용언어런타임) 입니다.
CLR은 런타임 형식 확인,, 원시코드(Native Code) 컴파일, 코드 액세스 보안(CAS), 객체 수명 관리, 디버깅 및
프로파일링 등의 기능을 제공하여 실행환경 전반을 관리하는 핵심 엔진입니다
보통 닷넷 코드를 ‘관리되는 코드(managed code)’ 하는데요
이는 운영체제에 의해 직접 실행되지 않고 CLR에 의해 관리, 실행되는 코드를 뜻합니다
아마 닷넷을 하시다 보면 ‘관리코드’, ‘비 관리코드’ 라는 용어를 많이 접하시게 될 겁니다
이제 그림을 통해 실행 과정 하나하나를 따라가 보도록 하겠습니다
1. 우리의 모습이죠. ^^ 개발자가 닷넷 코드를 사용하여 개발합니다
2. C#으로 작성된 프로그램이 탄생했습니다
3. 프로그램을 컴파일 합니다. 이때 C# 컴파일러(csc.exe) 가 컴파일을 수행합니다
만일 VB.NET으로 작성했다면 vbc.exe라는 비주얼베이직닷넷 컴파일러가 동작합니다
즉 각 언어별 컴파일러가 따로 존재하는 것이지요
4. 컴파일의 결과물로 exe나 dll이 나왔군요. 이것을 닷넷에서는 어셈블리(Assembly)라고 부릅니다
닷넷 어셈블리의 가장 주요한 특징은 프로그램 코드 이외에 자기자신을 설명하는 메타데이터 정보가
포함되어 있다는 것입니다.그리고 확장자가 exe라고 해서 바로 실행 가능한 결과물이 아닙니다
이 어셈블리는 MSIL(Microsoft Intermediate Language) 형태를 지니고 있습니다.
MSIL은. 컴퓨터가 해석 가능한 원시코드(Native Code)가 되기 전 중간 단계의 언어입니다.
자바의 바이트 코드와 유사하다고 보시면 됩니다.
(이후 강좌를 통해 이 MSIL 코드를 직접 살펴보는 시간을 갖도록 하겠습니다)
그리고 이 exe(dll) 파일에는 소스코드 내의 클래스를 설명하는 메타데이터와 매니페스트 정보가 포함됩니다
5. 이제 MSIL 코드를 실행하고자 합니다.
지금까지는 컴파일 환경이었습니다. 이제 본격적으로 실행환경으로 넘어갑니다
6. 이제부터가 그 유명한(?) CLR 의 영역인데요.
실행을 위해 MSIL 코드가 CLR로 호스트 될 때 제일 처음 CLR 내부의 Class Loader 에 의해 어셈블리 내 클래스들의
레이아웃 로드와 메타데이터 및 사용된 클래스 라이브러리 등을 로드 하여 각종 과정(타입체크, 마샬링 등)을 거친 뒤
메모리에 로드 됩니다
7. 메모리에 올라간 어셈블리를 컴퓨터가 이해할 수 있도록 원시코드(Native Code)로 변환해야 하는데요
이 역할을 수행하는 것이 ‘JIT 컴파일러’라는 놈입니다(Just-In-Time, jitter(지터)라고 부릅니다)
JIT 컴파일러는 MSIL 코드를 특정 플랫폼 기반의 원시코드로 변환시켜 줍니다
8. 7의 과정에서 탄생한 원시코드(Native Code) 입니다
9. JIT컴파일러에 의해 컴파일 된 원시코드는 다음 번 실행을 위해 메모리에 캐시 됩니다.
즉 동일한 어셈블리가 다시 실행될 때 지금까지의 과정을 생략함으로써 실행속도의 향상을 꾀합니다.
따라서 다음 번 실행 시에는 여기서부터 출발합니다
10. 이제서야 우리가 작성한 프로그램을 모니터를 통해 눈으로 확인 할 수 있게 되었군요.
축하 드립니다 ^^;
어떤가요? 자바의 실행구조와 유사함을 느끼시나요?
사실 이러한 실행구조는 자바를 모방했다기 보다는 플랫폼 독립성을 위한 메커니즘이라고 봅니다
지금까지 닷넷의 개요와 역사 그리고 실행 구조에 대해 간략히 살펴 보았습니다
다음 강좌에서는 본격적으로 닷넷 개발을 위한 개발 환경 설치를 해 보도록 하겠습니다
수고하셨습니다~~