문제

Q1) 왜 C#이 처음에 IL에 컴파일 된 다음 런타임에 JIT를 준수하고 가상 머신 위에서 실행되는 이유. 아니면 JIT가 기본 기계 코드를 준수합니까?

Q2) 두 번째가 true (JIT가 기본 기계 코드를 준수 함)라면, .NET 샌드 박스는 어디에 실행되는지 샌드 박스는 어디에 있습니까?

Q3) 또한 코드가 처음에 IL에 컴파일되는 이유는 무엇입니까? 항상 기본 기계 코드를 항상 컴파일하지 않겠습니까? NGEN이라는 MS의 도구가 있지만 왜 그 선택 사항입니까?

도움이 되었습니까?

해결책

IL은 프로세스가 실행될 때 기본 기계 코드로 컴파일 된 JIT'D (JIT = JUST TIME)입니다.

가상 머신 레이어를 사용하면 .NET은 플랫폼에서 일관된 방식으로 작동 할 수 있습니다 (예 : 32 또는 64 비트 머신에서 실행 중인지 여부에 관계없이 INT는 항상 32 비트입니다. C ++의 경우에는 그렇지 않습니다. ).

JIT 컴파일은 최적화가 코드가 실행될 때 코드에 동적으로 맞춤화 할 수 있도록합니다 (예 : 자주 호출되는 코드 비트에보다 공격적인 최적화를 적용하거나 할 수없는 SSE2와 같은 특정 시스템에서 사용할 수있는 하드웨어 지침을 사용합니다). 정적 컴파일러.

다른 팁

A1) JIT는 기본 기계 코드로 컴파일됩니다

a2) .net에는 샌드 박스와 같은 용어가 없습니다. 대신 앱 도메인이 있습니다. 그리고 그들은 CLR의 일부로 운영됩니다 (즉, 실행 가능한 프로세스의 일부로)

A3) Jeffrey Richter의 NGEN 단점 :

  • ngen'd 파일은 동기화에서 벗어날 수 있습니다. CLR이 ngen'd 파일을로드하면 이전에 컴파일 된 코드와 현재 실행 환경에 대한 여러 특성을 비교합니다. 특성이 일치하지 않으면 NGEN'D 파일을 사용할 수 없으며 일반 JIT 컴파일러 프로세스가 대신 사용됩니다.

  • 열등한 하중 시간 성능 (Rebasing/Binding). 어셈블리 파일은 표준 Windows PE 파일이며, 따라서 각각은 선호하는 기본 주소를 포함합니다. 많은 Windows 개발자들은 기본 주소와 Rebasing과 관련된 문제에 익숙합니다. JIT 컴파일 코드 인 경우 올바른 메모리 주소 참조가 실행 시간에 계산되기 때문에 이러한 문제는 문제가되지 않습니다.

  • 열등한 실행 시간 성능. COMINGOILOD CODE에서 NGEN은 JIT 컴파일러만큼 실행 환경에 대해 많은 가정을 할 수 없습니다. 이로 인해 ngen.exe가 열등한 코드를 생성하게됩니다. 예를 들어, NGEN은 특정 CPU 지침의 사용을 최적화하지 않습니다. 정적 필드의 실제 주소는 실행 시간까지 알려지지 않기 때문에 정적 필드 액세스에 대한 간접 사항을 추가합니다. NGEN은 코드가 실행되는 순서를 알지 못하고 클래스 생성자가 이미 호출 된 경우 클래스 생성자를 어디에나 클래스 생성자를 호출하도록 코드를 삽입합니다.

당신이 사용할 수있는 ngen .NET 어셈블리의 기본 버전을 생성합니다. 이렇게하면 JIT가 런타임에이를 수행 할 필요가 없음을 의미합니다.

.NET은 JIT가 현재 CPU에 대한 IL 코드를 최적화하도록 설계되었으므로 .NET은 먼저 IL로 컴파일 된 다음 기본으로 컴파일됩니다.

.NET 코드는 호환성을 위해 IL에 컴파일됩니다. C#, vb.net 등을 사용하여 코드를 만들 수 있으므로 JIT에는 기본 코드로 컴파일하려면 공통 명령어 세트 (IL)가 필요합니다. JIT가 언어를 알고 있어야한다면 새로운 .NET 언어가 출시 될 때 JIT를 업데이트해야합니다.

샌드 박스 질문에 대해 잘 모르겠습니다. 가장 좋은 추측은 .NET 앱이 3 개의 응용 프로그램 도메인으로 실행된다는 것입니다. 하나의 도메인은 .NET RunTimes (mscorlib, system.dll 등)를 포함하고 다른 도메인에는 .NET 코드가 포함되어 있으며 다른 도메인이 무엇인지 기억할 수 없습니다. 체크 아웃 http://my.safaribooksonline.com/9780321584090

1. C#은 나머지 .NET 언어와 플랫폼을 공유하기 때문에 CIL (또는 IL)으로 컴파일됩니다 (C#에 DLL을 작성하여 번거리없는 VB.NET 또는 F#에 사용할 수있는 이유). 그만큼 CLR 그런 다음 JIT는 코드를 기본 기계 코드로 컴파일합니다.

.NET은 여러 플랫폼 (Mono On *Nix 및 OS X)에서도 실행할 수도 있습니다. C#이 기본 코드로 컴파일 된 경우 거의 쉽지 않습니다.

2. 샌드 박스가 없습니다.

3. #1에 대한 답변에서 다루었습니다

A1)이 방법으로 플랫폼 Agnostic (Windows, Linux, Mac)이며 현재 하드웨어에 특정 최적화를 사용할 수도 있습니다. JIT가 컴파일되면 기계 코드입니다.

A2) 전체 프레임 워크 (.NET 프레임 워크)는 모든 샌드 박스이므로 앱을 통해 만들 수있는 모든 통화가 .NET 프레임 워크 샌드 박스를 통과합니다.

A3) 답 1에서와 같이 .NET BINIRAL은 다른 플랫폼에서 작동하고 클라이언트 시스템에서 특정 최적화를 수행 할 수 있습니다.

컴파일 된 .NET 코드는 Javas의 객체 코드와 동일한 방식으로 중간 언어 인 IL이됩니다. 예, ngen 도구. NGEN은 결과적인 기본 이미지를 기계에 바인딩하므로 NGEN'D Binary를 다른 시스템에 복사하면 예상 결과가 생성되지 않습니다. 중간 코드로 컴파일하면 C ++와 같은 정적으로 정적 된 언어로 (쉽게) (쉽게) (쉽게) 만들 수없는 런타임 의사 결정이 가능하며, 코드가 설명 해져서 다른 하드웨어 아치형에서 코드의 기능을 수행 할 수 있습니다. 또한 32 비트 시스템 또는 64 비트 시스템에서만 작동하는 기계 별 코드와 달리 비회적으로 발생 해야하는 의도 (예 : 32 또는 64)에 대한 의도를 설명합니다.

또한 NGEN은 이진을 시스템에 바인딩한다고 말했듯이 동적으로 입력 한 언어의 유연성으로 컴파일 된 기계 코드의 성능이 필요할 때 유용 할 수 있으며 바이너리가 이동하지 않을 것임을 알고 있습니다. 구속되지 않은 시스템.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top