본문 바로가기

개발 공부 유니티, C#/맨날 까먹는 기본&개념

CLR IL Jit 컴파일 과정

CLR (Common Language Runtime)

서로 다른 프로그램 언어들 사이에서 공동으로 사용할 수 있는 실행 환경

 

CLR의 핵심기능

  • 메모리 관리
  • 어셈블리 로딩
  • 보안
  • 예외처리
  • 스레드 동기화 등

CLR을 대상으로 코드를 작성하는 언어

C#, COBOL, Perl, PHP, Lua, LISP, Pascal, Scheme .. 등



메서드를 실행하기 위해(최초 호출 되는 시점) IL은 JIT(just in time) 컴파일러(clr의 기능)에 의해 기계어(Native Code)로 번역

 



IL을 사용하면 CPU와 OS에 독립적인 코드가 생성됨

Jit 컴파일러가 수행시 플랫폼에 최적화된 코드로 번역 후 수행

런타임에 실행되는 컴파일 비용이 증가하는 단점이 있음



NGEN.exe : 네이티브 이미지 생성기

JIT컴파일러를 거칠필요없이 바로 실행

좋아보이지만 버전에 따른 호환이슈와 성능상의 문제로 자주 쓰이지 않음

 

-그 외-

어셈블리 만드는 과정

컴파일러가 소스코드 분석, 문법 점검 수행

컴파일러의 Output빌드는 관리모듈 (IL + MetaData)

=>어떤 언어를 사용하든 상관없음

 

소스코드 => 컴파일 => 관리모듈

 

관리모듈 구성

  1. PE32/PE32+ (64비트에서만 동작)헤더 : 앱의 타입구분 GUI,CUI, DLL 
  2. CLR 헤더 : 관리 모듈로 취급되기 위한 정보 (필요한 CLR버전, 플래그, 진입(Main)메서드, 메타데이터, 리소스, 각 블록 크기 등
  3. 메타 데이터 : 2가지 테이블로 구성
  4. IL코드 : 소스 코드를 컴파일해 만든 코드로 CLR(jit 컴파일러)이 IL을 CPU명령어(기계어)로 컴파일

 

어셈블리

관리 모듈들 + 리소스 파일의 그룹

=> 재사용, 보안, 버전관리의 단위(Entity)

 

관리 모듈들을 하나의 어셈블리로 통합해주는 도구를 통해 어셈블리가 됨

*도구 : C# 컴파일러(CSC.exe, 어셈블리 링커(AL.exe) 등

C:\Windows\Microsoft.NET\Framework\{version}\csc.exe 있다

 

어셈블리 내의 매니패스트는 어셈블리 안의 파일들의 집합을 설명