CLR. CLR. CLR.
.NET Framework를 개발하다보면 많이 접하는 단어.
CLR.
Common Language Runtime이다.
C#, C++(Managed), ASP.NET 모두 CLR위에서 돌릴 수 있다.
어떻게 실행되냐하면..
위 그림처럼.. 관리되는 코드는 컴파일러에 의해 중간단계 언어(MSIL)로 변환되고, 이 중간단계 언어를 CLR이 읽어서 CLR이 실행되는 환경에 맞게, 실제 바이너리로 실행해주는 것. CLR의 역할은 중간단계 언어를 실행해주는 역할이다.
C#이든 Managed C++이든, 모두 CLR이 읽을 수 있는 바이트코드로 변환되므로 다른 언어로 개발된 라이브러리를 참조해다 쓸수도 있다. 관리되는 코드 안에서는 다른 언어간 상호작용이 더 수월해진다. 기존 C++에서 다른 언어뿐만 아니라 C++라이브러리만 참조하려고 해도 Object등록부터 시작한 삽질과 문제점을 생각하면, 그 많은 일들을 덜어주는 CLR이 가진 장점은 돋보일듯.
근데, 이 역할과 관계는 다른 언어에서 좀 많이 보던거같지않은가?
바로 자바.
자바역시 빌드하면, 중간단계 언어인 바이트코드 (.class)로 변환되고, 실행시에는 JVM이 이를 읽어 운영체제에 맞게 실행해준다.
CLR의 역할은 JVM이 바이트코드를 실행해주는 역할과 매우 비슷하다. 다루는 언어랑 중간단계 언어만 다를뿐이지.
관리되는 언어(Managed)는 CLR이 읽을 수 있는 코드로 변환되고, 그것이 안되는 구문이나 언어는 바로 OS환경에 맞게 빌드되어 기존 바이너리처럼 바로 실행된다.
관리되지 않는 코드도 C#에서 사용 가능하다. [unmanaged]를 붙여서 실행하면, C++ native 처럼 CLR이 실행중에 읽어서 네이티브 코드로 만드는게 아니라 네이티브 코드를 바로 OS레벨로 바이패스 시키게 된다.
참.. managed환경에서 unmanaged코드가 많으면 디버깅은 안드로메다로...
그리고 unmanaged와 managed간의 데이터를 주고받기 위해서는 마샬링을 해야한다. 번거로운 작업이다. 해야하면 필요한 일이지만..
가급적 관리되는 코드를 쓰자.
* C#, C++개발을 접으면서(? 정확히는 기술스택을 C# -> Java로 바꾸면서) 일하던 때 삽질했던거.. 고생했던거 기억 되돌리면서 정리하는 중입니다. 제 기억이 잘못되었거나 잘못 알고있는게 있을 수 있으니 이상한거 있으면 바로 태클부탁드립니다.
댓글