logo

.NET 공용 언어 런타임(CLR)

.NET CLR은 .NET 프로그래밍 언어로 작성된 코드를 관리하고 실행하는 런타임 환경입니다. CLR은 .NET Framework의 가상 머신 구성 요소입니다. 해당 언어의 컴파일러는 .NET 호환 언어를 사용하여 개발된 응용 프로그램의 소스 코드를 MSIL이라는 CLR의 중간 언어, 즉 Microsoft 중간 언어 코드로 컴파일합니다. 이 코드는 플랫폼 독립적입니다. 이는 Java의 바이트 코드와 유사합니다. 메타데이터는 컴파일 및 MSIL 코드 중에도 생성되어 매니페스트 파일이라는 파일에 저장됩니다. 이 메타데이터는 일반적으로 MSIL 코드를 실행하기 위해 CLR에 필요한 멤버 및 유형에 관한 것입니다. CLR의 JIT(Just-In-Time) 컴파일러 구성 요소는 MSIL 코드를 컴퓨터의 기본 코드로 변환합니다. 이 코드는 플랫폼에 따라 다릅니다. CLR은 메모리, 스레드, 예외, 코드 실행, 코드 안전, 확인 및 컴파일을 관리합니다.

문자열 C++에서 찾기

다음 그림은 소스 코드를 네이티브 코드로 변환하는 모습을 보여줍니다.

Net 공용 언어 런타임

위의 그림 코드를 CPU가 실행할 수 있는 네이티브 코드로 변환합니다.

CLR의 주요 구성 요소는 다음과 같습니다.

  • 공통 유형 시스템
  • 공통언어 종분화
  • 가비지 컬렉터
  • 적시 컴파일러
  • 메타데이터 및 어셈블리
Net 공용 언어 런타임

1. 공통 유형 시스템:

CTS는 런타임 시 데이터 유형을 선언, 사용 및 관리하기 위한 지침을 제공합니다. 언어 간 의사소통을 제공합니다. 예를 들어 VB.NET에는 정수 데이터 유형이 있고 C#에는 정수 관리를 위한 int 데이터 유형이 있습니다. 컴파일 후에는 두 데이터 유형 모두에서 Int32가 사용됩니다. 따라서 CTS는 관리 코드를 사용하여 데이터 유형을 제공합니다. 공통 유형 시스템은 언어 독립적인 코드를 작성하는 데 도움이 됩니다.

두 가지 범주의 유형을 제공합니다.

    값 유형:값 유형은 스택에 할당된 메모리나 구조의 인라인에 데이터를 저장합니다. 이 유형 카테고리는 데이터 디렉토리를 보유합니다. 한 변수의 값이 다른 변수에 복사되면 두 변수 모두 데이터를 독립적으로 저장합니다. 내장 유형, 사용자 정의 또는 열거 유형일 수 있습니다. 내장 유형은 숫자, 부울, 문자 및 날짜와 같은 기본 데이터 유형입니다. 소스 코드의 사용자는 사용자 정의 유형을 만듭니다. 열거형은 레이블로 표시되지만 숫자 유형으로 저장되는 열거된 값 세트를 나타냅니다.
    Net 공용 언어 런타임 참조 유형:참조 유형은 메모리 주소 값에 대한 참조를 저장하고 힙에 할당됩니다. 힙 메모리는 동적 메모리 할당에 사용됩니다. 참조 유형은 실제 데이터를 직접 보유하지 않고 데이터의 주소를 보유합니다. 참조형 객체가 생성될 때마다 실제 데이터가 아닌 주소를 복사합니다. 따라서 두 변수는 동일한 데이터를 참조합니다. 하나의 참조 유형 개체의 데이터가 변경되면 다른 개체에도 동일하게 반영됩니다. 참조 유형은 자체 설명 유형, 포인터 유형 또는 간섭 유형일 수 있습니다. 자체 설명 유형은 자체에 대한 메타데이터를 저장하는 문자열, 배열 및 클래스 유형일 수 있습니다.

2. 공통 언어 사양(CLS):

CLS(공용 언어 사양)에는 모든 NET 지원 언어가 따라야 하는 규칙 집합이 포함되어 있습니다. 공통 규칙을 사용하면 언어 통합을 쉽게 구현하고 언어 간 상속 및 디버깅에 도움이 됩니다. NET Framework에서 지원하는 각 언어에는 고유한 구문 규칙이 있습니다. 그러나 CLS는 NET 언어를 사용하여 개발된 애플리케이션 간의 상호 운용성을 보장합니다.

3. 쓰레기 수거:

Garbage Collector는 자동 메모리 관리자로 작동하는 CLR의 구성 요소입니다. 요구사항에 따라 자동으로 메모리를 할당하여 메모리 관리에 도움을 줍니다. 객체에 힙 메모리를 할당합니다. 객체가 사용되지 않으면 나중에 사용할 수 있도록 객체에 할당된 메모리를 회수합니다. 또한 한 개체가 다른 개체의 콘텐츠를 사용하는 것을 허용하지 않음으로써 개체의 안전을 보장합니다.

4. JIT(Just In Time) 컴파일러:

