.NET에서 CIL 및 CLR이 필요한 이유는 무엇입니까?


11

나는이 멋진 이미지를 여기에서 보았다 . .net 언어를 지원하는 모든 컴파일러가 소스 코드를 CIL형식으로 변환한다는 것을 알았습니다 . 이제 Microsoft는 .NET모든 운영 체제에 대해 CLR을 작성하여 모든 운영 체제를 도입하지 않습니다. 그렇다면 왜 그런 CIL을 실행하기 위해 중간 코드 형식과 CLR을 유지해야 하는가? 다루어야 할 두통이 아닙니다. Microsoft가 왜 이렇게 선택 했습니까?

편집 이 좀 아키텍처는 그 가격이 있습니다. 성능이 저하되지 않습니까? Java는 플랫폼 독립성을 유지하기 위해 이것을 수행합니다. .NET이 어떤 이유로합니까? 컴파일러와 같은 간단한 일반 C를 유지하지 않겠습니까? 새로운 언어를 추가해야 할 경우 컴파일러는 코드를 CIL로 변환해야합니다. 대상 언어와의 유일한 차이점은 대상 언어입니다. 문신이 전부 야


3
CIL에 컴파일러를 작성하는 것이 더 쉽기 때문입니다. 그리고 각각의 모든 언어에 대한 컴파일러보다 하나의 CIL을 기본 컴파일러에 작성하는 것이 더 쉽습니다.
Oded

9
@ratchetfreak : MS가 CLR을 다른 플랫폼으로 이식하지 않은 이유 일 수도 있지만, CLR을 처음으로 도입 한 이유는 아닙니다 (실제로 포트를 더 쉽게 만들 수 있으므로 인수는 MS bashing처럼 들립니다. 죄송합니다)
Doc Brown

12
또한 'M $'에 대한 공감대, 이것이 무엇입니까, 1998?
Alan B

3
에릭 리퍼 트 ( Eric Lippert) 는 이에 대해 논의한다 (3 번째 단락부터 시작; 첫 2 개 단락은 Roslyn에 관한 것임). 짧은 대답은 Oded의 의견과 Telastyn의 대답이 옳다는 것입니다. <운영 체제 수> * <언어 수> 컴파일러 대신 <운영 체제 수> + <언어 수> 컴파일러 만 코딩하면됩니다.
Brian

3
@busy_wait : 참조 된 페이지에는 몇 가지 단점이 있습니다. 예를 들어 "두 응용 프로그램의 구성 정보로 인해 동일한 종속 어셈블리에 대해 다른 바인딩 결정이 발생할 수 있습니다." 즉석에서 생성하면 이러한 문제가 발생하지 않습니다. 이는 앱이 배포 된 후 컴파일이 실제로 수행되어야 함을 의미합니다 (실제로 NGEN은 각 대상 시스템에서 실행해야하며 배포자는이를 실행할 수 없음).
Brian

답변:


29

C #에 대해 하나의 컴파일러 만 CIL에 작성하면되기 때문에 어려운 부분입니다. C #에서 (플랫폼 별) 실행 코드로 컴파일러를 작성하는 것과 비교하여 플랫폼 당 CIL에 대한 인터프리터 (또는 더 자주 Just-In-Time 컴파일러)를 만드는 것은 비교적 쉽습니다.

그 외에도 런타임은 CIL로 컴파일되는 모든 것을 처리 할 수 ​​있습니다. F #과 같은 새로운 언어를 원한다면 하나의 컴파일러 만 작성 하면 .NET이 지원하는 모든 플랫폼 지원을 자동으로 수행 할 수 있습니다.

그리고 .NET dll을 가져 와서 다시 컴파일하지 않고 Mono를 통해 Windows 또는 Linux에서 실행할 수 있습니다 (모든 종속성이 충족되었다고 가정).

성능에 관해서는 논쟁의 여지가 있습니다. 본질적으로 CIL을 취해 네이티브 바이너리를 만드는 "컴파일러"가 있습니다. 다른 사람들은 적시 컴파일러가 정적 컴파일러가 할 수없는 최적화를 할 수 있다고 주장합니다. 내 경험상, 그것은 당신의 응용 프로그램이 무엇을하고 있고 어떤 플랫폼을 실행하고 있는지 (주로 JITer가 그 플랫폼에서 얼마나 좋은지) 많은 것에 달려 있습니다. .NET이 충분 하지 않은 시나리오를 시작하는 것은 극히 드 rare니다 .


"통역사"? MS가 항상 JITter 만 제공한다고 생각 했습니까?
Doc Brown

1
@DocBrown-어, 네-내 잘못입니다. 고정.
Telastyn

+1,이 답변을 수락 할 수 있도록 내 편집 내용에 대해 약간의 설명을 추가 할 수 있습니까
vikkyhacks

고성능 런타임은 종종 인터프리터와 JIT 컴파일러 (혼합 모드 실행)를 결합합니다. .NET은 확실하지 않지만 많은 Java VM이이 접근 방식을 사용합니다.
Cyanfish

