티스토리 뷰

CLR(Common Language Runtime, 공통 언어 런타임)은 마이크로 소프트 이니셔티브에서 제공하는 가상 머신의 구성요소입니다. .NEt Framework 언어로 개발된 프로그램 코드는 CIL로 알려진 공통 중간 언어(Common Intermediate Language, CIL)를 실행합니다. CIL은 바이트코드형태로 구성이 되어 있습니다. 


CLR를 설명할 때 가장 쉽게 예를 들 수 있는 개념이 Java의 JVM(Java Virtual Machine, 자바가상 머신)입니다. JVM은 자바로 개발된 소스코드를 컴파일 한 결과를 실행시키는 실행 환경입니다. 


CLR은 마이크로소프트에서 제공하는 가상 머신의 하나의 요소라고 보시면 됩니다. CLR의 기능은 아래의 그림을 통해서 명백히 이해할 수 있습니다. 


개발자는 C#, VB.NET, 다른 .NET 언어들을 통해서 프로그램을 개발합니다. Visual Studio(이하 VS)로 이 소스코드를 컴파일하게 되면 VS는 CIL이라 불리는 바이트코드를 생성합니다. 사용자가 프로그램 컴파일 후 실행을 시키게 되면 VS는 이 바이트코드를 Native Code로 컴파일한 후 실행을 시킵니다. 이 때 CLR은 CIL 코드를 읽어들여 OS가 이해할 수 있는 Native Code로 변환하는 역할을 하게 됩니다. 


실행 시 VS는 Just-In-Time Compile(적시 컴파일, JIT 컴파일) 기반으로 실행이 됩니다. JIT 컴파일은 매번 실행이 될 때마다 실시간으로 컴파일을 하여 실행을 한다는 의미입니다. 




그럼 왜 .NET은 소스코드 -> CIL Code -> Native Code의 과정을 거치는 것일 까요? 이전 C, C++의 경우 개발환경에 따라 실행에 대한 영향을 많이 미치는 경향이 있습니다. 하지만 Java가 나오면서 컴파일된 바이트코드는 윈도우든, 리눅스든, 어떠한 실행환경이든 간에 JVM 실행만 가능하다면 실행이 된다는 장점을 가지고 인기를 끌게 되었습니다.


마이크로 소프트는 이러한 문제점을 보완하기 위해서 .NET 프레임워크에 가상머신을 추가하게 되었고, 이로 인해 C# 뿐 아니라 다른 언어로 개발된 IL들은 .NET Framework가 설치된 어떠한 환경에서도 실행을 시킬 수 있게 된것입니다. 


위에서 설명한 CLI, CLR의 관계도는 아래의 그림을 통해서 좀더 명확히 파악할 수 있습니다. 



CLR은 실행을 하고자는 환경에 최적화된 컴파일 코드를 만들고, Native 코드를 생성하여 실행할 수 있게 도와주게 됩니다. 하지만 이러한 자점이 있다면 단점도 보유하고 있습니다. 과거 C, C++보다 컴파일에 대한 시간적 비용이 많이 들게됩니다. IL이 있을때와 없을 때는 당연히 차이가 날수 밖에 없겠죠.


환경에 최적화된 코드를 돌릴 것이냐? 빠른 속도의 컴파일을 제공할 것이냐? 이는 언제 어디서든 Trade-OFF 상태로 남아있을 수 밖에 없습니다. 다만 컴퓨터 환경이 워낙 발달하여 개발 환경 및 실행 환경이 좋아진 지금은 컴파일 시간에 대한 비용보다 최적화 코드에 대한 이점을 더욱더 중시여기는 최근 경향이 있기는 합니다. 


추가적인 설명을 위해서 위키피디아에 있는 내용을 살짝 가져오겠습니다. 


공통 언어 런타임(Common Language Runtime, CLR)은 마이크로소프트 닷넷 이니셔티브의 가상 머신 구성 요소이다. 프로그램 코드를 위한 실행 환경을 정의하는 마이크로소프트의 공통 언어 기반 (CLI) 표준의 기능이다. 공통 언어 런타임은 공통 중간 언어(CIL, 이전에는 MSIL로 알려져 있었음)라고 불리는 바이트코드의 형태를 실행한다.


공통 언어 런타임을 사용하는 개발자들은 C#이나 VB 닷넷과 같은 언어로 프로그래밍하며, 해당 언어의 컴파일러가 소스 코드를 공통 중간 언어 코드로 변환한다. 일반적으로 런타임에 공통 언어 런타임의 JIT 컴파일러가 공통 중간 언어 코드를 운영 체제의 네이티브 코드로 변환한다. 하지만 마이크로소프트 닷넷 프레임워크에 포함된 NGen 같은 AOT 컴파일러를 사용하면 중간 언어 코드를 타겟 머신에서 실행 전에 네이티브 코드로 컴파일해 둘 수도 있다. 이 경우 JIT 컴파일로 인한 추가 CPU/메모리 부담을 없애고, 컴파일된 기계어를 여러 프로세스에서 공유할 수 있으며, 애플리케이션 시작 시간을 단축하는 장점은 있으나 컴파일한 코드의 크기가 크고 실행 시간 정보를 이용한 최적화가 불가능해 오래 실행되는 서버 프로그램에서 기대할 수 있는 추가적인 성능 향상을 꾀할 수 없다.[1]


마이크로소프트의 닷넷 프레임워크 구현이 아닌 다른 공통 언어 기반의 몇몇 구현(예: 마이크로소프트의 공유 소스 CLI 구현[2]이나 모노)은 윈도가 아닌 운영 체제에서 실행되는 반면, 마이크로소프트의 닷넷 프레임워크 구현은 마이크로소프트 윈도 운영 체제에서만 동작한다.


<참조 : 위키피디아>


이 글에서는 .NET 프레임워크의 CLR에 대해서 알아보았습니다. 


이 글이 도움이 되셨나요?

그렇다면 아래의 그림을 클릭해주세요.


댓글