Home 닷넷(.NET)
Post
Cancel

닷넷(.NET)

닷넷 프레임워크

MS에서 발표한 프로세스 가상 머신, 프레임워크가 설치된 환경에서 닷넷 프레임워크 기반 응용프로그램을 실행시킨다.

닷넷 프레임워크에는 가상 머신 역할을 하는 CLR(Common language Runtime) 구성요소가 있다. CLR 구성요소가 로드되어 실행되고 EXE/DLL 에 함께 저장되어있는 닷넷 코드를 실행한다.

C# 컴파일러는 소스코드를 IL(Intermediate Language)라는 중간 언어를 EXE/DLL 파일 내부에 생성하며 EXE 파일 내부에 시작과 함께 CLR을 로드하는 코드를 추가한다. CLR이 로드된 후 파일 내의 IL 코드를 로드하여 실행하게 된다.

닷넷 호환 언어

IL은 프로그래밍 언어에 종속되지 않으며 CLR은 IL로 이루어진 코드라면 실행가능하다. IL 언어로 번역되는 언어를 닷넷 호환 언어(.NET-Compliant Language)라고 하며 C#은 이 중의 하나이다. 닷넷 호환 언어는 서로의 클래스를 사용할 수 있으며 상속까지도 가능하다.

공통 중간 언어

자바에서 VM의 중간언어를 바이트코드(Bytecode)라고 하는 것처럼, 닷넷의 CLR에서는 이를 CIL(Common Intermediate Language)이라고 한다. 줄여서 IL 코드, MSIL 코드라고 부른다. IL은 CPU에 독립적인 결과물이다. CLR이 실행될 때 IL 코드를 CPU의 기계어로 최종 번역한다.

공용 타입 시스템

닷넷 호환 언어가 지켜야할 타입의 표준 규격을 정의한 것이 공용 타입 시스템(CTS: Common Type System)이다. 닷넷 프레임워크 상에서 실행하는 프로그램을 만들고 싶다면 CTS 규약을 만족해야 한다. 다른 특징으로는 CTS에 정의된 모든 규격을 구현할 필요는 없다.

ex) 클래스의 상속은 하나만 받을 수 있다.

공용 언어 사양

닷넷 호환 언어가 지켜야 할 최소한의 언어 사양을 정의한 것이 공용 언어 사양(CLS: Common Language Specification)이다. 닷넷 호환 언어는 CTS 전체를 구현해야 할 필요는 없지만 적어도 CLS에 명시된 사양은 반드시 구현해야 한다.

ex) C#에서는 CTS에 정의된 unsigned를 사용할 수 있지만 CLS에서는 unsigned 를 강제하지 않았으므로 다른 닷넷 호환 언어를 섞어서 사용할 때, 오류가 발생할 수 있다.

메타데이터

사전적인 정의로는 데이터를 위한 데이터를 메타데이터(Metadata)라고 한다. 파일의 속성 값을 담는다.

ex) 이미지 파일의 메타데이터는 사진크기, 너비, 높이, 해상도, 비트 수준, 압축 정보등을 담는다.

프로그래밍 언어에서는 개발자가 구현한 코드가 데이터에 해당되고, 해당 코드의 성격을 설명해주는 별도의 데이터를 메타데이터라고 한다. CLR에서 동작하는 실행 파일은 자기 서술적인(self-descriptive) 메타데이터를 제공하며 외부에서는 리플렉션(Reflection)이라는 기술을 통해 사용할 수 있다. 닷넷 호환 언어에 대한 컴파일러는 IL 코드와 함께 메타데이터도 생성해 EXE/DLL 파일에 담아야한다.

어셈블리, 모듈, 매니페스트

C#으로 프로그램을 만드는 겨우 EXE/DLL 파일을 대부분 만드는데 이러한 실행 파일을 어셈블리(Assembly)라고 한다.