2
@ busy_wait : 모든 종류의 것들. 메소드 인라인, 복사 전파, 불필요한 코드 제거, 곱셈 / 나눗셈을 시프트로 변환, readonly필드를 사용한 다른 산술 연산 . 기존 컴파일러는 이러한 최적화 중 일부를 수행 할 수 있지만 정적 분석으로 감지 할 수있는 경우에만 가능합니다. 반대로 지터는 런타임에 수정하는 객체 또는 변수가 다른 곳에서 참조되지 않기 때문에 코드 섹션에서 유용한 작업을 수행하지 않는 것을 런타임에 알 수 있습니다. 지터에 대한 전문가는 아니지만 기본적으로 동적 분석과 정적 분석의 힘에 대한 질문입니다.
Aaronaught

14

.NET에는 Java와 동일한 이유로 CIL / MSIL (중간 언어) 및 CLR (플랫폼 독립적 런타임)의 플랫폼 별 구현이 있습니다. Microsoft는 C #이 Java와 직접 경쟁하도록 의도했으며, Microsoft가 목표로하는 OS (자체)에서 C와 경쟁합니다.

.NET은 Windows 플랫폼 (또는 Mono / Linux와 같은 .NET 작동 방식을 가진 다른 OS)에서만 지원되지만 Java와 유사합니다.

  • 관리되는 메모리 런타임-관리되지 않는 C / C ++와 달리 C # / VB.NET 개발자는 개체 수명을 엄격하게 제어 할 필요가 없습니다. Java와 마찬가지로 CLR에는 범위를 벗어나는 힙의 객체를 자동으로 해제하는 가비지 수집기가 있습니다. 이것은 관리되지 않는 런타임에 익숙한 사람에게는 미미한 것처럼 보일 수 있지만 C / C ++에서 일반적으로 사용되는 포인터 산술의 "블랙 매직"을 권장하지 않는 가장 큰 이점이 있습니다.
  • 플랫폼 독립성-Windows Vista 및 Windows 7은 Windows XP와 다르게 작동합니다. Windows 8은 여전히 ​​다르게 작동합니다. Windows 8 Mobile을 포함한 Windows Mobile 버전은 다시 다르게 작동합니다. 다른 하드웨어, 다른 아키텍처, 다른 기능. 대상 환경은 여전히 ​​.NET 개발자에게 중요하지만 이러한 모든 OS에 대해 호환 가능한 C / C ++ 프로그램을 빌드하는 것으로 알려진 것보다 전문 지식의 양이 훨씬 줄어 듭니다. AC # dev는 무료로 더 많은 것을 얻습니다.
  • 웹 응용 프로그램 지원-아직 C ++로 작성된 클라이언트 용 서버 스크립트 웹 응용 프로그램은 아직 보지 못했습니다. 물론 웹 서버 , Apache, ISS는 모두 속도 / 효율적인 이유로 관리되지 않는 런타임에 대해 실행됩니다. 그러나 C ++는 웹 응용 프로그램을 작성하는 데 사용되는 언어가 아닙니다. C #은 Java와 동일합니다. 처음부터 차세대 Microsoft ASP 패러다임을 지원하도록 설계되었습니다. 이것은 샌드 박스에서 실행되도록 설계된 코드입니다. 어느 샌드 박스 (ISS에 대한 ASP.NET 플러그인 또는 "데스크톱"CLR)는 상대적으로 중요하지 않습니다.
  • 언어 / 런타임 독립성-C ++ 컴파일러는 C ++ 소스 코드를 사용하여 하나의 기계어를 사용하여 하나의 프로세서 아키텍처에 대한 어셈블리 코드를 생성합니다. 다른 아키텍처 및 / 또는 기계 언어를 지원하려면 완전히 새로운 컴파일러를 작성해야하며 완전히 새로운 런타임 라이브러리 세트를 컴파일해야합니다. AC # 컴파일러는 C # 소스 코드를 사용하여 하드웨어 별 JITer가 기계 코드로 변환하는 CIL을 생성합니다. 동일한 JITer는 소스 언어에 관계없이 모든 CIL 프로그램을 번역 할 수 있습니다 (C #, VB.NET, F # 및 IronHaskell, IronRuby, IronLisp 등과 같은 여러 "Iron"언어 포트가 있습니다). 동일한 컴파일러는 하드웨어에 관계없이 모든 JITer가 실행할 수있는 하나의 언어를 CIL로 변환 할 수 있습니다.
  • "올바른"코드에 집중-C ++ 개발자에게는 가장 중요한 것에 따라 무언가를하는 "올바른"방법이 많이 있습니다. 메모리 효율성, CPU 효율성, 하드웨어 독립성, OS 독립성 등 각 코드가 우선 순위 인 경우 코드가 크게 다르게 보일 수 있습니다. C #은 다음과 같이 Fowler와 그의 동료 (C ++ 커뮤니티 내에서 객체 지향적 원칙을 교육함으로써 C ++ 커뮤니티 내에서 코드 설계를 개혁함으로써 코드 설계를 개혁하기 위해 노력했던)의 개념적 교훈을 염두에 둔 그룹에 의해 설계되었습니다. 이전의 언어들 (자바와 전능 한 객체에 대한 거의 광신적 인 순종을 포함하여, 오래된 C ++ 스타일의 함수 포인터가 훨씬 더 깨끗하고 일을 덜 할 때) 지향).

