[C#]닷넷(.Net)의 구성 요소

2022. 8. 9. 18:08Programming language/C#

    목차

서론

 이전에 올린 [C#]닷넷(.Net)에 관하여 에서 간단한 소개를 해봤다면, 오늘은 .Net이 여러 언어로 개발된 소프트웨어를 여러 환경에서 실행될 수 있게 해주는 구성 요소들에 관하여 적어보려 합니다. 구성 요소에는 이전 글에서 자세히 설명하는 별도의 글을 올리겠다 한 CLI, CLR 등이 포함됩니다.


.Net의 구성 요소와 동작 구조

[그림1] .Net 구성 요소와 동작 흐름

 

대표적인 구성 요소를 단순히 나열해 보겠습니다.

 

CLI : Common Language Infrastructure, 공통 언어 기반

  • CIL : Common Intermediate Language, 공통 중간 언어
    • CLS : Common Language Specification, 공용 언어 규격
  • CLR : Common Language Runtime, 공용 언어 런타임
    • JIT 컴파일러 : Just-In-Time 컴파일러
    • CTS : Common Type System, 공용 타입 시스템
    • 가상 실행 시스템

 위 그림은 .Net에서 C#, J#, VB등의 언어가 최종적으 플랫폼에서 실행 가능한 기계어 코드가 되는 흐름을 보여줍니다. 위 흐름의 .Net의 주요한 구성 요소를 보여주는 전부라 할 수 있습니다. 

 

[그림2].Net 컴파일 순서

 

1) C#, J#, VB등 언어로 코드를 작성합니다.

2) 각 언어의 컴파일러가 중간단계 언어로 컴파일해 줍니다.

3) 이러한 IL이 CLR을 통해 JIT(Just - In - Time) 방식으로 플랫폼별 기계어 코드로 재컴파일/실행됩니다. 

2번 항목의 중간단계 언어를 Intermediate Language (IL)이라고 합니다. 닷넷(.Net) 구조에서는 이를 공통 중간 언어(Common Intermediate Language, CIL)이라고 합니다. 

 

 현실에 빗대어 비유해 보자면, 번역 작업이 있을 수 있겠습니다. 비교적으로 한국어/중국어/일본어를 사용하는 국가보다 영어를 사용하는 국가가 많은 게 현실입니다.

 

1) 한국어/중국어/일본어를 C#/VB/J#등의 언어가 되겠습니다.

2) 영어를 할 줄 아는 각 언어의 번역가(각 프로그래밍 언어의 컴파일러)가 영어로 번역을 한 영어 번역본이 IL이 되겠습니다.

3) 영어를 아는 사람이 이 번역본을 읽을 수 있게 됩니다.

 잘 생각해보면, 각 언어의 번역가들이 영어를 안다는 것은 어떤 의미일까요? 영어로 번역하기 위한 기본적인 문법이나 숙어 등 영어를 읽고/쓰기 위해 지켜야 하는 규격이 있습니다. CIL도 마찬가지입니다. 중간 언어로 만들어지기 위해 각 언어가 지켜야 할 규격이 공통 언어 스펙(Common Language Specification, CLS)입니다.  또한, 이렇게 생성된 IL의 결과물 .exe/.dll등을 닷넷 어셈블리(.Net Assembly)라고 합니다.

 

 이렇게 생성된 .Net Assembly를 각 플랫폼에서 재번역/실행할 수 있는 환경을 제공하는 것을 공통 언어 런타임(Common Lanugage Runtime, CLR)이라고 합니다. 중간 언어 결과물(각 플랫폼 고유의 기계어)은 이러한 CLR위에서 동작하며 재번역(컴파일)은 실행시간에 즉각적으로 진행됩니다. 이러한 작업을 해주는 것이 CLR의 JIT(Just-In-Time)컴파일러 입니다. 가상 실행 시스템은 Java의 가상 머신(JVM)처럼 실행되는 환경을 제공합니다.

 

 이러한 것들을 종합적으로 공통 언어 기반(Common Language Infrastructure, CLI)이라고 부릅니다. 

 


마치며

 이전에 올렸던 글인, [C#]가비지 컬렉터 의 가비지 컬렉터가 바로 CLR에 포함되는 녀석입니다. 닷넷(.Net)의 구성요소도 자세히 살펴보고, 작동하는 원리와 연결 지어서 생각해보면 참 대단한 구조인 것 같습니다.


리소스 출처

[그림1] : .Net 위키백과 이미지

[그림2] : 대방무우 블로그
(https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=okcharles&logNo=221583604717)

반응형
LIST

'Programming language > C#' 카테고리의 다른 글

[C#]닷넷(.Net)에 관하여  (0) 2022.08.07
[C#]컬렉션(Collection)  (0) 2022.04.19
[C#]제네릭(Generic)  (0) 2022.04.14
[C#]가비지 컬렉터(Garbage collector)  (0) 2022.04.12
[C#]Boxing/Unboxing (박싱/언박싱)  (0) 2022.04.12