C++ 와 C#의 차이
C#의 구조와 실행방식을 살펴보기 전에, C++과 C#의 차이를 알아보겠습니다.
C++ | C# |
메모리 관리를 프로그래머가 직접 • 메모리 할당 • 데이터 R/W (읽고 쓰기) • 해제 (방 빼주기) |
메모리 할당과 데이터 R/W는 직접, 해제는 가비지 콜렉터가 해준다 |
플랫폼 이식도 프로그래머의 책임 | CLR이 직접. 우리는 편하게 코드 작성 (아래에 CLR과 함께 더 자세히 설명합니다) |
일관성 없는 라이브러리 | 일관된 클래스 라이브러리 |
C# 컴파일러
C# 컴파일러
: C# 소스코드를 분석해서 그 결과를 .NET용 IL코드(중간언어)로 생성하는 프로그램
코드언어 → (컴파일러)→ IL코드→ CLR이 읽음 → 기계어 → 컴퓨터가 읽음
표에서 C#은 C++과 다르게 CLR을 가지고 있고,
C#컴파일러는 소스코드를 IL코드로 생성해준다고 했습니다.
CLR과 IL코드는 아래를 보시면 이해하실 수 있습니다.
CLR에 대하여
CLR(Command Language Runtime)
자바의 JVM(JAVA Virtual Machine) 과 비슷
C#으로 만든 프로그램은 CLR위에서 실행됩니다.
CLR은 .NET라이브러리와 함께 'OS위에' 설치됩니다.
C#컴파일러는 C# 소스 코드를 컴파일해서 IL (Intermediate Language)라는 중간 언어로 작성된 실행 파일을 만들어 냅니다. 사용자가 이 파일을 실행시키면 CLR이 중간 코드를 읽어 들여 다시 하드웨어가 이해할 수 있는 네이티브 코드로 컴파일 한 후 실행시킵니다.
이것을 JIT컴파일이라고 부릅니다. JIT컴파일이란, 실행에 필요한 코드를 실행할 때마다 실시간으로 컴파일해서 실행시킨다는 뜻입니다.
그냥 실행 코드를 만들어 놓고 쓰면 되지, 왜 두번씩이나 컴파일하는 복잡한 과정을 거칠까요?
위의 표에서도 설명했지만 C#이 동작하는 환경이자 엔진인 CLR은 C#뿐만 아니라 다른 언어도 지원하도록 설계되었습니다.
서로 다른 언어들이 만나기 위한 지점이 바로 IL이라는 중간 언어이고, 이 언어로 쓰인 코드를 CLR이 다시 자신이 설치된 플랫폼에 맞게 컴파일한 후 실행시키는 것입니다.
CLR은 이 외에도
• 예외 처리
• 언어간 상속 지원
• COM과 상호 운영성 지원
• 자동 메모리 관리(가비지 컬렉션)
의 기능을 가집니다