프로그래밍/C++

@.NET Framework

코딩하는상후니 2022. 8. 27. 22:04

 

 


 

.NET Framework 의 구성

 

 

 

 

 

 

* CLI  (  Common Language Infrastructure )

 
=> 실행 코드와 런타임 환경을 설명하기 위해 MS 에서 개발한 '오픈 규격'.
=> CLI 는 단지 '규격' 이란 것이 중요하다.
 
1. CTS ( 공통 형 체계 )
2. 메타데이터
3. CLS ( 공통 언어 규격 )
4. VES ( 가상 실행 시스템 )
 
=> 해당 규격으로 MS 에서 만든 것이'CLR'이다.

 

 

 

 

 

 

 
 

* CLR  (  Common Language Runtime )

 
=> JAVA 의 JVM 과 비슷한 역할을 하는 .NET Framework 의 Virtual Machine 이다.
( Machine = CPU 역할을 하는 실행 환경 )

 

=> GC ( 가비지 컬렉터 )Just-in-Time 컴파일러 가 속해있다.
 
 
 
 
 
 
 

* CTS ( Common Type System )

 

 
=> 닷넷 에서 자료형 정의 및 특정 자료형 값이 어떻게 컴퓨터 메모리에 표현되는지를 규정하는 표준.
 
 
 
 

 

 
 
 
 

* CLS ( Common Language Specification , CLS )

 
=> 닷넷 호환 언어가 지켜야할  '최소한의 표준 규약'.
=> 최소 구현 사양이므로 닷넷 프레임워크를 사용하기 위해선 필수로 따라야함.
 
 
 
 
 
 
 
 
 

 

* CIL or MSIL ( Commone Intermediate Language )

 

 
=> 만약 C# 코드로 작성된 프로그램을 C# 컴파일러가 컴파일하게 되면
CIL Code 가 포함된 exe, dll 파일들을 생성한다.
 
 
=> ByteCode ( 바이트 코드 ) 의 한 종류.
=> '닷넷 어셈블리' 라고도 함.
 
 
=> 닷넷에서 C# 뿐만 아니라 여러 언어들을 지원하기 때문에
이러한 언어들을 하나로 통합하기 위해서 거치는 중간 단계의 언어.

 

 
 
 
 
 
 
 
 

* 바이트코드 ( ByteCode )

 

 
=> H/W 가 아닌 S/W 에 의해 처리되며
'가상 컴퓨터 ( Virtual Machine )' 에서 돌아가는 실행 프로그램을 위한 이진 표현법.
 
 
=> 컴파일 되어 만들어진 바이트 코드는
 
특정 하드웨어의 기계 코드를 만드는 컴파일러의 입력으로 사용되거나 ( = 'AOT 컴파일' ),
 
'가상 컴퓨터 ( ex. JVM, CLR )' 에서 바로 실행 ( JIT 컴파일로 기계어 변환 ) 된다.

 

 

 
즉,
바이트 코드는 기계어는 아니지만 가상 머신에 의해 기계어로 손쉽게 변환할 수 있는 코드.
 
 
 
 
 
 
 
 
 
 
 
 

* BCL ( Base Class Library )

 

 
=> 모든 .NET Framework 에서 사용 가능한 거대한 표준 라이브러리.
 
 
 
 
 
 
 
 
 
 
 
 
* 프로그램 언어로 작성된 프로그램들을 실행하는 두 가지 방법
 

 

1. 실행 직전에 프로그램 컴파일 ( 정적 컴파일 방식 ). 

 

2. 소스 코드를 인터프리터에 통과시킴 (인터프리터 방식 ).
 
 
 
 
 
 
 
 

* 정적 컴파일 /  인터프리터 방식 의 차이점

 
 
 

@정적 컴파일 방식

 
=> 환경 ( OS... ) 마다 다른 컴파일된 프로그램을 제공해야함.
 
=> 기계어 번역을 한번에 처리 후, 실행 파일 생성.
실행 파일만 실행시키면 되기에 속도가 빠르다.
 
ex) C, C++...
 
 
 
 
 
 

@인터프리터 방식

 
 
