CLR(공용 언어 런타임) 개요 - .NET Framework
CLR(공용 언어 런타임) 개요Common Language Runtime (CLR) overview 이 문서의 내용 --> .NET Framework에서는 공용 언어 런타임이라고 하는 런타임 환경을 제공하는데, 여기에서는 코드를 실행하며 개발 과정을 더 쉽게 해 주는 서비스를 제공합니다.The .NET Framework provides a run-time environment called the common language runtime, which ru
docs.microsoft.com
.NET Framework에서는 공용 언어 런타임이라고 하는 런타임 환경을 제공하는데, 여기에서는 코드를 실행하며 개발 과정을 더 쉽게 해 주는 서비스를 제공합니다.
컴파일러와 도구는 공용 언어 런타임의 기능을 노출하며 관리되는 이 실행 환경을 활용하는 코드를 작성할 수 있게 해줍니다. 런타임을 대상으로 하는 언어 컴파일러를 사용하여 개발한 코드를 관리 코드라고 합니다. 이 코드에서는 언어 간 통합, 언어 간 예외 처리, 향상된 보안, 버전 관리 및 배포 지원, 구성 요소 상호 작용을 위한 간단한 모델, 디버깅 및 프로파일링 서비스 등의 기능을 이용합니다.
참고
형식 시스템, 메타데이터의 형식 및 런타임 환경(가상 실행 시스템)은 모두 공용 표준인 ECMA Common Language Infrastructure 사양으로 정의하기 때문에 컴파일러 및 도구에서 공용 언어 런타임이 사용할 수 있는 출력을 생성할 수 있습니다. 자세한 내용은 ECMA C# 및 공용 언어 인프라 사양을 참조하세요.
런타임에서 관리 코드에 서비스를 제공할 수 있게 하려면 언어 컴파일러에서 사용자 코드의 형식, 멤버 및 참조를 설명하는 메타데이터를 내보내야 합니다. 메타데이터는 코드와 함께 저장되며 로드 가능한 모든 공용 언어 런타임 PE(이식 가능한 실행) 파일에는 메타데이터가 포함되어 있습니다. 런타임에서는 메타데이터를 사용하여 클래스를 찾고 로드하며, 메모리에 인스턴스를 배치하고, 메서드 호출을 확인하고, 네이티브 코드를 생성하고, 보안을 강화하며, 런타임 컨텍스트 경계를 설정합니다.
런타임에서는 자동으로 개체 레이아웃을 처리하고 개체에 대한 참조를 관리하며, 이들이 더 이상 사용되지 않을 때는 해제합니다. 수명을 이런 식으로 관리하는 개체를 관리되는 데이터라고 합니다. 가비지 수집을 통해 메모리 누수뿐만 아니라 기타 몇 가지 일반적인 프로그래밍 오류도 제거됩니다. 코드를 관리할 경우 관리되는 데이터, 관리되지 않는 데이터 또는 관리되는 데이터와 관리되지 않는 데이터 모두를 .NET Framework 애플리케이션에서 사용할 수 있습니다. 언어 컴파일러에서는 자체 형식(예: 기본 형식)을 제공하기 때문에 데이터가 관리되고 있는지 항상 알 수 없으며 알 필요도 없습니다.
공용 언어 런타임을 사용하면 구성 요소 및 애플리케이션에 속한 개체가 여러 언어를 통해 상호 작용하는 경우 이를 쉽게 디자인할 수 있습니다. 다른 언어로 작성된 개체들이 서로 통신할 수 있고 해당 동작들이 완벽하게 통합될 수 있습니다. 예를 들어, 클래스를 정의한 다음 다른 언어를 사용하여 원본 클래스에서 클래스를 파생시키거나 원본 클래스의 메서드를 호출할 수 있습니다. 또한 클래스의 인스턴스를 다른 언어로 작성된 클래스의 메서드로 전달할 수 있습니다. 런타임을 대상으로 하는 언어 컴파일러 및 도구에서 런타임에서 정의한 공용 형식 시스템을 사용하고, 형식의 생성, 사용, 유지 및 바인딩 뿐만 아니라 새 형식을 정의할 때도 런타임 규칙을 따르기 때문에 이러한 언어 간 통합이 가능합니다.
모든 관리되는 구성 요소는 메타데이터를 작성할 때 참고한 구성 요소와 리소스에 대한 정보를 메타데이터의 일부로 갖고 있습니다. 런타임에서는 이 정보를 사용하여 해당 구성 요소나 애플리케이션에서 필요한 모든 항목으로 구성된 지정 버전을 가질 수 있도록 해줍니다. 그러면 맞지 않는 일부 종속성 때문에 코드가 중단되는 일이 발생하지 않습니다. 설정 및 유지가 어려운 레지스트리에 속성과 상태 데이터가 더 이상 저장되지 않습니다. 오히려 사용자가 정의한 형식과 해당 종속성에 대한 정보는 코드와 함께 메타데이터로 저장되어 구성 요소 복제 및 제거 작업이 훨씬 덜 복잡하게 됩니다.
언어 컴파일러 및 도구는 개발자에게 유용하고 자연스러운 방식으로 런타임의 기능을 노출합니다. 이것은 런타임의 일부 기능이 환경에 따라 더 두드러질 수 있음을 의미합니다. 사용하는 언어 컴파일러 또는 도구에 따라 런타임을 사용하는 방법이 달라집니다. 예를 들어, Visual Basic 개발자일 경우 공용 언어 런타임을 사용하면 Visual Basic 언어가 이전보다 더 개체 지향적인 기능을 갖고 있음을 알게 될 것입니다. 런타임은 다음과 같은 이점을 제공합니다.
-
성능 향상
-
다른 언어로 개발된 구성 요소를 쉽게 사용할 수 있는 기능
-
클래스 라이브러리에서 제공하는 확장 가능한 형식
-
상속, 인터페이스, 개체 지향적인 프로그래밍을 위한 오버로딩 등과 같은 언어 기능
-
확장 가능한 다중 스레드 애플리케이션을 만들 수 있도록 해주는 명시적 자유 스레딩에 대한 지원
-
구조적 예외 처리에 대한 지원
-
사용자 지정 특성에 대한 지원
-
가비지 수집
-
향상된 형식 안정성과 보안을 위해 함수 포인터 대신 대리자 사용. 대리자에 대한 자세한 내용은 공용 형식 시스템을 참조하세요.
CLR과 호환되는 언어에 대한 컴파일러_
C++/CLI, C#, Visual Basic .Net, F#, Iron Python, Iron Ruby, IL + ADA, APL, CAML, COBOL, Eiffel, Forth, Fortran, Haskell, Lexico, LISP, LOGO, Lua, Mercury, ML, Mondrian, Oberon, Pascal, Perl, PHP, Prolog, RPG, Scheme, Smalltalk, Tcl/Tk 등등
이렇게 많은 코드들을 다 익힐 필요가 없다. 그저 CLR을 지원하는 언어 하나를 잘 표현하기만 하면 된다. CLR 입장에서는 개발자가 어떤 언어를 사용하는 것을 알 방법이 없다. 하지만 어떤 언어를 사용하든 그 각 컴파일러가 검사한다. 그리고 컴파일 할 수 있는 환경만 갖추어지면 그 어떤 언어든 결국엔 관리 모듈(managed module)을 얻게 된다. 이 관리 모듈을 실행하려면 바로 CLR이 필요한 것이다. 관리 어셈블리는 항상 데이터 실행 방지DEP(Data Execution Prevention)와 임의 기준 주소(ASLR, Address Space Layout Randomization) 기술의 이점이 있으며, 이 둘은 시스템 전반에 대한 보안을 강화 할 수 있다.
이를 그림으로 조금 더 간결하게 표현하자면 이렇다.
관리 모듈
PE32 or PE32 헤더 |
l 32 비트, 64 비트 Windows에서 모두 실행가능 l GUI, CUI, DLL (응용프로그램 타입)구분 l 파일 작성 시간 정보 포함 l 네이티브 CPU포함 경우 -> 네이티브 CPU 코드 정보 포함 |
CLR 헤더 |
l 해당 모듈이 관리 모듈로 취급되기 위한 정보 포함 l CLR 버전, 몇 가지 플래그, 관리 모듈 진입점(Main 메서드) l 메타데이터, 리소스, 강력한 이름, 그 외 기타 플래그들의 모듈 내 위치 및 각 블록의 크기 정보 포함 |
메타데이터 |
메타테이블 2개로 나뉜다. 1. 작성한 소스 코드 안 타입들, 멤버들의 선언 서술 2. 작성한 소스 코드가 참조하는 타입들과 멤버들을을 서술. |
IL 코드 |
소스 코드를 컴파일 하여 만든 코드 실행 시 CLR은 IL 코드를 다시 네이티브 CPU 명령어로 컴파일 |
모든 CLR 호환 컴파일러들은 IL 코드를 만든다.
IL(관리 코드) – CLR이 실행을 관리하기 때문, IL을 만들 때 CLR을 대상으로 하는 모든 컴파일러들은 관리 모듈에 대한 전체 메타데이터를 작성해야 한다. 여기서 메타데이터는 COM의 타입 라이브러리(Type Library)와 인터페이스 정의 언어(Interface Definition Language) 파일의 상위 집합(Superset)이다.
메타데이터_
l 네이티브 C/C++ 헤더, 라이브러리 파일 종속성을 컴파일할 때 제거 – 참조 타입, 멤버 정보들이 IL 코드가 들어있는 파일에 포함되었기 때문
l VS에서는 InteliSense 기능에서 Parse 하여 타입 내에 포함된 멤버 메서드, 멤버 속성, 멤버 이벤트, 멤버 필드와 각 메서드의 호출 매개변수 목록을 제공.
l CLR 확인 절차에서 안정성을 준수하는지 확인
l 각각의 객체(object)들이 메모리 블록에 Serialization 한 뒤 다른 PC에서 Deserialization 하여 원래 상태로 복원하는 역할
l GC가 생명 주기를 추적할 수 있도록 해준다. 어떤 객체든 메타데이터를 통해 객체 내의 필드가 다른 객체와 연결되었는지 알아낼 수 있다.
C++ 컴파일러에 /clr 스위치를 지정하면 C++ 컴파일러는 관리 코드를 포함하는 모듈을 생산한다. -> 관리 코드와 비관리 코드를 단일 모듈 안에 한 번에 집어넣을 수 있는 컴파일러는 C++뿐.
물론 해당 과정을 진행하려면 CLR이 설치되어있어야 하겠다.
'C# > CLR via' 카테고리의 다른 글
매개변수 & 프로퍼티 (0) | 2020.02.21 |
---|---|
메서드 (0) | 2020.02.19 |
참조 타입과 값 타입 (0) | 2020.02.18 |
Object 그리고 캐스팅 (0) | 2020.02.16 |
CLR과 어셈블리 (0) | 2020.02.16 |