1. CLR
- Common Language Runtime
- Java의 JVM와 같은 닷넷 환경의 가상 머신.
- 닷넷 환경 언어(VB .NET, C#)로 개발된 IL(Intermediate Language, 중간 언어) 코드들은 닷넷 프레임워크가 설치된 어떠한 환경에서도 실행 가능함.
- CIL(Common Intermidiaate Language, 공통 중간 언어) 코드는 닷넷 환경의 언어로 작성된 소스 코드를 컴파일했을 때 만들어지는 바이트 코드를 의미하며, 어셈블리 코드의 일종임.
- 닷넷 환경의 언어로 개발할 때, 소스 코드를 컴파일하게 되면, 컴파일 타임에 해당 언어의 컴파일러에 의해 우선 바이트 코드인 CIL 코드를 생성함.
- 그리고 CLR은 런타임에 JIT(Just-In-Time) 또는 AOT(Ahead-Of-Time) 컴파일 방식을 이용하여 CIL 코드를 OS가 이해할 수 있는 native 코드로 변환하게 됨.
2. JIT 컴파일
- C/C++로 작성된 프로그램은 다른 언어에 비해 빠르다.
- 정적인 native 코드(.exe, .dll)을 생성해 배포하기 때문.
- 반면 Java, C#과 같은 언어들은 컴파일러가 생성한 IL 코드를 가지고 있다가 프로그램을 실행시키면 런타임에 가상머신을 통해 동적으로 native 코드를 생성하게 됨.
- 이 때 가상머신에 의한 런타임 컴파일 방식을 JIT 컴파일이라고 함.
- JIT 컴파일이란 런타임에 IL 코드를 native 코드로 바꾸는 컴파일 과정.
- 프로그램이 처음 로드될 때 가상머신은 IL 코드를 실행 환경에 알맞은 native 코드로 컴파일함.
- 이후 실행 시에는 JIT 과정 없이 해당 네이티브 코드를 실행.
- C# 코드 반복 수행 시, 첫 수행이 아주 느리고, 다음 수행부터 비슷하게 빠른 현상이 생기는데, 이게 JIT 컴파일 때문임.
- 하지만 JIT 컴파일 방식은 메모리를 많이 사용하고 속도도 떨어지는 단점이 존재.
3. AOT 컴파일
- JIT 컴파일 방식의 느린 속도를 해결하기 위해 만들어진 컴파일 방식.
- 컴파일 타임에, IL 코드를 실행 환경에 적합한 native 코드로 컴파일을 완료함.
- CIL 코드를 C++ 컴파일러를 통해 닷넷 native 이진코드로 변환함.
출처
https://rito15.github.io/posts/cs-dotnet-compile/