독점 금지 문제로 인해 MS는 Android, Mac OSX / iOS 및 Linux와 같은 다른 주요 플랫폼에서 너무 "중단"되지 않도록주의합니다. 그러나 실제로이 세 가지 플랫폼 모두를 위해 팀을 개발하고 있습니다. MS 용으로 개발 된 Office for OSX 버전이 있으며 iOS 및 Android 용 Office interop 앱, Skype (현재 Microsoft 제품)는 Linux에서 실행되며 Microsoft는 Linux 커널에 주로 기여하는 것으로 나타났습니다. 가상화 사고 방식).


1
"아직부터 C ++로 작성된 클라이언트 용 서버 스크립트 웹 응용 프로그램을 보지 못했습니다." -옛날 CGI는 어디에 두나요? 필자의 첫 번째 웹 응용 프로그램은 (사소한 것처럼) 100 % C였습니다. 당시 (90 년대 중반) cgi에서 표준 작업을 수행하기 위해 .c 및 .h를 작성하는 것이 더 쉬웠습니다 ( '스크립트'언어는 현장에서도 등장).

흠 ... CGI, CGI ... 들어 본 것 같지만 KeithS와 함께 있지만 실제로는 아직 보지 못했습니다 :)
DXM

@DXM 동적 콘텐츠의 오래된 모델은 웹 서버가 프로세스를 포크하고 표준 위치 (쿼리 매개 변수 등이 특정 환경 변수에 있음)-공통 게이트웨이 인터페이스에 대한 것입니다. 그런 다음 해당 프로세스의 출력이 컨텐츠로 다시 전송되었습니다. 예전에는 펄이나 파이썬보다는 C 나 C ++를 아는 프로그래머를 찾는 것이 더 쉬웠습니다.

1
Java와의 유사성의 중요성을 과소 평가하지 마십시오. 썬은 방금 JVM 포트로 MS를 고소했으며 법적으로 (어리석게도 IMHO) 수상했다. CIL과 CLR은 그 점에서 영감을 얻었으며 J #은 법적 조치를 취하지 않고 Java와 최대한 가깝습니다. 큰 차이점은 CLR이 언어에 구애받지 않는다는 것입니다. 필요한 경우 C #, F # 및 J #을 혼합하여 프로그램을 작성할 수 있습니다. Java를 다른 언어의 라이브러리와 혼합하고 안정적인 프로그램을 얻으십시오.
RBerteig

1
그러나 MSIL과 네이티브 코드 간의 상호 운용성은 합리적으로 잘 정의되어 있으며 작동합니다. 그리고 분명히 디자인과 사용자 커뮤니티의 태도에 따라 작동 할 것으로 예상되었습니다.
RBerteig

12

Windows OS는 오늘날 대부분 x64, x86, Intel, ARM 등 다양한 CPU 유형에 사용할 수 있습니다.

CIL / CLR은 해당 하드웨어 플랫폼과 독립적입니다. 이러한 차이점은 IL 실행 환경에 의해 "추상화"됩니다. 예를 들어 "모든 CPU"용으로 컴파일 된 .NET 어셈블리는 일반적으로 다른 실행 파일을 제공 할 필요없이 Win64에서 64 비트 프로세스로, Win32를 32 비트 프로세스로 실행할 수 있습니다.

또한 CIL을 사용하면 네이티브 DLL로는 쉽게 수행 할 수없는 어셈블리에 메타 데이터를 저장할 수 있습니다 (물론 MS는 COM 구성 요소를 사용하기 전에이 작업을 수행 할 수 있었지만 해당 기술은 .NET 구성 요소만큼 다루기가 쉽지 않았습니다). 따라서 소프트웨어 구성 요소를 훨씬 간단하게 만들 수 있으며 모든 .NET 언어에서 리플렉션 / Introspection 의 기초가 됩니다.


이것에 조금만 추가하면 다른 CPU 유형을 허용 할뿐만 아니라 동일한 CPU 유형 (예 : 모든 x64) 내에서 다른 버전 (Core i3 / i5 / i7) 및 공급 업체 (Intel vs. AMD)도 다를 수 있습니다 JIT 컴파일러가 활용할 수있는 어셈블리 명령어 세트
DXM

2
@DXM : 그리고 JIT가 실제로하는 것을 알고 있습니까? 아니면 더 가상적인 것입니까?
Doc Brown

적어도 MSDN 블로그 는 JIT 컴파일러가 그렇게한다고 주장 합니다 (또는 8 년 전).

@DocBrown : 분명히 참고 자료가 없지만, 오래 전에 이것에 대해 읽은 것을 기억한다고 생각했습니다. 링크를 찾아 주셔서 감사합니다 delnan. 우리는 칩 제조업체가 표준 x86-x64 위에 자체 명령을 추가하는 것을 알고 있기 때문에 기계가 이점을 누릴 수 있다면 왜 그렇지 않을까요?
DXM
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.