1. CLR
1) 개념
- CLR은 .NET Framework의 기본이자 .NET Framework의 VM(Virtual Machine, 가상머신) 요소이다.
- CLR은 JAVA 의 VM과 비슷한 역할을 하게된다.(애초 C#만들던 사람이 JAVA 흉내 좀 냄.)
자세한 내용은 (2020/04/09 - [Programming/C#] - [어원/C#] C#이란? - 3번 JAVA내용 확인)
- 즉, 우리가 작성한 소스코드(C#, C++ 등) 를 OS위에 있는 .NET Framework에서 작동하게 해주는 것이라고 보면 된다.
2) CLR의 내부 구조
CLR 내부에는 Figure2에서 나타난 것처럼 여러개의 구성요소들이 있다. 하나씩 알아보겠다.
- Base Class Library Support: CLR은 Base Class Library(BCL)를 지원한다. (Collections, I/O, XML, DataType definition 등)
- Thread Support: CLR은 Multipe threads(다중 스레드)의 병렬 실행을 관리하기 위한 threads 지원을 제공한다.
- COM Marshaller:
[Mashaller(마샬러)란?: C#에 없는 것을 가져다 쓰게 해준다는 뜻...예상임.]
[COM(Componet Object Model)란?: Component 규약을 따르는 Microsoft 사가 주체가 되어 만든 표준. 즉 어떤 프로그램이나 시스템을 이루는 컴포넌트들(.ocx, .dll, .exe 등)이 상호 통신을 할 수 있도록 하는 매커니즘이다.]
- Type Checker: CLR안의 CTS(Common Type System)과 CLS(Common Language Specification)를 사용하여 형식 검사.
- Exception Manager: .NET Language에 상관없이 예외를 처리한다.
- Security Engine: .NET framework에서 제공되는 툴을 이용하여 Code, Folder, Machine Level 단위로 보안 사용 권한을 처리한다.
- Debug Engine: 응용프로그램은 Debug Engine을 통하여 런타임동안 디버그가 가능하다. 이와 관련되어 Code 관리 및 추적에 편한 ICorDebug 인터페이스가 있다.
- JIT Compiler: CLR의 JIT 컴파일러는 마이크로소프트 중간 언어(Microsoft Intermediate Language, MSIL)를 JIT Compiler가 실행되는 컴퓨터 환경에 특정한 기계 코드로 변환한다. 컴파일된 MSIL은 필요한 경우 후속 호출에 사용할 수 있도록 저장된다.
[JIT란? Just - In - Time 이다. '그순간' 이라는 뜻으로 위 내용과 같다.]
- Code Manager: CLR의 코드 매니져는 .NET Framework에서 개발된 코드, 즉 Managed code를 관리한다. Managed code는 언어별 컴파일러에 의해 중간 언어로 변환된 후 JIT Compiler에 의해 중간 언어가 기계 코드로 변환된다.
- Garbage Collector :CLR에서 Garbage Collector를 사용하여 자동 메모리 관리가 가능하다. 가비지 수집기는 더 이상 필요하지 않은 메모리 공간을 자동으로 해제하여 재할당이 가능하도록 한다.
- CLR Loader: 다양한 Modules, resources, assemblies 등은 CLR Loader에 의해 로드된다. 또한, 이 로더는 프로그램 초기화 시간이 더 빠르고 소모되는 자원이 덜하도록 실제로 필요한 경우 모듈을 온디맨드 방식으로 로드한다. (온디맨드 방식이란? '요구가 있을 때는 언제든지' 라는 뜻이다.)
앞서 살펴본 것과 같이 CLR은 단순히 C#이나 기타 언어들을 동작시키는 환경 기능 외에도, 프로그램의 오류(예외 등)가 발생 하였을 때 이를 처리하도록 도와주는 기능, 언어간의 상속 지원, COM과의 상호 운영성 지원, 자동 메모리 관리 등의 기능을 제공 해준다.
https://www.geeksforgeeks.org/architecture-of-common-language-runtime-clr/
3)CLR의 동작원리
우리가 Source code를 작성하면 C# Compiler(Language Compiler)가 IL(Intermediate Language)(아래 그림에서는 MSIL을 뜻함)이라는 중간 언어로 작성된 실행 파일을 만들어 준다. 마지막으로 사용자가 이 파일을 실행하게 되면 CLR이 IL을 읽어 하드웨어가 이해할 수 있는 NativeCode로 컴파일(JIT Compiler 이용)한 후 실행시킨다.
이러한 방식의 장점은 바로 플랫폼에 최적화된 코드를 만들어 낸다는 것이다. 단점으로는 실행 시에 이루어지는 컴파일 비용의 부담이다. 허나 내가 만든 프로그램이 컴파일 비용의 부담없이 어떠한 기계에서도 평균의 성능을 내는 것과 컴파일 비용이 조금 부담스럽긴 해도 기계에 최적화되어 최고의 성능을 내는 것, 어느 쪽이 더 나은가 보면 보통 어떠한 기계에서도 사용하는 것이 가장 좋을 것이다.
4) C#에서 CLR의 위치.
https://docs.microsoft.com/ko-kr/dotnet/standard/clr
※참고자료: 나무위키, WIKIPEDIA, Microsoft .NET Documents
※본 게시물 속 내용을 통해 직접적으로 상업적인 목적이 없으며 게시물은 개인 공부 목적 및 지식 간단 연구목적으로 사용되었음을 명시함. 책 및 인터넷 검색을 참고자료로 하여 실습 및 학습을 한 내용을 올림. 참고한 책 및 인터넷 검색물의 저작권을 존중하므로 책 및 인터넷 저작물의 일부 또는 전부를 무단 복제 및 무단 전재 및 재배포하지 않음(일부라 함은 30%이하의 내용 중복은 불포함[30%이하는 다른 저작물로 간주]). 또한 책 또는 매체를 구매하지 않고는 정확한 내용을 알 수 없으며 개인이 따로 공부한 내용도 추가 되어 책과는 내용이 매우 상이할 수 있음.즉 본 게시물 작성자는 이 게시물을 읽는 모든 사람들이 책을 구매거나 인터넷 검색을 더하여 지식을 같이 나누었으면 좋겠음.
※저작권법 제 28조: 공표된 저작물은 보도, 비평, 교육, 연구 등을 위하여는 정당한 범위 안에서 공정한 관행에 합치되게 이를 이용할 수 있다.
※저작권법에 의거 본 게시물은 원저작물에 대한 수요를 대체하지 아니하며 일반적인 관념, 수록형태를 모두 준수함.
'Programming > C#' 카테고리의 다른 글
[기초(1)/C#] Hello, world! (0) | 2020.04.09 |
---|---|
[어원/C#] C#이란? (0) | 2020.04.09 |