언어/C#

CLR? .NET? Mono?

tsyang 2023. 10. 1. 22:01

선 정리

  • CTS, CLS는 닷넷 호환 언어가 지켜야하는 규약
  • 닷넷 호환 언어는 CIL을 만들어낸다.
  • CIL을 가지고 어떡할지에 대한 규격이 CLI
  • CLI를 구현한 것이 CLR, Mono
  • 닷넷 코어, 닷넷 프레임워크 등은 CLI 구현체 (ex. CLR)을 포함하고 추가적인 기능 제공

 

CIL

CIL(Common Intermediate Language)는 그냥 IL이라고도 쓴다. IL코드는 CPU에 독립적인 결과물이다. 닷넷 호환 언어들은 소스코드를 IL로 컴파일하고, CLR같은 애들이 IL 코드를 CPU기계어로 최종 번역한다. 

 

.

CTS

CTS(Common Type System)는 닷넷 호환 언어가 뭘 구현할 수 있느냐를 정의한 규격. 가령 CTS에서는 다중 상속을 지원하지 않기 때문에 CTS를 만족하는 언어는 다중상속을 사용할 수 없음.

 

.

CLS

CLS(Common Language Specifiaction)은 닷넷 호환 언어가 꼭 구현해야 할 사양. 얘를 들어 unsigned는 CTS규격 안에 포함되지만 CLS에는 없는 규격임. 그러므로 닷넷 호환 언어끼리 섞어서 쓸 일이 있다면 이 부분에서만큼은 CLS 규격 내에서 써야 함.

 

.

CLI

CLI(Common Language Infrastructure)는 마이크로 소프트에서 정의한 일종의 규약임. IL에 대한 코드 정의와 메타데이터 등등의 구조등이 기술되어 있음. 이거는 공개되어 있는 사양이라 누구나 구현을 할 수 있다. CTS 명세를 포함한다.

 

닷넷 언어들이 CIL을 만들면, CLI를 구현한 구현체들이 이것을 번역하여 실행하는 것이다. 

 

마이크로소프트에서 CLI를 준수하여 구현한 구현체가 바로 CLR이다. 그외에 닷넷코어도 있고, 유니티에서 쓰는 Mono 스크립팅 백엔드도 이런 CLI를 준수한 구현체이다.

 

CLI를 지킨 구현체에서 동작하는 닷넷 파일은 다른 구현체에서 실행하는 게 가능하다. 즉, C#에서 만들어진 IL이 CLR과 Mono 둘 다에서 돌아갈 수 있다는 것.

 

.

CLR

CLI를 준수하는 VM. 마소에서 직접 만든 것이며, Windows OS용으로 배포되고 있다. CLR에는 크게 두가 지 기능이 있는데 하나는 IL을 JIT 컴파일러를 이용해 기계어로 변환하는 것이고, 다른 하나는 GC를 제공하는 것이다.

 

.

 

.Net Framework

닷넷 프레임워크 = CLR + @

부가 요소에는 BCL(Base Class Library), 전역 어셈블리 캐시같은 게 포함됨.

 

닷넷 프레임워크를 기반으로 만들어진 프로그램은 닷넷 프레임워크가 미리 설치된 환경에서만 실행된다. 닷넷 프레임워크를 설치하면 VM역할을 하는 CLR이 윈도우에 설치된다. CLR은 EXE가 실행되면 메모리에 올라가 같이 실행된다

 

C#은 마이크로소프트가 닷넷 프레임워크를 위해 만든 언어. 당연히 닷넷 호환 언어이며 닷넷에 새로운 기능이 추가될 때 마다 C#도 같이 버전업됨.

 

.

.Net Core

닷넷 코어는 CLI의 또 다른 구현체. 다중 플랫폼 (Mac, Linux...)등에서 실행할 수 있도록 만들어짐.

 

.

.Net Standard

닷넷 프레임워크나 닷넷 코어는 저마다의 기반 라이브러를 가지고 있는데, 닷넷 프레임워크는 BCL, 닷넷 코어는 Core Library라고 부름.

 

아무튼 이렇게 기반 라이브러리가 나뉘면서 한쪽에서 만든 DLL을 다른 쪽에서 쓸 수 없는 문제가 발생함. 따라서 이런 기반 라이브러리를 통합하기 위해 나온 것이 닷넷 표준(.Net Standard) 라이브러리임.

 

출처 :  https://devblogs.microsoft.com/dotnet/introducing-net-standard/

 

.

 

.Net 5

2020년에 출시된 .Net 5는 닷넷 프레임워크, 닷넷 코어, 자마린 등을 통합시킨 것. 이제 닷넷 프레임워크는 안 나옴.

 

.

 

C#버전

 

https://learn.microsoft.com/ko-kr/dotnet/csharp/language-reference/configure-language-version

 

 


참고 : 정성태, 시작하세요! C# 8.0 프로그래밍 , 위키북스, 1장

https://learn.microsoft.com/ko-kr/dotnet/csharp/language-reference/configure-language-version

https://devblogs.microsoft.com/dotnet/introducing-net-standard/

'언어 > C#' 카테고리의 다른 글

가비지 없이 foreach 사용하기  (0) 2024.01.21
Dynamic 타입  (0) 2024.01.14
Blittable Types  (1) 2023.05.13
beforefieldinit  (0) 2023.04.23
(C# 7.2) Span<T>  (0) 2022.08.07