[C#] CLR

Flaming Bun·2025년 4월 25일

C#

목록 보기
18/34

참고 서적 : 이것이 C# 이다(저자: 박상현) https://search.shopping.naver.com/book/catalog/39749421624?cat_id=50010920&frm=PBOKPRO&query=%EC%9D%B4%EA%B2%83%EC%9D%B4+C%23+%EC%9D%B4%EB%8B%A4&NaPm=ct%3Dm9wvtcfk%7Cci%3D7e7983a23f30852acb3140b489826733638aa204%7Ctr%3Dboknx%7Csn%3D95694%7Chk%3Dd62ee639da47559a958525a101ca07217fc8a73f

🔥 CLR(Common Language Runtime)

C#으로 만든 프로그램이 실행되는 환경, 닷넷의 실행환경이다.

닷넷 언어의 컴파일된 소스들은 CLR 이라는 환경에서 실행된다.

즉, 소스코드를 컴파일하면 닷넷 어셈블리가 되는데, 이 어셈블리가 CLR 위에서 동작한다.

VS 2022에서는 C#, C++, VB, F#, Python, Node.js, javascript 등의 언어를 지원한다.

사용자가 컴파일된 중간 언어인 .exe를 실행하면 CLR이 메모리에 로드되고 .exe를 번역하여 기계어로 변환 후 OS 위에 실행 시킨다.

C# 프로그램의 실행 과정

C# 코드 -> C# 컴파일러 -> *IL로 작성된 실행파일 -> .exe 실행 -> CLR 실행 -> JIT 컴파일 -> 기계어

  • 컴파일 단계에서 C# 컴파일러가 IL코드로 변환하여 .exe또는 .dll 생성
    .exe는 entry point를 포함한 실행 가능한 어셈블리고
    .dll은 다른 프로그렘에서 참조 사용하는 라이브러리 어셈블리이다.
  • .exe 실행 시 JIT(Just In Time) 컴파일러가 IL 코드를 기계어로 변환하여 실행한다.

CLR

두 번 컴파일하는 이유

C#이 동작하는 환경이자 엔진인 CLR은 C#뿐만 아니라 다른 언어도 지원하도록 설계됐다.

서로 다른 언어들이 만나는 지점이 IL이라는 중간 언어이고, 이 언어로 쓰인 코드를 CLR이 다시 자신이 설치된 플랫폼에 최적화해 컴파일한 후 실행한다.

이 방식의 장점은 플랫폼에 최적화된 코드를 만드는 것이고, 단점은 실행 시 이루어지는 컴파일의 비용 부담이다.

컴파일 비용부담이 없지만 어떤 기계에서도 평균적인 성능을 내는 것
VS
컴파일 비용부담이 있지만 어떤 기계에서도 최적화 되어 최고의 성능을 내는 것
멀리 보면 후자가 더 좋을 수 있다.

CLR의 기능들

  1. 언어들을 동작시키는 환경
  2. 프로그램 오류 발생 시 처리하는 기능
  3. 언어간 상속 지원
  4. *COM과의 상호 운용성 지원
  5. 자동 메모리 관리(= 가비지 컬렉션)
    ...

📌 JIT(Just In Time) 컴파일

실행에 필요한 IL 코드를 실행할 때마다 실시간으로 컴파일해서 실행한다.
즉, 전체가 한 번에 컴파일되는 것이 아니라 필요한 코드만 JIT 컴파일을 한다.


🔥 COM(Component Object Model) 이란?

언어, 다른 프로그램 상관없이, 서로 다른 프로그램들이 객체처럼 서로 기능을 이진코드 레벨에서 주고 받을 수 있게 도와주는 기술

COM 표준

소프트웨어 컴포넌트들의 통합을 위한 인터페이스 표준이다.

소프트웨어 컴포넌트

소프트웨어 컴포넌트는 소프트웨어를 구성하는 모듈이다.
ex) 엑셀에서 숫자들의 평균값을 계산하는 모듈, 차트를 그려주는 모듈 등 모두가 각각 소프트웨어의 컴포넌트라고 할 수 있다.

소프트웨어 컴포넌트가 표준화된 인터페이스를 갖고 있으면 어떤 프로그램이든 붙여서 사용할 수 있다.

닷넷

마이크로 소프트에서 개발한 프로그램 개발 및 실행환경이다.

CLS(Common Language Specification)

닷넷 컴파일러가 지원해야 하는 최소한의 표준 규약으로 C#.NET, VB.NET, C++.NET, F# 등 닷넷 프레임워크 언어가 반드시 지켜야하는 언어 스펙으로 CLS를 따르는 언어라면 어떠한 언어라도 닷넷 프레임워크에서 실행가능하다.

0개의 댓글