2022. 8. 9. 18:08ㆍProgramming language/C#
- 목차
서론
이전에 올린 [C#]닷넷(.Net)에 관하여 에서 간단한 소개를 해봤다면, 오늘은 .Net이 여러 언어로 개발된 소프트웨어를 여러 환경에서 실행될 수 있게 해주는 구성 요소들에 관하여 적어보려 합니다. 구성 요소에는 이전 글에서 자세히 설명하는 별도의 글을 올리겠다 한 CLI, CLR 등이 포함됩니다.
.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의 주요한 구성 요소를 보여주는 전부라 할 수 있습니다.
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)
'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 |