이번 내용은 C#언어의 기반이 되는 그 구조에 대한 내용입니다. 사실 C#보다는 .NET언어와 관련된 것으로 CLI, CLR, VES, JIT등이 무엇을 말하는지 알아보고자 합니다.
1. CLI(Common Language Infrastructure)
C#은 객체지향 Programming언어입니다. 이는 사실 유효한 문법이 구성되는 표준을 정의한 것으로 C#은 Application의 Compile과 실행을 위해 CLI에 의존하므로 이를 거의 사용하지 않습니다. CLI는 아래 구성에 대한 명세를 정의하는 표준이라 할 수 있습니다.
- Virtual Execution System(VES)
- Common Intermediate Language(CIL)
- Common Type System(CTS)
- Common Language Specification(CLS)
- Framework
CLI환경안에서 이들이 서로 함께 동작하는 방식을 이해하려면 각각의 CLI 구성요소를 잘 살펴볼 필요가 있습니다.
2. CIL(Common Intermediate Language)
Source Code를 대상 Processor에 맞게 기계어 Code로 Compile 하는 C나 C++의 Compiler와는 달리 C# Compiler는 Source Code를 CIL이라고 하는 중간 Byte Code형식으로 Compile을 수행합니다. 이렇게 되면 Code는 CLI를 따르는 VES(Virtual Execution System)가 존재하는 어떤 System상에서도 실행될 수 있습니다. 따라서 대상 Platform이 달라질 때마다 Application을 Compile 하는 번거로움을 피할 수 있습니다.
Common Intermediate Language에서 Common이라는 단어가 사용되는데 이는 C#언어에 한정되지 않은 .NET에 속한 모든 언어가 따라야 할 공통된 형식이기 때문입니다. 따라서 CIL를 따르는 모든 언어의 Library와 Code는 같은 Application안에서 서로 결합되어 실행될 수 있습니다. CIL을 준수하는 언어로는 VB.NET, COBOL, PowerShell, Python, C++, Delphi 등 다양한 언어가 존재합니다.
3. Virtual Execution System(VES)
흔히 Runtime이라 불리는 VES는 CIL Byte Code가 실행되는 환경입니다. VES는 C# Compiler에 의해 생성된 Byte Code를 JIT(Just In Time) Compiler를 통해 읽어들인 뒤 이를 현재 실행 중인 Processer에 맞는 실제 기계어 Code로 변환하여 실행하는 방식을 갖고 있습니다. 또한 Code는 실행 Process를 관리하는 Runtime Agent와 함께 실행되므로 이를 '관리되는 Code'라고 하며 Process는 Garbage Collection(Memory할당과 해제를 처리하는), Memory 접근, Type 안정성과 같은 Issue사항을 처리하여 Code가 하지 말아야 할 동작을 하지 않도록 합니다.
이러한 VES와 연결짓는데 흔히 사용되는 것으로 CLR(Common Language Runtime)라는 것이 있습니다. CLR은 Micorsoft가 CLI명세에서 VES Component를 구현하는데 부여한 공식적인 이름입니다.
어쨌건 여기서 우리는 JIT Process가 Application을 시작하는데 약간의 지연이 발생할 수 있다는 것에 주목해야 합니다. 이러한 문제를 피하기 위해 NGen Compiler를 통해 CLI Byte Code를 기계어 Code로 사전 Compile 하는 방식이 도입되었으나 NGen Compile은 대상 Processor의 Architecture상에서 실행되어야 하므로 해당 절차 자체는 종종 사용자가 Application을 설치할 때 수행되어야 하며 아직 미숙한 점이 많아 복잡한 Application상에서 도입하려면 해결해야 할 난제들이 많아질 수 있습니다.
4. CTS(Common Type System)과 CLS(Common Language Specification)
이미 언급한 바와 같이 몇가지 다양한 Programming언어들이 CLI를 대상으로 하고 있으며 이에 대한 하나의 예로 C# Code가 VB.NET의 Code와 함께 상호작용하는 것이 가능하게 되었습니다. 하지만 이러한 동작을 실현하기 위해 각 언어에서는 Memory에 여러 Data type이 저장되는 방식에 대한 동일한 개념을 갖고 있어야 합니다. 따라서 CTS에서는 이러한 상호작용을 보장하기 위해 CLI호환언어가 봐야 할 bit pattern과 개체의 동작 및 Layout을 정의하고 있습니다. CLS는 상호작용가능한 Library를 생성하는 것을 목표로 하는 CTS이 하위 집합니다.
5. Framework (Base Class and Framework Class Library)
CLI는 CLI code를 실행하는데 사용가능한 일련의 기반 Class를 명시하고 있으며 이를 Base Class Library(BCL)이라고 합니다. BCL은 많은 API(Application Programming Interface)들을 포함하고 있으며 이를 통해 CIL Code를 실행하여 Runtime환경 및 기반 OS와 상호작용할 수 있습니다.
이전으로 거슬러 올라가면 .NET Framework Class Library(FCL)라는 것도 존재하는데 이 Library는 GUI(Graphical User Interface), Database 연결 및 Web관련 여러 API를 포함하고 있으며 사실상의 Windows OS전용으로 기존 Code를 유지관리하는 것에만 사용되고 있습니다.
6. CLI 구현
Microsoft가 구현한 CLI Stack을 .NET이라고 합니다. 초기에는 Windows에서만 사용할 수 있었지만 2014년 이를 Open-source화 하여 재개발과정을 거쳤으며 그로 인해 현재는 Windows뿐만 아니라 Linux나 macOS에서도 사용할 수 있게 되었습니다.
이것 외에 SSCLI(Shared Source Common Language Infrastructure)도 존재하는데 이는 주로 학습을 위한 도구이며 상업적 Application의 기반으로 사용하는 것을 금지하는 조건하에 사용이 허가되었습니다.
마지막으로 C#을 통해 GUI를 갖춘 iOS와 Android App을 개발하고자 한다면 .NET MAUI를 사용할 수 있습니다.
'.NET > C#' 카테고리의 다른 글
[C# 13과 .NET 9] C# Programming 언어 - 1 (1) | 2024.11.15 |
---|---|
[C# 12와 .NET 8] 11. LINQ (0) | 2024.03.11 |
[C# 12와 .NET 8] 10. Entity Framework Core (1) | 2024.03.07 |
[C# 12와 .NET 8] 9. File, Streams, Serialization (0) | 2024.02.28 |
[C# 12와 .NET 8] 8. 공용 .NET Type (0) | 2024.02.23 |