본문 바로가기

programming/C#

CLR (소스 코드를 관리되는 모듈로 컴파일하기) - 2


  네이티브 코드 ->네이티브 코드 컴파일러의 결과물은 CPU에 의존적이다, 즉 컴파일하기 전에 명시적 혹은 묵시적으로 x86, x64, IA84와 같은 여러 CPU중 어느 CPU를 대상으로 컴파일을 수행할 것인지 미리 설정해 주어야 함. 
☞ 컴파일의 결과물(exe 또는 dll)이 어느 CPU를 대상으로 배포될 것인지에 따라 다른 결과물이 생성된다

 닷넷 -> 닷넷을 지원하는 모든 컴파일러들은 그 결과물이 중간 언어(IL:Intermediate Language)라는 코드로서 CPU와는 상관없이 동일한 형태의 결과물을 만들어낸다.

 ☞ CLR이  IL코드의 실행을 관리함으로 종종 관리되는 코드(managed code) 혹은 관리코드라고도 한다.

 IL 코드에 대해서 좀 더 언급하면, CLR을 지원하는 모든 컴파일러는 일정한 형식의 메타 데이터를 관리되는 모듈에 포함하게 되어 있다. 

 메타데이터는 관리되는 모듈에 정의되어 있는 것들 (예를 들면, 클래스와 클래스의 멤버, 구조체등)의 목록과 기초적인 정보를 저장해 놓은 일종의 데이터 테이블이라고 한다. 따라서 이 테이블만 확인하면 해당 모듈에서 어느 타입들이 정의되어 있는지 쉽게 확인 할 수있다.

  메타데이터의 사용 용도
  
  ->  메타데이터의 존재는 컴파일러가 컴파일 수행 시 기존의 헤더 혹은 라이브러리 파일 같은 것이 없어도 컴파일을 가능하게 해준다. 이미 모든 정의된 타입과 참조된 타입의 정보가 실행 파일에 자세하게 기록되어 있으므로 컴파일러는 이러한 정보를 관리되는 모듈에서 정확하게 읽을 수 있다.
 
  -> 개발자가 코드를 작성할 떄 메타데이터 정보를 읽고서 메서드, 속성, 이벤트, 멤버 등의 정보를 미리 보여줄 수 있다. 그 대표적인 예가 Visual Studio의 인텔리센스 기능이다.

  -> CLR의 코드 검증 기능은 메타데이터의 정보를 통해 해당 실행 파일이 안전하게 실행될 수 있는지 확인할 수 있다.

  -> 객체의 상태를 보존할 수 있또록 Serialize 혹은 Deserialize 를 가능하게 해준다. 객체의 상태를 메모리 블록에 serialize한 후 원격 PC에 전송하고 다시 deserialize 하여 결과적으로 객체의 상태를 원격 PC에 전송 가능하게 할 수 있는 것도 메타데이터가 있기 때문에 가능한 것이다.

  -> 가비지 수집기가 객체의 수명(LifeTime)상태를 조사하여 수집 대상을 확인하는데 도움을 준다.