티스토리 뷰
이 글은 닷넷 프레임워크와 관련된 용어들을 정리하는 글입니다.
평소 C#을 쓰면서 닷넷 프레임워크라는 말을 많이 들었지만 정확히 어떤 뜻인지는 잘 알지 못했습니다.
최근 시간을 들여 책을 읽고 검색을 하면서 닷넷 프레임워크에 대해 알아보았습니다.
배운 내용을 토대로 닷넷 프레임워크가 무엇인지, C#과 닷넷 프레임워크가 어떤 관계인지 간략하게 나마 설명해보겠습니다.
닷넷 프레임워크
닷넷 프레임워크는 마이크로소프트웨어에서 발표한 응용 프로그램 개발 환경입니다.
사실 위 문장만 보면 닷넷 프레임워크를 이해하기가 쉽지 않습니다.
자세한 내용은 차차 알아보기로 하고 가장 먼저 기억해야 할 것은 닷넷 프레임워크는 환경이라는 것입니다.
일반적인 네이티브 언어(예를 들어 C++)로 만들어진 프로그램들이 운영체제에서 곧바로 실행되는 것과 달리,
닷넷 프레임워크를 기반으로 만들어진 응용 프로그램은 반드시 닷넷 프레임워크가 미리 설치된 환경에서만 실행됩니다.
따라서 C#으로 프로그램을 만들고 배포하면 사용자들은 해당 버전에 맞는 닷넷 프레임워크를 설치해야 프로그램을 돌릴 수 있는 것이죠. 보통 윈도우를 설치하면 기본적으로 닷넷 프레임워크가 설치된다고 합니다.
이렇게만 보면 닷넷 프레임워크가 왜 존재하는지 의문이 들 수 있습니다.
닷넷 프레임워크가 미리 설치된 환경에서만 실행된다면 오히려 더 불편한거 아닌가?라는 생각이 들 수 있죠.
하지만 사실 닷넷 프레임워크는 다른 네이티브 언어(C++등)가 가지고 있는 문제를 보완하기 위해 나왔습니다.
C++등의 언어는 프로그래머에게 많은 기능을 제공하지만 반대로 보안, 메모리 관리 등 민감한 부분도 프로그래머가 직접 컨트롤 해야 합니다. 이는 프로그래머에게 많은 부담을 안겨주죠.
그래서 이런 부분들은 또 다른 뭔가를 만들어서 자동으로 관리해주도록 하자라는 아이디어가 나왔고 그것이 구현된 것이 닷넷 프레임워크인 것입니다.
Common Language Runtime
닷넷 프레임워크 관련된 문서를 보다 보면 CLR(Common Language Runtime)이라는 것을 많이 볼 수 있습니다.
CLR은 닷넷 프레임워크의 굉장히 큰 부분을 차지하는 것으로 특정 역할을 하는 프로그램이라고 보시면 됩니다.
CLR의 가장 큰 두 가지 기능은
1. 중간 언어(CIL: Common Intermediate Language)를 JIT(Just In Time) 컴파일러를 이용해 기계어로 변환하는 것
2. 가비지 수집기(GC: Garbage Collecor)를 제공해 동적 메모리 할당 및 회수를 지원하는 것
입니다.
또 새로운 단어들이 많이 나왔습니다. CIL, JIT와 GC이죠
GC, JIT는 할 이야기가 좀 많기 때문에 따로 알아보기로 하고 일단 CIL에 대해서 알아봅시다.
Common Intermediate Language
CIL(줄여서 IL)은 말 그대로 일종의 중간 언어입니다.
Java에서 말하는 바이트 코드와 비슷한 개념이라는 말이 있더군요.
Java로 만들어진 프로그램이 바이트 코드로 한 번 바뀐 후 다시 기계어로 번역된 후 실행되는 것처럼
C#으로 만들어진 프로그램은 IL로 바뀐 후 CLR에 의해서 기계어로 번역된 후 실행됩니다.
CIL이 특이한 점은 C# 외에도 다른 언어들도 CIL로 번역될 수 있다는 점입니다.
당연히 모든 언어들이 CIL로 번역이 가능한 것은 아니고 미리 CIL로 번역될 수 있도록 만들어진 언어만 가능합니다.
그리고 이렇게 CIL로 번역될 수 있는 언어들을 닷넷 호환 언어라고 합니다.
닷넷 호환 언어에는 C#, VB.NET, J# 등이 있다고 합니다.
닷넷 호환 언어로 만들어진 프로그램이 실행되는 과정을 표로 한 번 알아봅시다.
닷넷 프레임워크에서 만들어진 프로그램은 총 2번 컴파일됩니다.
첫 번째 컴파일은 Source Code를 IL로 바꾸는 것이고 두 번째 컴파일은 IL을 Native Code로 바꾸는 것입니다.
여기서 Source Code는 C#,VB.NET 등 닷넷 호환 언어이고 Language Compiler는 각 언어에 맞는 컴파일러를 뜻합니다.
위에서 보이다시피 첫 번째 컴파일은 각 Language Compiler가 담당하고 두 번째 컴파일은 CLR(JIT)가 담당합니다.
대체적으로 첫 번째 컴파일이 더 느리고 두 번째 컴파일이 더 빠릅니다.
배포될 때는 이미 첫 번째 컴파일이 끝난 채로 배포되게 됩니다.
닷넷 호환 언어로 만들어져 배포된 프로그램이 실행되는 과정을 표로 표현하면 아래와 같습니다.
사용자는 단순히 .exe 파일을 더블 클릭해서 실행하지만 사실은 이런 식으로 실행되는 것이지요.
위 그림에서 설명하는 것처럼 빌드를 통해 소스 코드는 EXE 파일로 바뀌고 C# 소스 코드는 CIL로 만들어지게 됩니다.
빌드가 끝난 후 EXE 파일을 실행하면
1. 같이 탑재된 CLR 로드하는 코드를 통해 CLR을 메모리에 적재시켜 실행합니다.
2. 그 후 CLR이 IL 코드를 기계어로 컴파일하고 실행되게 됩니다.
사용자 입장에서는 빌드가 끝난 결과를 받기 때문에 외형상으로는 EXE/DLL로 기존 프로그램과 동일한 구조이지만 내부적으로는 CLR이 실행되고 EXE/DLL에 있는 닷넷 코드가 실행되는 형태인 것입니다.
결말
여기까지 과정을 통해 닷넷 프레임워크 용어들에 대해서 알아 보았습니다.
이 외에도 많은 용어들이 있지만 그 중 빈도가 높게 등장하는 "닷넷 프레임워크", "CLR", "CIL", "닷넷 호환 언어" 등에 대해 알아봤습니다.
또 C#과 닷넷 프레임워크의 관계에 대해서도 알게 되었고 닷넷 호환 언어로 만들어진 프로그램이 어떤 방식으로 실행되는지 간단히 알아 보았습니다.
'프로그래밍' 카테고리의 다른 글
C#의 Pass by value (0) | 2021.02.14 |
---|---|
C# Value Type과 Reference Type (1) | 2021.02.12 |
Unreal을 이용한 CelShading (0) | 2020.10.02 |
Unreal Blueprint를 이용해 직접 만든 DLL 사용하기 (0) | 2019.12.25 |
언리얼 HLSL을 이용한 Custom Shader 제작 (1/2) (1) | 2019.11.29 |
- Total
- Today
- Yesterday
- collision detection
- CollisionDetection
- RL
- Mesh Processing
- opengl
- normalized device coordinate
- Unreal
- Transformation
- 값 형식
- perspective projection
- transform
- Unity
- static batching
- Scriptable Render Pipeline
- reference type
- 유니티
- AABB
- dynamic batching
- C#
- VTK
- Mesh
- RubiksCube
- 참조 형식
- 강화학습
- value type
- SRP
- batching
- 루빅스큐브
- MeshProcessing
- NDC
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |