본문 바로가기

프로그래밍/책 정리 : C# 8.0 프로그래밍

[책 정리 : C# 8.0 프로그래밍] 1장. 닷넷 프레임워크 (CIL, CTS, CLS, CLI, CLR)

닷넷 프레임워크란?

마이크로소프트에서 발표한 응용 프로그램 개발 환경으로서 프로세스 가상 머신(VM)에 속한다.
일반적으로 네이티브 언어로 만들어진 프로그램들이 운영체제에서 곧바로 실행되는 것과 달리 
닷넷 프레임워크를 기반으로 만들어진 응용 프로그램은 반드시 닷넷 프레임워크가 미리 설치되어 있어야 한다.

 

닷넷 프레임워크의 CLR은 포로세스(EXE)가 실행되면 메모리에 함께 적재돼 실행된다.

사용자가 프로세스(EXE)를 실행하면 제일 먼저 CLR이 로드되고, CLR이 프로세스(EXE) 내부 중간 언어 IL을 실행시킨다.

 

MS 홈페이지 : 닷넷 프레임워크란?

닷넷 프레임워크는 실행 중인 앱에 다양한 서비스를 제공하는 WINDOWS용 관리형 실행 환경으로, 두 가지 주요 구성 요소로 구성됩니다. 하나는 실행중인 앱을 처리하는 실행 엔진인 CRL이고, 다른 하나는 개발자가 자신의 앱에서 호출할 수 있도록 테스트되고 재사용 가능한 코드로 구성된 닷넷 프레임워크 클래스 라이브러리입니다.

 

https://docs.microsoft.com/ko-kr/dotnet/framework/get-started/

 

.NET Framework 시작

.NET Framework 시작Get started with .NET Framework 이 문서의 내용 --> .NET Framework는 .NET Framework를 대상으로 하는 앱을 관리하는 런타임 실행 환경입니다..NET Framework is a run-time execution environment that manages apps that target .NET Framework. .NET Framework는 메모리 관리 및 기타 시스템 서비스를

docs.microsoft.com

 

 

C# 입장에서 닷넷 프레임 워크는?

C# 컴파일러는 코드를 네이티브 언어가 아닌 중간 언어인 IL(Intermediate Language)로 EXE 파일 내부에 생성한다.

또한 CLR을 로드하기 위해 CLR 로더도 같이 내부에 추가한다. 따라서 사용자가 EXE 실행 시 CLR이 먼저 로드되고 

이어서 CLR이 내부 IL 코드를 로드하며 실행 단계에 들어간다. 

 

닷넷 호환 언어 

어떤 코드를 컴파일하여 중간 언어인 IL을 생성한다면 CLR로 그것을 실행할 수 있다. 

이처럼 CLR로 실행할 수 있게 중간 언어 IL로 컴파일 가능한 언어를 닷넷 호환 언어라고 하며

대표적으로 C#, F#, VB 등이 있다.

 

 

공용 중간 언어 CIL (Common Intermediate Language) 

공용 중간 언어CIL이라고 하며 줄여서 IL 코드 또는 MSIL 코드라고 한다.

닷넷 호환 언어를 컴파일하면 IL(MSIL) 코드가 생성되고 이 코드를 CLR이 최종적으로 CPU 기계어로 번역한다.\

 

 

공용 형식(타입) 시스템 CTS (CommonType System)

공용 형식(타입) 시스템, CTS라 하며 닷넷 호환 언어가 지켜야 할 형식(타입)의 표준 규격을 정의한 것이다.

 

 

공용 언어 스펙 CLS (CommonLanguage Specification)

공용 언어 스펙 CLS는 닷넷 호환 언어가 지켜야 할 최소한의 언어 사양을 정의한 것이다.
간단한 예로 C#에선 unsigned 타입을 지원한다고 하자. 하지만 다른 닷넷 호환 언어는 unsigned 타입을 
지원하지 않는다고 했을 때 호환성 문제가 생긴다. 따라서 서로 다른 언어가 섞여서 프로그램이 만들어질 땐
반드시 CLS를 준수해야한다.

 

메타데이터 

일반적으로 메타데이터란 데이터를 위한 데이터라고 한다.
예를 들어 이미지 파일 속성을 보면 사진의 너비, 높이, 해상도 등의 데이터가 있는데 이는 원본 사진 데이터를
위한 데이터에 해당하므로 이를 메타데이터라 한다.

 

책에 기술된 내용이 잘 이해가 안돼서 MS 홈페이지에서 "메타데이터" 관련 내용을 찾아보았다.

메타데이터는 프로그램을 기술하는 이진 정보이며 컴파일 시 MSIL로 변환됩니다.  모듈 또는 어셈블리(EXE, DLL)에서 정의되고 참조된 모든 형식과 멤버는 메타데이터 내에 기술됩니다. 코드를 실행하면 CLR은 메타데이터를 메모리로 로드한 다음 해당 코드의 클래스, 멤버, 상속 등에 대한 정보를 검색합니다. 

 

https://docs.microsoft.com/ko-kr/dotnet/standard/metadata-and-self-describing-components

 

메타데이터 및 자동 기술 구성 요소

이 문서의 내용 --> 이전에 한 가지 언어로 작성된 소프트웨어 구성 요소(.exe 또는 .dll)는 다른 언어로 작성된 소프트웨어 구성 요소를 쉽게 사용할 수 없었습니다.In the past, a software component (.exe or .dll) that was written in one language could not easily use a software component that was written in another language

docs.microsoft.com

 

어셈블리

C#으로 프로그램을 만드는 경우 대게 EXE, DLL을 생성하게 되는데 이런 실행 파일을 어셈블리라 한다. 
닷넷 프로그래밍에서 특별한 언급이 없다면 EXE, DLL은 어셈블리를 의미한다.

 

 

공용 언어 기반구조 CLI (CommonLanguage Infrastructure)

공용 언어 기반구조 CLI는 마이크로소프트에서 ECMA 표준으로 제출한 공개 규약이다. 
CLI는 CTS 명세를 포함하며, 중간 언어에 대한 코드 정의, 메타데이터와 그것을 포함하는 이진 파일의 구조까지 
표준 사양으로 기술하고 있다. 

 

닷넷 프레임위크는 이 CLI 구현체 중 하나이며 그 밖에 CLI 구현체로는 닷넷 코어, MONO 프레임워크 등이 있다.

 

 

공용 언어 런타임 CLR (Common Language Runtime)

공용 언어 런타임 CLR은 CLI 사양을 따르는 가장 대표적인 가상 머신으로 마이크로소프트가 개발해 윈도우
운영체제용으로 배포되고 있다. CLR은 크게 두 가지 일을 하는데 하나는 JIT 컴파일러를 이용해 IL 코드를 
네이티브 기계어로 변환하는 것이고, 다른 하나는 가비지 수집기 GC를 제공해 동적 메모리 할당 및 
회수를 지원하는 것이다. 

사실 C#을 닷넷 호환 언어라고 하는데 CLI 호환 언어라고 하는 것이 옳다.
CLR(닷넷 프레임워크)은 CLI 구현체 중 하나이기 때문이다.

 

 

마무리 : 닷넷 프레임워크란

 

 

내 머릿속으로 정리한 닷넷 프레임워크는 CLR과 닷넷 프레임워크 클래스 라이브러리로 구성된 응용 프로그램

개발 환경이며 CLI 기반 구현체 중 하나이다.

 

C#을 공부하기 전 닷넷 프레임워크에 대한 정의를 다시 한번 공부하게 되었는데 아무래도

C#이 CLI 호환 언어(or 닷넷 호환 언어) 중 하나이기 때문인 것 같다. CLI 호환 언어를 공부하는 것이기 때문에 

CLI 구현체인 닷넷 프레임워크를 알아야 하니까.