[CLR/C#] CLR의 실행 모델 (2)

2024. 2. 11. 20:49·독서/CLR via C#

제프리 리처의 CLR via C#(저자, 제프리 리처)


네이티브 코드 생성 도구, NGEN.EXE

이 부분은 빠르게 넘어간다.

NGEN.EXE 프로그램은 .Net Framework와 함께 제공된다. IL 코드를 네이티브 코드로 컴파일하는 것에 사용될 수 있으며, 응용 프로그램을 컴퓨터에 설치하는 경우에 사용할 수 있다.

장점은 아래와 같다.

  • 프로그램의 시작 시간을 개선할 수 있다.
  • 응용 프로그램의 작업 집합Working Set이 감소한다.

단점은 아래와 같다.

  • 지적 재산권 보호가 어렵다.
  • 네이티브 이미지의 버전이 맞지 않을 가능성이 존재한다.
  • JIT 컴파일러에 비해 컴파일 속도가 좋지 않다.

프레임워크 클래스 라이브러리Framework Class Library

FCL ?

FCL은 DLL 어셈블리의 집합이며, 다양한 기능을 제공하는 수많은 타입들이 포함되어 있다. MS는 여기에서 Azure SDK, DirectX SDK 같은 추가 라이브러리들을 통해서 더 많은 기능과 타입들을 제공한다. 이를 통해 만들 수 있는 것들은 다음과 같다.

  • Web Service
  • Web Form / MVC HTML based applications(web sites)
  • Rich Windows GUI applications
  • Window Console Applications
  • Windows Services
  • Database stored procedures
  • Component library

FCL은 수많은 타입들로 구성되는데, 서로 연관된 타입은 하나의 네임스페이스로 묶어서 제공된다. System 네임스페이스의 경우, Object 기본 타입을 가지고 있는데, 이는 모든 클래스의 부모 타입이 된다.

 

다양한 네임스페이스가 존재하기 때문에, 원하는 기능을 사용하기 위해서는 이에 대해서 제대로 숙지하고 있어야 한다. 이러한 점 때문에 FCL은 객체 지향 프로그래밍Object Oriented Programming, OOP의 원칙과 동일하다.


공용 타입 시스템

CLR에서 타입은 굉장히 중요하다. 다른 프로그래밍 언어와 호환성을 갖출 수 있게 해주는 중심이자, 시작점이기 때문에 MS는 Common Type System을 표준으로 정의하여 동작을 규정한다.

CTS는 하나의 타입 안에서 아래의 멤버를 정의하거나 정의하지 않을 수 있다.

  • 필드Field
    • 이름과 타입으로 구분된다.
  • 메서드Method
    • 원형Signature과 한정자Modifier로 구성된다.
  • 프로퍼티Property
    • 1~2개의 메서드로 구성되었으며, 필요 시 값을 계산한다.
  • 이벤트Event
    • 객체의 상태에 대해서 공유할 수 있다.
  • 접근 지시자 목록
명칭 설명
Private (C# Default) 같은 클래스 타입 내의 다른 멤버들에서만 접근이 가능하다. *C#에서는 접근 지시자가 붙지 않았을 경우, Private이 기본임
Protected (Family) 상속 관계의 클래스에서도 접근이 가능하다.
Public 상속 관계 및 어셈블리 위치에 무관하게 접근 가능하다.
Family and Assembly 상속 관계의 클래스에서 접근이 가능하지만, 같은 어셈블리에 존재해야 한다.
Family or Assembly 상속 관계의 클래스에서 접근이 가능하고 같은 어셈블리가 아니어도 접근이 가능하다.
Internal (Assembly) 같은 어셈블리 안에 위치해야 접근할 수 있다.

CTS의 동작 개념

CTS가 사용됨에 따라서 C#이나 VB에서 .NET을 사용할 수 있다. 문법은 다를 수 있지만 타입 안의 동작은 동일하게 된 것이다.

 

C++이 여러 부모에게 상속받을 수 있는 것과 달리, CTS는 단 하나의 클래스에 대한 상속만을 허용한다. 이를 고려해서 C++/CLI 컴파일러는 여러 부모 클래스를 상속받는 문법이 있다면 오류를 프로그래머에게 알린다.

 

C++/CLI는 C++과 다르다.

더보기

C++/CLI는 .NET과의 호환성을 위해서 개발된 언어다. CLR을 사용할 수 있으나 일반 C++에서는 불가능하다. 언어 사이에 서로 전부 호환되는 것은 아니고 일부 호환된다. C++/CLI → IL → Native Code(CPU) C++ → Native Code(CPU)

또, 모든 타입은 System.Object 타입을 상속해야 한다. System 네임스페이스의 최상위 타입이고 다른 모든 타입들의 최상위 부모이기 때문이다. 이를 통해서 생성된 인스턴스들은 최소한의 공통 기능을 가지게 된다. ( Equals, Finalize, GetHashCode, … )


공용 언어 사양

COM ( Component Object Model) MS가 개발한 소프트웨어 컴포넌트 조합 및 사용 기술로 코드의 재사용성, 상호 운용성 및 확장성 개선에 도움을 주는 모델이다.

COM은 다른 언어에서 만들어진 객체끼리의 상호 간 통신을 할 수 있도록 한다. 이와 달리, CLR은 더 나아가서 모든 언어를 통합하고 한 언어로 만든 객체를 다른 언어에서 동등하게 취급할 수 있다.

 

이는 CLR의 표준 타입 집합들과 자기 설명적인 정보를 포함하는 메타데이터 그리고 공용 실행 환경Common Execution Environment 덕분이다.

 

모든 언어를 통합하는 것은 굉장히 흥미로운 일이지만, 언어의 특성은 공통되지 않고 다른 부분들이 존재한다. 여기에서 MS는 공통된 부분들 이용하여 공용 언어 사양Common Language Specification을 정의하여 컴파일러 제작 시, 최소한의 준수 사양을 정의한다.

 

각자의 관계도는 아래와 같다.

IL 어셈블리 언어를 사용해서 프로그램 코드를 작성한다면 CLR/CTS의 모든 기능을 사용할 수 있을 것이고 C#, VB, Fortran을 통해 만든다면 불가능 할 것이다. CLS는 모든 언어들이 호환성을 위해 지켜야 할 최소한의 기능 집합을 제공한다.

 

아래 예시는 C#으로 CLS 호환 타입을 작성하려고 시도한 예제다. 일부 CLS를 준수하지 않는 부분이 있어서 컴파일러는 이러한 부분들에 대해 문제점을 알려준다.

using System;

// CLS 호환 여부 점검 지시
[assembly: CLSCompliant(true)]

namespace SomeLibrary {
    public sealed class someLibraryType {
        // X) 반환 타입이 CLS를 준수하지 않는다.
        public UInt32 Abc() { return 0; }
        // X) 대소문자 차이만 다른 메서드가 존재하기 때문에 CLS와 호환되지 않는다.
        public void abc() { }
        // O) 클래스 내부에서만 사용되기 때문에 문제가 없다.
        private UInt32 ABC() { return 0; }
    }
}

ILDASM.EXE을 사용하기

ILDASM.EXE를 사용하여 예제 코드의 IL을 읽어보았다. 구성 멤버에 대한 설명은 생략한다.


비관리 코드와의 상호 운용성

.Net Framework는 유용한 기능들이 존재하지만, 기존에 가진 코드를 재설계하여 구현하는 것은 어려운 일이다. 이를 인지하고 MS는 관리 응용프로그램과 비관리 응용프로그램의 공존 메커니즘을 다음과 같이 제시한다.

  • 관리 코드는 DLL 안의 비관리 함수를 호출할 수 있다.
  • 관리 코드는 기존 COM 컴포넌트를 사용할 수 있다.
  • 비관리 코드가 관리 타입을 서버로 사용할 수 있다.

'독서 > CLR via C#' 카테고리의 다른 글

[CLR/C#] 공유 어셈블리와 강력한 이름의 어셈블리  (0) 2024.04.15
[CLR/C#] 빌드, 패키징, 배포, 응용프로그램과 타입의 관리  (0) 2024.04.15
[C#] IL 코드 확인 및 메타데이터 확인하기  (0) 2024.04.15
[CLR/C#] CLR의 실행 모델 (1)  (0) 2024.02.10
[CLR/C#] 공부를 시작하면서...  (0) 2024.02.10
'독서/CLR via C#' 카테고리의 다른 글
  • [CLR/C#] 빌드, 패키징, 배포, 응용프로그램과 타입의 관리
  • [C#] IL 코드 확인 및 메타데이터 확인하기
  • [CLR/C#] CLR의 실행 모델 (1)
  • [CLR/C#] 공부를 시작하면서...
태역
태역
  • 태역
    RYULAB
    태역
  • 전체
    오늘
    어제
    • 분류 전체보기 N
      • 언어
        • C
        • C++
        • C#
      • 엔진, 프레임워크
        • Unity
        • Unreal
        • Electron
      • 공부
        • 디자인 패턴
        • 수학
        • CS
        • Git
        • 알고리즘
        • 자료구조
      • 코테
        • 프로그래머스
        • 백준
      • 독서 N
        • Effective C#
        • CLR via C#
        • 뇌를 자극하는 윈도우즈 시스템 프로그래밍
        • 오브젝트
        • CSAPP
        • OSTEP N
        • 이득우의 게임 수학 N
      • 프로젝트
        • Unity
      • 개발 일지
        • 퓨처리티
        • 골든타임
      • 활동
        • 게임잼 후기
        • 게임제작동아리 브릿지
        • 크래프톤 정글
        • 기타
      • 기타
  • 블로그 메뉴

    • 링크

    • 공지사항

      • 2024 04 17
    • 인기 글

    • 태그

      오블완
      티스토리챌린지
      인프런 #인프런강의후기 #게임개발 #게임개발강의 #인강후기 #강의후기 #게임개발자 #인프런강의
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    태역
    [CLR/C#] CLR의 실행 모델 (2)
    상단으로

    티스토리툴바