티스토리 뷰

Dev/Dictionary

Managed code vs Native code(Unmanaged code)

꿈을 위해 잠을 잊은 그대에게 2020. 4. 6. 19:00

Managed code로 작성된 .NET 계열의 언어들이 OS에 맞게 실행됩니다.

 

Common Language Runtime(CLR) : 공용 언어 런타임

 

일종의 가상머신입니다.

 

 

Unmanaged code(C, C++ 등)들은 컴파일 시 해당 OS에 맞게 실행파일을 만들어 버립니다.

그러나 Managedcode들은 공용언어기반(CLI)로 작성되어 IL 계열의 공통중간언어(IL) 형태로 컴파일 되어 CLR에 의해 OS에 맞게 네이티브 코드(Native code)로 변환되어 프로그램이 실행됩니다.

 

Managed code vs Native code

 

Native code는 때로 Unmanaged code라고 불립니다. 그러니까 관리되는 코드와 관리되지 않는 코드라고 해야겠네요. 하지만 'Managed code는 좋은 것이고 Unmanaged code는 좋지 않은 것이다'는 것은 절대 아닙니다.

 

전통적으로 우리가 생각하는 프로그래밍은 전부 Native code입니다. Compile을 하게 되면 OS에서 해석가능한 기계어로 바로 번역이 되지요. 이것은 프로그램하는 사람 입장에서 이런 저런 신경을 많이 쓰게 만듭니다.

 

예를 들어 프로그램 실행시 사용했던 메모리는 프로그램이 끝날 때 잘 확인해서 모두 OS에 반납을 해야하죠. 혹시라도 프로그래머가 잊어 버리고 반납하지 않으면 시스템 에러를 일으킬 것입니다.

 

또 다른 예로 OS는 H/W에 따라 다르므로 프로그램을 Windows에서 Linux로 또는 그 반대로 옮기고 싶을 때(Porting한다라고 하죠.) 이거 생각보다 굉장히 어렵습니다. 비록 프로그램 소스는 비슷하다고 할지라도 그 결과물이 OS에 종속되어 있다 보니 생각지 못한 문제들이 많이 생기게 되죠. PC에서 윈도우즈용 프로그램을 작성한 것과 PDA를 위한 WindowsCE로 옮기는 것조차 쉬운 작업이 아니죠. PC와 PDA는 H/W가 많이 다르니까요.

 

그래서 생각하게 된 것이 OS에 종속되지 않게 프로그램을 하는 방법은 없을까 하는 것입니다. 이런 시도는 많이 되었지만 아마도 최초로 성공한 예가 Java입니다. Java용 프로그램은 어디서 작성하던 똑 같은 소스를 사용해서 Java가 실행되는 기계에서는 똑같은 결과를 보여 줍니다. 하나의 소스를 작성하면 아무런 변경없이 Windows, Linux, Mac 에서 바로 실행 가능하게 되는 것이죠.

 

이런 것이 되는 이유는 Java 소스가 컴파일될 때 바로 OS가 이해할 수 있는 바이너리로 변환되는 것이 아니고 일종의 임시 코드(IL, Intermediate Language)로 변환시키는 것입니다. 이 IL 코드는 실제로 OS에서 실행할 수는 없습니다. 이 IL코드가 실행되기 위해서는 각 OS에 이미 설치되어 있는 JIT(Just In Time) 컴파일러가 OS용 코드로 변환을 해 주어야 합니다. 이 JIT 컴파일러들은 각 OS마다 다르지만 설치만 되어 있다면 IL코드는 어디서나 같은 동작을 하게 됩니다.

 

Microsoft가 Java에 대항하기 위하여 만든 것이 바로 .NET 입니다. 기본적으로 Java나 .NET이나 그 기본 원리는 같습니다. OS와 Application 사이에 위치하면서 중간자의 역할을 하는 것입니다.

 

어쨌던 Java나 .NET 같은 새로운 환경에서 실행되는 프로그램들은 기존의 프로그램들과는 다른 특징들을 가지고 있습니다. 그래서 기존의 프로그램들은 Native Code라고 부르고 새로운 프로그램들은 Managed code라고 불러서 구분을 하게된 것입니다.

 

Managed code가 가지는 몇 가지 특징들을 말하자면 다음과 같습니다.

 

    # 객체지향모델 - Java나 .NET이나 모두 OOP로 설계되어 있습니다.

    # 언어 독립적 - 어떤 언어로 프로그래밍하더라도 상관없습니다.

    # 형안정성 - Managed code는 변수의 형을 엄격하게 제한합니다.

    # Garbage Collection - 프로그램에서 메모리 해제를 하지 않더라도 알아서 해줍니다.

                                             대체로 Managed code에서는 포인터 같은 것을 지원하지 않죠.

    # 단일통합라이브러리 - 플랫폼레벨에서 많은 API들을 제공해 줍니다.

    ...

 

등이 있습니다. 단점으로는 대표적으로 Native code에 비해 실행속도가 느리다던가 Java Virtual Machine이나 .NET Platform이 설치되어 있지 않은 컴퓨터에서는 실행이 되지 않는 다던가 하는 것들이 있습니다. 이것은 생각보다 매우 중요한 요건일 수 있습니다. 내가 윈도우용 프로그램을 만들었는데 이것을 실행하기 위해서는 .NET Platform이 반드시 설치되어 있어야 하고 사용자는 이것을 싫어 할 수도 있기 때문이죠.

 

가장 대표적인 것으로는 최근 각광받고 있는 VB나 C#을 들 수 있겠습니다.

 

그 사용의 편의성 때문에 많은 이들이 점점 기존 C/C++가 주류인 Native code에서 Java나 C#이 주류인 Managed code로 이동하고 있지만 속도는 생각보다 빠르지 않습니다. 아직도 많은 프로그래머들이 VB 6.0을 사용하고 있죠.(6.0은 Native code를 만들 수 있었지만 그 이후 버전들은 전부 Managed code만 지원합니다.)  VC++는 현재 Native code, Managed code 를 동시에 만들 수 있는 거의 유일한 컴파일러이지만 사람들이 VC++를 사용하는 이유는 Native code를 만들기 위해서인 경우가 훨씬 많죠.

 

더 상세한 내용은 관련 언어의 매뉴얼 등을 참조하시기 바랍니다.

'Dev > Dictionary' 카테고리의 다른 글

자바 웹을 다루는 기술 (Servlet&JSP/Spring)  (0) 2020.05.19
Java Spring 용어정리  (0) 2020.04.30
Java & Spring 개발자 면접 질문  (0) 2020.04.11
Java 용어 정리  (0) 2020.04.03
인터페이스(Interface)  (0) 2020.04.02
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크