Programming/.NET

2002년에 1.0발표로 시작된 닷넷 프레임워크(.NET Framework)는 해당 기반으로 만들어진 프로그램(C#이나 VB.NET과 같은)을 구동하기 위한 자바 가상 머신과 같은 가상 머신입니다. 가상 머신이라고 해서 Hyper-V나 VMWare같은 개별적인 논리의 머신이 아닌 프로세스로서 존재하는 영역을 의미합니다.

 

이를테면 C#으로 프로그램을 만든뒤 이를 컴파일하면 해당 운영체제하에서 바로 실행할 수 있는 네이티브 실행파일(exe)이나 라이브러리(dll)가 아닌 IL(Intermediate Language)이라고 하는 중간코드를 생성하며 이때 닷넷 프레임워크에 포함된 CLR(Common Language Runtime)을 로드할 수 있는 코드를 컴파일 결과물에 포힘시킵니다.

 

따라서 프로그램을 실행하면 내부적으로 CLR이 로드되고 로드된 CLR이 프로그램의 IL코드를 실행하는 방법으로 프로그램을 동작시키게 됩니다. CLR은 재미있게도 공개된 특정 API를 통해 외부 다른 네이티브프로그램등에서 로드하여 실행하는 것이 가능한데요. 이게 왜 중요하냐면 예를 들어 IIS에서 ASP.NET을 통해 닷넷 기반하에 웹 프로그램을 만들고 구동하는 경우 w3wp.exe라는 웹구동 프로세스가 API를 통해 CLR을 로드함으로서 해당 ASP.NET웹프로그램이 동작할 수 있기 때문입니다. 만약 이러한 기능이 없다면 ASP.NET개발자는 CLR을 로드할 수 있도록 하는 별도의 처리를 구현해야 합니다.

 

닷넷 프레임워크는 이러한 CLR과 함께 프로그램을 만들때 유용하게 써먹을 수 있는 클래스 라이브러리모음도 가지고 있는데 이를 BCL(Base Classes Library)이라고 하며 CLR + BCL이 바로 닷넷 프레임워크에 해당합니다. 실제 C#과 같은 언어를 배울때나 프로그램을 만들때 BCL은 언어에서 가장많이 접촉하는 부분에 해당합니다.

 

.NET Framework는 1.0을 시작으로 2017년 현재 4.6까지 공식버전으로 출시되었습니다. 그런데 2.0, 3.0, 3.5 버전은 CLR입장에서는 같은 버전입니다. 근간이 되는 CLR이 바뀌지 않고 그 위에 BCL이나 WPF처럼 여러 라이브러리가 결합되어 버전업이 되었기 때문입니다. 4.0에 와서 2.0이었던 CLR이 4.0으로 바뀌었는데 이 변화는 C:\Windows\Microsoft.NET\Framework 하위에 버전별로 표시되는 폴더를 보면 알 수 있습니다. 다만 .NET Framework 4.5와 4.6이 출시되면서 덩달아 CLR도 버전업이 되었으나 버전에 따른 폴더가 따로 생성되지 않은 이유는 신규버전에 대한 파일을 따로 생성하기 보다는 기존의 4.0을 완전히 갈아엎는 식으로 설치되기 때문입니다. 따라서 'v4.0.30319' 폴더만 존재한다고 하더라도 시스템에 .NET Framework 4.6이 설치되어 있으면 해당 버전이 적용된 것으로 판단해도 됩니다.

 

참고로 .NET Framework중 Client Profile이라고 표현된 것은 일반 데스크탑용 BCL만을 담아둔 버전으로 설치 용량이 다른 버전에 비해서 작다는 특징이 있습니다.

 

IL은 중간언어로서 C#언어 뿐만이 아니라 다양한 언어(C++ 이나 PHP와 같은)에서 생성될 수 있는데 이는 IL코드만의 문법적인 규칙이 존재하고 그 규칙만 지켜진다면 IL을 컴파일하여 닷넷 프레임워크하에서 실행되는 호환언어를 만들 수 있기 때문입니다. 실제로 IL을 컴파일할 수 있는 ILASM.EXE가 존재하는데 이 프로그램은 IL을 실행파일로 컴파일해주는 역활을 수행합니다.

 

그 밖에 닷넷 기반 프로그램을 만드는 언어를 말할때는 꼭 2가지를 꼭 언급해야 합니다. CTS(Common Type System)와 CLS(Common Language System)가 바로 그것인데요. CTS는 공용 타입 시스템으로서 언어가 가져야할 규칙(상속이나 멤버 접근범위등)같은걸 정의하고 있으며 닷넷 언어는 CTS를 만족하는 범위 내에서 만들어져야 합니다. 하지만 그렇다고 모든 규격을 따를 필요는 없는데 반면 CLS는 공용 언어 사양으로서 언어가 지켜야할 최소한의 규격을 정의하고 있습니다. 최소한이라는 말에 주목해 주세요. 적어도 언어는 CLS의 모든 부분을 만족해야 한다는 것을 의미합니다. 다시 말해 닷넷 호환언어는 CLS 규격을 만족하도록 만들어져야 하고 뒤이어 언어의 확장 범위에 따라 CTS를 부분적으로 만족하도록 하면 되는 것입니다.

 

그렇다면 언어가 아닌 프로그램을 실행하는 구현체도 만들어질 수 있을까? 정답은 '가능하다.'입니다. 마이크로소프트는 이를 위해 CLI(Common Language Infrastructure)라고 하는 규약을 발표합니다. CLI는 이미 언급한 CTS나 IL을 포함해 컴파일결과물에 대한 사양까지, 거의 모든 부분을 포함하는 사양서에 해당합니다. 실제 마이크로소프트는 CLR을 이 CLI규격을 따라 만들었고 리눅스운영체제에서 닷넷 프로그램을 실행할 수 있도록 해주는 Mono프로젝트도 CLI규격에 따라 만들어진 결과물입니다.

, , , , ,
0 0