어셈블리는 1개 이상의 모듈(Module)로 구성되며, 모듈 중 하나는 반드시 다른 모듈의 목록을 관리하는 매니페스트(Manifest) 데이터를 담고 있어야 한다.

매니페스트를 포함하지 않는 모듈의 확장자는 보통 netmodule 이고, 매니페스트를 포함하는 경우에는 확장자가 DLL(또는 EXE)이다.

다른 사람이 만든 어셈블리에 구현된 코드를 사용하고 싶다면 메니페스트가 포함된 모듈 및 관련 모듈을 함께 가지고 있어야한다. 하지만 일반적으로 모든 어셈블리가 1개의 (EXE/DLL 모듈) 파일로 구성된다. 비주얼 스튜디오에서도 모듈 생성을 지원하지 않는다.

공용 언어 기반구조

공용 언어 기반구조(CLI: Common Language Infrastructure)는 MS에서 ECMA 표준으로 제출한 공개 규약. CTS 명세, IL 코드 정의, 메타데이터를 포함하는 이진 파일(Binary file)의 구조까지 표준 사양으로 기술하고 있다. CLI 규격을 MS 에서 구현한 실체가 바로 CLR 이다. 이러한 CLI 구현체가 오픈소스로 꾸준히 개발되어 리눅스, 맥 OS 까지 지원하고 있다.

공용 언어 런타임

공용 언어 런타임(CLR: Common Language Runtime)은 CLI 사양을 따라는 가장 대표적인 VM으로 MS에서 개발해 윈도우 OS로만 배포되고 있다.

CLR에서는 크게, 중간 언어를 JIT 컴파일러를 통해 기계어로 변환하는 일가비지 콜렉터(GC: Garbage Collector)를 제공해 동적 메모리 할당 및 회수를 지원하는 일을 한다.

CLR은 프로세스(EXE) 내에서 공개된 API에 의해 로드될 수 있다.

ex) 윈도우의 웹서버 IIS, MS-SQL, PowerShell

닷넷 프레임워크

CLR에 여러 가지 구성요소를 함께 만들어 하나의 패키지로 묶어 배포한 것이 MS의 닷넷 프레임워크다.

다음은 닷넷 프레임워크의 구성 요소들이다.

  • BCL(Base class Library) : 특정 기능을 수행하는 타입을 미리 만들어 제공한다. ex) 문자열 암호화 관련 타입 제공, UI 타입 제공, XML 타입 제공 등
  • 부가 실행 파일 : C#, VB.NET 컴파일러 제공과 각종 유틸리티 실행 파일 제공
  • GAC(Global Assembly Cache) : 닷넷 응용 프로그램이 어셈블리 파일을 공통적으로 찾을 수 있는 전역 저장소. ex) C:\Windows\assembly 폴더에 위치해 각종 DLL 파일을 담고있다.

닷넷 코어 & 닷넷 표준

닷넷 코어(.NET Core)는 공용 언어 기반구조(CLI: Common Language Infrastructure)의 구현체 중 하나로 다중 플랫폼(맥, 리눅스등)에서 실행할 수 있으며 오픈소스로 만들어졌다.

닷넷 코어와 닷넷 프레임워크는 컴파일러, 언어, 런타임 컴포넌트를 공유하지만 라이브러리와 앱 유형이 다르다. 라이브러리 불일치를 해결하기 위해 다시 만든 규격이 닷넷 표준(.NET Standard) 라이브러리다. 닷넷 표준 라이브러리로 만들어진 라이브러리 또는 바이너리는 닷넷 코어와 닷넷 프레임워크에서 모두 사용 가능하다.

닷넷 5(.NET 5)

닷넷 코어와 닷넷 프레임워크에 따라 만들 수 있는 프로젝트의 종류가 달라져 2020년 이후 이 둘을 통합한 “.NET 5” 버전을 출시할 예정이다.

This post is licensed under CC BY 4.0 by the author.

컴파일/런 타임 (Compile/Run Time)

C# 프로그래밍 기법