닷넷 프레임 워크 구조

2022. 7. 1. 11:08C#/C#에 대한 다양한 공부

[닷넷 프레임워크의 실행 구조]

CIL(Common Intermediate Language) : 공통 중간 언어로 속칭 'IL코드' 한다. C# 기준으로 C# 컴파일러가 만들어내는 중간 언어로 '런타임' 이해할 있는 언어. 뿐만 아니라 모든 닷넷 호환 언어는 IL코드로 컴파일이 가능하다.

  • 닷넷 호환 언어 : 어떤 언어의 컴파일러든 결과물로 중간 언어로 생성해 낸다면 CLR 그것을 실행할 있다. 닷넷 호환 언어는 코드의 결과물을 공유하기 때문에 상호 호출이 가능하다. C#에서 F#클래스를 상속받는등

CTS(Common Type System) : 공용 타입 시스템으로 닷넷 호환 언어가 지켜야할 타입의 표준 규격을 정의한것이다. 만약에 새로운 언어를 만든다면 CTS 규약을 만족하는 한도 내에서만 구현할 있다. 하지만 모든 CTS규격을 따를 필요는 없다.

  • C#에서는 4바이트 정수를 int, VB.NET에서는 Integer라고 하는데 이들은 모두 닷넷의 공용타입인 System.Int32 타입이다

CLS(Common Language Specification) : 공용 언어 사양으로 닷넷 호환 언어가 지켜야할 최소한의 언어 사양이다. 닷넷 호환 언어는 서로 언어의 클래스를 상속 받을 있는데 이때 상속 받은 클래스에서는 사용하고 싶은 타입이 구현되어 있지 않을 있다. CLS는 다음과 같은 2가지 의미를 가지고 있다.

  • 모든 닷넷 호환 언어가 CLS에서 정의한 사양만큼은 구현해야 한다.
  • 서로 다른 닷넷 호환 언어끼리 호출할때 CLS를 만족시키도록 작성해야 한다.

CLI(Common Language Infrastructure) : 공용 언어 기반구조로 CTS, CLS, 가상 실행 시스템, 메타데이터등 가장 큰틀에서 동작하는 공개 규약이다. 결국 닷넷 프레임워크는 CLI 구현체라고 보면 된다.

CLR(Common Language Runime) : 공용 언어 런타임으로 CLI사양을 따르는 가장 대표적인 VM이다. 대표적으로 기능 2가지로는 중간언어를 JIT컴파일러 이용해 필요한 코드를 기계어로 변환하는 것과 가비지컬렉터.

  • BCL Support : 그대로 BCL 사용할 있도록 지원해주는 위함
  • Thread Support : 다중 스레드를 관리하기 위함
  • Type Checker : CTS, CLS 사용하여 검사하기 위함
  • Security Engine : 형식 안전성, 권한부여등 보안 관리를 위함
  • Exception Manager : 예외 처리를 위함
  • Debug Engine 디버그를 지원하기 위함
  • Garbage Collector : 가비지 컬렉터를 사용하기 위함
  • CLR Loader : 어셈블리가 CLR Loader 의해 로드됨
  • JIT(Just In Time) Compiler : CIL 기계어로 변환하기 위함이며 '프로그램을 실제 실행하는 시점' 기계어로 번역하는 컴파일 기법

JIT Compiler의 종류

  1. Pre-JIT Compiler : 전체 코드를 한번에 기계어로 컴파일됨, 애플리케이션 배포시 수행됨
  2. Normal JIT Compiler : 런타임에 필요한 소스 코드만 JIT 컴파일러에서 처음 호출될때 기계어로 컴파일됨. 그 후 캐싱 되어 다시 호출될 때마다 사용됨
  3. Econo JIT Compiler : 닷넷 2.0부터는 사용되지 않고 있음, 런타임에 필요한 소스코드만 Econo JIT Compiler에 의해 컴파일되고 더 이상 필요하지 않으 면 제거됨
  • Code Manager : Managed code 관리하기 위함 Managed code 언어별 컴파일러에 의해 중간언어로 변환 JIT Compiler 통해 기계가 변환됨

(Managed code : 그대로 '관리되는 코드'라는 말로 정확하게는 내가 쓰는 언어의 컴파일러가 만든 중간언어를 관리(java 경우 JVM c# 경우 CLR)된다는

Managed code vs Unmanaged code

JVM, .NET등이 설치 되어있어야만 실행이 가능하다. 빠른 실행 속도를 가진다.
깔려만 있다면 어떤 OS에서든 작동이 가능하다.  OS 직접 컴파일되어 중간언어 생성과정 없이 바로 Binary code 만든다.
중간 과정을 거치기 때문에 그만큼 실행속도가 느릴 있다.  

 

'C# > C#에 대한 다양한 공부' 카테고리의 다른 글

C# 해시테이블 vs 딕셔너리 [hashtable vs dictionary]  (0) 2022.07.04
dll, lib  (0) 2022.07.01
Static, 싱글톤  (0) 2022.07.01
[async/await]  (0) 2022.07.01
Delegate  (0) 2022.07.01