마이크로소프트에서 개발한 응용 프로그램 개발 환경으로서 프로세스 가상 머신(VM)에 해당한다.
윈도우 플랫폼을 메인 타켓으로 개발된 '닷넷 프레임워크(.NET Framework)'와 다중 플랫폼을 타겟으로 개발된 '닷넷 코어(.NET Core)'로 나뉘어 개발되고 있었으나 '닷넷 5'부터 통합되어 '닷넷'이라고 불리게 되었다.
CLR과 부가 구성 요소를 합친 개념이다. 여기서 부가 구성 요소에는 BCL, GAC, 부가적인 실행 파일(언어별 컴파일러, 각종 유틸리티 실행 파일 등)이 있다.
닷넷 프레임워크는 특정 네이티브 언어가 아닌 다양한 언어를 지원하여 중간 언어(IL)로 컴파일한다.
닷넷 호환 언어로 작성된 코드는 컴파일시 중간 언어(IL)로 실행 파일 내부에 생성된다. 이 때 실행 파일 내부에 CLR을 로드하는 CLR 로더도 같이 포함된다.
프로그램을 실행하면 CLR 로더에 의해 CLR이 먼저 로드되고 중간 언어 코드를 로드해서 실행된다.
컴파일의 결과물을 중간 언어로 생성해내는 언어이다. (ex. C#, C++/CLI, F#)
닷넷 호환 언어로 작성된 코드는 CLR이 실행할 수 있다.
또한 닷넷 호환 언어는 중간 언어 코드의 결과물을 공유하기 때문에 상호 호출이 가능하다.
즉 서로 클래스를 공유하고, 상속도 받을 수 있다.
닷넷의 중간 언어를 CIL이라고 한다. (Java VM의 중간 언어는 Bytecode)
CIL은 CPU에 독립적인 결과물이며, 모든 닷넷 호환 언어는 CIL로 컴파일되고 CLR에 의해 CPU의 기계어로 번역된다.
닷넷 호환 언어가 지켜야 할 타입의 표준 규격을 정의한 것이다.
닷넷 프레임워크 상에서 실행되는 언어는 반드시 CTS 규약을 만족하는 한도 내에서 구현돼야 한다.
대표적인 예시로, CTS에서는 클래스 상속을 하나만 받을 수 있도록 정의하고 있기 때문에 닷넷 호환 언어는 다중 상속을 지원하지 않는다.
단 CTS에서 정의된 모든 규격을 구현할 필요는 없다. 따라서 닷넷 호환 언어는 각자 지원하는 범위가 다르다.
닷넷 호환 언어가 지켜야 할 최소한의 언어 사양을 정의한 것이다.
CTS와는 반대로 닷넷 호환 언어는 CLS에서 정의한 사양을 완벽하게 구현해야 한다.
이는 닷넷 호환 언어들 사이의 호환성 문제를 해결하기 위한 최소한의 방침이다.
데이터를 위한 데이터를 뜻한다.
그림 파일의 경우 단순히 원본 그림 데이터를 제외하고도 해상도, 너비, 높이와 같은 데이터를 포함하는데 이를 메타데이터라고 한다.
프로그래밍에서의 메타데이터는 개발자가 구현한 코드의 성격을 설명해주는 별도의 데이터이다.
CLR에서 동작하는 실행 파일은 완전하게 자기 서술적인(self-descriptive) 메타데이터를 제공하며 리플렉션(Reflections)을 통해 사용할 수 있다.
메타데이터를 통해 EXE/DLL 파일에서 어떤 클래스와 메서드가 제공되는지 확인할 수 있다.
어셈블리(실행 파일)는 1개 이상의 모듈로 구성되어 있다. 이 때 모듈과 파일은 1:1 대응된다.
어셈블리(실행 파일)가 여러 개의 모듈(파일)로 구성되어 있다면 그 모듈 중 하나는 반드시 다른 모듈의 목록을 관리하는 매니페스트 데이터를 가지고 있어야 한다.
매니페스트를 포함하고 있지 않은 모듈은 보통 확장자가 netmodule이고 매니페스트를 포함하는 모듈은 확장자가 EXE/DLL이다.
다른 사람이 만든 어셈블리의 코드를 사용하고 싶으면 매니페스트와 관련된 모듈을 전부 가지고 있어야 한다.
마이크로소프트에서 ECMA 표준으로 제출한 공개 규약이다.
CLI는 CTS 명세를 포함하며, 중간 언어에 대한 코드 정의, 메타데이터와 그것을 포함하는 이진 파일의 구조까지 표준 사양으로 기술하고 있다.
즉 CLI 사양을 준수한 구현체라면 닷넷 파일을 실행할 수 있다.
CLI 규격의 구현체 중 대표적인 것이 마이크로소프트의 CLR이다. 모노(Mono) 프레임워크와 닷넷 코어(.NET Core)도 CLI 구현체의 예시 중 하나이다.
CLI 사양을 따르는 대표적인 VM으로 마이크로소프트에서 윈도우 운영체제용으로 배포되고 있다.
CLR은 다음 두 가지의 큰 기능을 제공한다.
1. 중간 언어를 JIT 컴파일러를 이용해 기계어로 변환한다.
2. GC를 제공해 동적 메모리 할당 및 회수를 지원한다.
CLR은 관리 환경(Managed Environment)이라고 불리기도 하며, CLR이 로드되는 프로세스를 관리 프로세스(Managed Process), 닷넷 호환 언어를 관리 언어(Managed Language)라고 한다.
Native와 Managed가 서로 상반되는 개념이라고 이해하면 될 것 같다.
특정 기능을 수행하는 타입을 미리 만들어 모아둔 라이브러리.
컴퓨터에서 실행되는 닷넷 응용 프로그램이 어셈블리 파일을 공통적으로 찾을 수 있는 전역 저장소이다.
일반적으로 C:\Windows\assembly 폴더에 위치하며 각종 DLL 파일을 담고 있다.
CLI 구현체 중 하나로 다중 플랫폼(맥, 리눅스 등)에서 실행할 수 있다는 것이 강점이다.
닷넷 프레임워크와는 하부 구조만 공유하기 때문에 기반 라이브러리가 달라진다. 닷넷 프레임워크는 Base Class Library을 사용하지만 닷넷 코어는 Core Library를 사용한다.
닷넷 프레임워크와 닷넷 코어의 기반 라이브러리가 다르기 때문에 재사용성의 문제가 발생한다.
예를 들어, BCL를 상속받아 만든 DLL 파일은 닷넷 코어 환경에서는 사용할 수 없다.
이를 해결하기 위해 만든 표준 규격이 닷넷 표준이다.
참고 자료
시작하세요! C# 10 프로그래밍 - 정성태
글 잘 봤습니다.