=> 소스 코드를 직접 실행하기 때문에 프로그램이 실행될 때 인터프리터가 존재해야함.
 
=> 프로그램이 실행 중에 기계어로 번역하기 때문에 속도가 느리다.
 
=> 소스 코드가 쉽게 노출됨.
 
 
 
 
 
 
 

* 왜 인터프리터 방식을 쓰는 것일까 ??

 
 
 
 
1. 프로그램 수정이 간단함.
 
프로그램이 커서 컴파일 시간이 시간 단위가 될 경우가 많은데 이 때, 유용하다.
( 프로그램을 컴파일 없이 즉시 실행시킬 수 있음.  시간 절약. )
 
이 장점을 최대한 살려 적극적으로 인터프리터를 채용한 것이 스크립트 언어이다.
( 수정 결과가 즉각적으로 반영된다. )
 
 
 
 
 
 
 
2. 프로그래밍 언어 차원에서 동적인 기능을 지원하기 유리.
 
=> 사용자가 입력한 임의의 프로그램 평가, 실시간 모듈 결정 등
실행 시간에 동작하기에 사용자와 넓고 '다양한 피드백' 이 가능하다.
 
 
 
=> 코드 한줄 한줄 읽고 실행시키는 인터프리터 방식으로 디버그가 쉽지 않았는데
최근 인터프리터는 성능 등의 이유로 파일을 실행하면
우선적으로 파일 전체를 컴파일하는 방식을 도입하고 있다.
 
ex) MATLAB, Python...
 
 
 
 
 
 
 
이러한 이유들로 즉각적인 피드백을 필요로 하는 'Web' 개발 등에서 사용하는 것 같다.

 

 
 
 
 
 
 
 
 

 

 

 

 

* JIT 컴파일, 동적 번역 ( just-in-time compilation, Dynamic translation )

 

 
=> 프로그램을 실제 '실행하는 시점에 기계어로 번역하는 컴파일 기법'
=> 런타임 컴파일 방식.

 

 

 
=> 인터프리터 방식으로 기계어 코드를 생성하고 그것을 '캐싱' 하여
같은 함수가 여러 번 불릴 때, 매번 기계어 코드 생성 예방 ( 속도 향상. )
 
 
 
하지만, 추가적인 비용이 든다.
 
1. 처음 호출 시 호출 비용.
 
2. 기계어 코드를 저장하기 위한 추가적 메모리 비용.
 
 
 
 
 
 
=> 자바 가상 머신, 닷넷, 등 에서 JIT 컴파일을 지원.
 
=> JIT 컴파일러를 인터프리터에 내장하는 방식으로 쓴다.
 
 
 
 
 
 
 
 
 
 

* AOT 컴파일 ( Ahead-Of-Time )

 

 

=> 미리 고급 언어 / 기계어 사이의 언어인 중간 언어 형태 코드 ( 바이트 코드 )
미리 목표 시스템에 맞는 기계어로 번역하는 방식을 말한다.
 
 
=> 중요한 것은 중간 언어를 '컴파일 타임' 에 미리 환경에 맞는 기계어를 생성하므로
 
이전에 중간 언어를 런타임에 JIT 컴파일 같은 기법을 통해 기계어를 번역하는 것보다
 
비용이 싸다.

 

 
=> CIL Code ( 중간 언어가 포함된 ) 를 C++ 컴파일러를 통해 기계어로 변환.
 

 

 

 

 

 

 
 

* ASP.NET  

 
 
=> MS 가 개발하고 판매하는 오픈소스 웹 애플리케이션 프레임워크.
 
 
 
 
 
 
 
 
 
 
 
 

* ADO.NET

 
 
 
=> MS .NET Framework 에 포함되어 있는 기본 클래스 라이브러리 (Base Class Library) 의 일부.
 
 
 
 
 
 
 

 

 

* 결론

 
 
.NET Framework 표준 형식을 지켜 개발한 프로그램을

.NET Framework 가 설치되어있다면 환경에 상관없이 프로그램이 실행 가능하다.

 

 
 
=> 이런 호환성 덕분에 .NET Framework 는 운영체제의 일부분으로 자리 잡았다.