프로그래밍/CLR

CLR

nanze 2021. 12. 24. 18:42
반응형

CLR managed module compile

프로그래밍 언어들은 서로 다른 기능성과 정점을 가지고 있다. unmanaged c/c++ 의 경우 낮은 수준까지 시스템을 제어할 수 있고 메모리를 어떤 방식으로 사용하고 관리할 것인지 개입할 수 있다. 이와 다르게 VB를 사용하면 사용자 인터페이스를 쉽고 빠르게 COM 제어를 간단하게 이용할 수 있게 해줄 것이다. 

  

CLR은 서로 다른 프로그래밍 언어들 사이에서 공용으로 사용하여 실행할 수 있도록 하는 환경을 의미한다. CLR은 어떤 컴파일러를 사용하든 최종 결과물은 managed module이 된다. 

 

managed module 의 각 영역에 대한 설명은 다음과 같다.

PE32/ PE32+ 헤더 영역

표준 Windows PE 파일 헤더로 공용 객체 파일 형식 헤더와 유사하다. 이 영역이 PE32 타입을 사용하면 해당 파일은 32/64 비트 윈도우에서 모두 실행 가능하다. 이 영역이 PE32+ 타입을 사용하고 있다면 이 파일은 64비트 윈도우에서 실행 가능하다. 또한 이 영역에는 응용 프로그램 타입을 구부한기위한 정보를 포함하고 있다. GUI, DLL, CUI 종류를 구분하며 파일 작성 시간 정보도 담고 있다. 

IL 코드만을 포함하는 모듈의 경우 이 영역의 데이터는 무시된다.

CLR 헤더 

해당 모듈이 관리 모듈로 취급되기 위해 필요한 정보들이 포함된 영역이다. CLR 버전 정보, 플래그 정보, main method의 MethodDef 메타데이터 토큰, 모듈 내 메타데이터, 리소스, 기타 플래그 외 정보들의 모듈 내 위치 정보, 각 블록 크기의 정보 등을 포함하고 있다. 

메타데이터

소스코드 안에 들어있는 타입들과 멤버들의 선언을 서술하는 테이블과 참조하는 타입들과 멤버들에 대한 서술 테이블이 있다. 

IL 코드 

소스코드를 컴파일하여 만든 코드이다. 실행 시 CLR은 IL 코드를 다시 native cpu 명령어로 컴파일 한다.

 

CLR 호환 컴파일러들은 IL 코드를 생성한다. 즉 managed code 이다. IL 코드가 생성될 때 항상 붙어다니는 것이 메타데이터인데 쓰임새는 굉장히 많다. 

코드 내 참조된 타입과 멤버에 대한 모든 정보를 포함, VS 인텔리젼서 기능, 객체의 직렬화, GC의 객체 생명 주기 추적 등등.

 

MS c++ 컴파일러는 네이티브 코드를 모듈안에 포함시키며 실행 시 네이티브 상태로 메모리에 적재된다. 이 상태는 CLR 을 필요로 하지 않는다. 하지만 컴파일러에 /clr 명령을 지정해주면 c++ 컴파일러는 관리 코드를 포함하는 모듈을 생성한다. 

 

managed module 어셈블리 통합

CLR 은 실제 모듈을 다루지 않고 어셈블리를 다룬다. 어셈블리란 하나 이상의 모듈 또는 리소스의 논리적 집합이며 CLR 에서는 어셈블리를 component 라고 한다. 이 어셈블리는 Manifest를 가지고 있는데 여기에는 어셈블리 안 파일들의 집합을 설명하고 있다. 어셈블리 안의 모듈 또한 참조하는 다른 어셈블리들에 대한 정보를 포함하고 있다. 

 

Common Language Runtime loading만들어진 어셈블리는 실행 가능한 응용 프로그램, 라이브러리 상관없이 실행 가능한 응용프로그램에서 사용할 것을 위하여 여러 타입들의 집합을 포함하고 있다. 어셈블리가 type-safe managed code를 포함한다면 이것은 32/64 비트 윈도우에서 모두 실행 가능하다. C# 컴파일러는 /platform 이라는 옵션을 지원하는데 해당 옵션을 통해 32비트에서만 수행될지 64비트에서만 수행될지 기타 전용으로 할지 결정할 수 있다.

anycpu 의 경우에는 말 그대로 어떤 윈도우 버전에서도 사용가능한 것이다.

 

반응형