JIT 컴파일러는 CLR의 중요한 구성 요소입니다. MSIL 코드를 네이티브 코드(예: 컴퓨터 관련 코드)로 변환합니다. .NET 프로그램은 명시적으로 또는 암시적으로 컴파일됩니다. 개발자나 프로그래머는 특정 컴파일러를 호출하여 명시적 컴파일에서 프로그램을 컴파일합니다. 암시적 컴파일에서는 프로그램이 두 번 컴파일됩니다. 소스 코드는 첫 번째 컴파일 프로세스 중에 MSIL(Microsoft Intermediate Language)로 컴파일됩니다. MSIL 코드는 두 번째 컴파일 프로세스에서 네이티브 코드로 변환됩니다. 이 프로세스를 JIT 컴파일이라고 합니다. JIT 컴파일러에는 Pre, Econo 및 Normal의 세 가지 유형이 있습니다. 사전 JIT 컴파일러는 실행 전에 전체 MSIL 코드를 네이티브 코드로 컴파일합니다. Econo JIT 컴파일러는 실행 중에 필요한 MSIL 코드 부분만 컴파일하고 더 이상 필요하지 않은 부분은 제거합니다. 또한 일반 JIT 컴파일러는 실행 중에 필요한 MSIL 코드 부분만 컴파일하지만 나중에 사용할 수 있도록 캐시에 저장합니다. 이미 사용된 부분은 캐시 메모리에 저장되어 있으므로 다시 컴파일할 필요가 없습니다.

5. Metadata:

메타데이터는 MSIL 코드와 함께 CLR PE(이동식 실행 파일) 또는 메모리에 저장되는 프로그램에 대한 이진 정보입니다. MSIL을 실행하는 동안 클래스 및 관련 항목을 적절하게 해석하기 위해 메타데이터도 메모리에 로드됩니다. 코드에 사용되는 정보입니다. 따라서 메타데이터는 언어 중립적인 방식으로 코드를 구현하거나 언어 상호 운용성을 달성하는 데 도움이 됩니다.

6. 어셈블리:

어셈블리는 물리적 코드 그룹화의 기본 단위입니다. 이는 어셈블리 매니페스트, 메타데이터, MSIL 코드 및 이미지 파일과 같은 리소스 집합으로 구성됩니다. 또한 기본 배포 단위, 버전 관리, 재사용, 보안 권한 등으로 간주됩니다.

.NET CLR 함수

다음은 CLR의 기능입니다.

  • 프로그램을 네이티브 코드로 변환합니다.
  • 예외 처리
  • 유형 안전성 제공
  • 메모리 관리
  • 보안을 제공합니다
  • 성능 향상
  • 언어 독립적
  • 플랫폼 독립적
  • 쓰레기 수거
  • 객체지향 프로그램을 위한 상속, 인터페이스, 오버로딩 등의 언어 기능을 제공합니다.

CLR과 함께 실행되는 코드를 관리 코드라고 하고, CLR 외부의 코드를 비관리 코드라고 합니다. CLR은 관리되는 코드와 관리되지 않는 코드가 모두 상호 운용될 수 있도록 하는 상호 운용성 계층도 제공합니다.

1. 관리 코드:

.NET Framework에서 작성된 모든 언어는 관리 코드입니다. 관리 코드는 메모리 관리, 보안 처리, 언어 간 디버깅 허용 등을 통해 애플리케이션을 관리하는 CLR을 사용합니다. 관리 코드 프로세스는 그림에 나와 있습니다.

Net 공용 언어 런타임

2. 비관리 코드:

.NET 프레임워크 외부에서 개발된 코드를 비관리 코드라고 합니다. CLR의 제어 하에 실행되지 않는 애플리케이션을 관리되지 않는 애플리케이션이라고 합니다. C++와 같은 특정 언어는 운영 체제의 저수준 액세스 기능과 같은 애플리케이션을 작성하는 데 사용될 수 있습니다. VB, ASP 및 COM과의 백그라운드 호환성은 비관리 코드의 예입니다. 이 코드는 래퍼 클래스의 도움으로 실행됩니다. 비관리 코드 프로세스는 다음과 같습니다.

Net 공용 언어 런타임

.NET CLR 버전

CLR은 더 나은 성능을 제공하기 위해 수시로 자체 업데이트됩니다.

.NET 버전 CLR 버전
1.0 1.0
1.1 1.1
2.0 2.0
3.0 2.0
3.5 2.0
4 4
4.5 4
4.6 4
4.6 4

.NET CLR 구조

다음은 Common Language Runtime의 구성 요소 구조입니다.

Net 공용 언어 런타임

기본 클래스 라이브러리 지원

.NET 애플리케이션용 클래스를 지원하는 클래스 라이브러리입니다.

스레드 지원

다중 스레드 애플리케이션의 병렬 실행을 관리합니다.

COM 마샬러

COM 개체와 응용 프로그램 간의 통신을 제공합니다.

보안 엔진

보안 제한을 적용합니다.

디버그 엔진

이를 통해 다양한 종류의 애플리케이션을 디버깅할 수 있습니다.

유형 검사기

애플리케이션에 사용되는 유형을 확인하고 CLR에서 제공하는 표준과 일치하는지 확인합니다.

코드 관리자

실행 런타임 시 코드를 관리합니다.

가비지 컬렉터

사용되지 않은 메모리를 해제하고 이를 새 애플리케이션에 할당합니다.

예외 처리기

애플리케이션 오류를 방지하기 위해 런타임 시 예외를 처리합니다.

클래스로더

런타임에 모든 클래스를 로드하는 데 사용됩니다.