닷넷 프레임워크(.NET Framework)는 2002년에 마이크로소프트에서 발표한 응용 프로그램 개발 환경으로서 프로세스 가상 머신에 속한다. 일반적인 네이티브 언어로 만들어진 프로그램들이 운영체제에서 곧바로 실행되는 것과는 달리, 닷넷 프레임워크를 기반으로 만들어진 응용 프로그램은 반드시 닷넷 프레임워크가 미리 설치된 환경에서만 실행된다.
CLR은 CLI 사양을 따르는 가장 대표적은 VM으로서 MS에서 개발해 윈도우 운영체제용으로만 배포되고 있다. CLR에는 두 가지 큰 기능이 있는데, 하나는 중간 언어를 JIT 컴파일러를 이용해 기계어로 변환하는 것이고, 다른 하나는 GC(Garbage Collector)를 제공해 동적 메모리 할당 및 회수를 지원하는 것이다.
CLR은 프로세스(EXE)가 실행되면 메모리에 함께 적재돼 실행된다. 닷넷 프로그램은 외형상 EXE/DLL로 기존의 프로그램과 동일한 구조이다. 하지만 내부적으로는 CLR 구성요소가 로드돼 실행되고, 그 CLR이 EXE/DLL에 함께 저장돼 있는 닷넷 코드를 실행한다.
자바의 VM에서는 중간 언어를 특별히 바이트코드(ByteCode)라 한다. 닷넷의 CLR에서는 이를 CIL(Common intermediate Language)라고 하는데 보통 IL코드 혹은 MSIL코드라 한다.
이런 중간 언어를 통해서 CPU에 독립적이고 모든 닷넷 호환 언어는 소스코드를 IL코드로 컴파일하고, CLR이 실행될 때 코드를 CPU의 기계어로 최종 번역한다.
닷넷 호환 언어가 지켜야 할 타입의 표준 규격을 정의한 것. CTS(Common Type System)이다.
CTS는 많은 것을 정의하고 지원하지만, 새로운 닷넷 호환 언어를 만들땐 CTS이상으로 구현할 수 없다.
또한 굳이 CTS의 모든 규격을 다 만들 필요도 없다.
닷넷 호환 언어가 지켜야 할 최소한의 언어 사양. CLS(Common Language Specification)이다.
이건 무조건 완벽하게 구현을 해야한다
CLS는 두 가지 측면에서 의미가 있는데, 하나는 모든 닷넷 호환 언어가 CLS에서 정의한 사양만큼은 구현해야 한다는 것이고, 다른 하나는 호환 언어끼리 호출해야 하는 경우에는 그 기능에 한해서 CLS를 만족시키도록 작성해야 한다는 것이다.
C#으로 프로그램을 만드는 경우 대세 EXE나 DLL파일을 만들게 된다. 닷넷에서는 이런 실행 파일을 어셈블리(Assembly)라고 한다.
프로그래밍 언어인 어셈블리와 전혀 다른 것이다. 닷넷 프로그래밍 상으로 어셈블리라하면 보통 실행 파일(EXE,DLL)를 뜻한다.
어셈블리는 1개 이상의 모듈로 구성되는데 모듈 하나당 한 개의 파일이 대응되고 만약 1개 이상의 파일이 하나의 어셈블리를 이루고 있다면 그 파일 목록을 관리하는 매니페스트(Manifest) 데이터 또한 가지고 있다.
매니페스트를 포함하고 있지 않은 모듈은 보통 확장자가 netmodule이고, 매니페스트를 포함하는 경우에는 확장자가 DLL(또는 EXE)이다. 에셈블리는 그 자체가 "참조 단위"이자 "배포 단위"이기 때문에 다른 사람이 만든 어셈블리에 구현된 코드를 갖다 쓰고 싶으면 매니페스트가 포함된 모듈 및 그와 관련된 모든 모듈을 함께 가지고 있어야 한다.
CLI(Common Language Infrastructure)는 MS에서 ECMA(European Computer Manufacturers Association) 표준으로 제출한 공개 규약이다. CLI는 CTS명세를 포함하며, 중간 언어에 대한 코드 정의, 메타데이터와 그것을 포함하는 이진 파일의 구조까지 표준 사양으로 기술하고 있다.
공개된 CLI를 통해 누구나 가져가서 임의로 구현할 수 있으며 IBM이 만든 JVM 위에서 컴파일된 자바 클래스 파일이 오라클의 JVM 위에서 동작하는 것처럼 CLI 사양을 준수한 구현체에서 동작하는 닷넷 파일은 또 다른 구현체에서 실행하는 것이 가능하다.
CLI 규격은 MS에서 구현한 실체가 CLR이고 MS에선 CLI를 외부에서도 쉽게 구현할 수 있도록 최소한의 코드로 CLI를 구현한 SSCLI(Shared Source CLI)도 만들어서 공개했다. 그 밖에 모노(Mono) 프레임워크 및 닷넷 코어(.NET Core)라는 또 다른 CLI 구현체가 오픈소스로 꾸준히 개발되고 있으며 이 프레임워크들은 리눅스나 맥 운영체제까지 지원한다.
주의!
CLI, CLR, 닷넷은 보통 구분 없이 사용된다. C# 같은 언어는 닷넷 호환 언어라는 말보다는 CLI 호환언어가 좀 더 맞다. CLI 구현체 중에 CLR이 가장 대표적이고, CLR은 닷넷 프레임워크에 포함되어 있으니 암묵적으로 혼용된다고 한다.
CLR 기능만으로는 만족할 수 없는 개발자를 위해 MS가 CLR말고 이것 저것 붙여서 하나의 패키지로 묶어 배포하는 것이 닷넷 프레임워크
이다. 흔히 닷넷이라 줄여말한다.
추가로 붙인 이것 저것에는 다음과 같은 것들이 있다
C:\\Windows\assembly
폴더에 위치하고 각종 DLL파일들이 있다."C#은 닷넷 프레임워크를 기반으로 IL 코드를 생성하는 컴파일러에 불과하다. 고로 C#을 배운다는 것은 곧 닷넷 프레임워크를 공부한다는 의미로 C#은 여러 도구중 하나일 뿐 결국엔 닷넷 프레임워크에 익숙해지는 것이 중요하다."
.NET Core는 CLI의 또 다른 구현체이자 다중 플랫폼(맥, 리눅스 윈도우 등)에서 실행할 수 있도록 만들어져 있기 때문에 큰 강점을 가진다. MS는 닷넷 코어의 CLI 구현과 관련해 기반 소스코드를 닷넷 프레임워크와 공유해 모노와는 다른 안정성과 성능으로 차별화했다. 또한 소스코드를 완전히 공개했고 깃허브에서 볼 수 있다.
이러면 코드 재사용이 어려워지므로 MS에서
.NET Standard Library
를 만들었으며 어떤 라이브러리를 새로 만들든지 간에 닷넷 표준 라이브러리 위에서 만들어졌다면 아무런 변경없이 닷넷 코어와 닷넷 프레임워크를 왔다갔다하며 쓸 수 있다.