>백엔드 개발 >C#.Net 튜토리얼 >.NET Core 구성 시스템의 상세 분석(그림)

.NET Core 구성 시스템의 상세 분석(그림)

黄舟
黄舟원래의
2017-03-09 15:18:501769검색

이전 기사에서는 .NET 플랫폼 전체에서 .NET Core의 현황과 .NET Framework와의 관계에 대해 소개했습니다(원본 링크). 이번 기사에서는 .NET Core 프레임워크의 구성과 각 모듈의 주요 기능을 자세히 소개하겠습니다. , 크로스 플랫폼을 달성하는 방법.

.NET Core 구성 시스템의 상세 분석(그림)

위 그림은 .NET Core의 시스템 구조를 설명합니다. 최상위 계층은 ASP.NET Core(웹 앱을 만드는 데 사용) 및 UWP(생성하는 데 사용)를 포함하여 UI 기반 응용 프로그램을 개발하기 위한 프레임워크인 응용 프로그램 계층입니다. Windows 10 앱).

중간 계층은 .NET 표준 라이브러리를 구현하고 파일, 네트워크 등의 일반적인 시스템 수준 작업을 포함하는 공용 라이브러리(CoreFX)입니다.

CoreFx에는 런타임 환경이 있습니다. .NET Core에는 두 가지 런타임(CoreCLR, CoreRT)이 포함되어 있습니다. CoreCLR은 크로스 플랫폼 오픈 소스 컴파일러 RyuJIT를 사용하는 JIT(Just In Time Compiler) 기반 런타임이고 CoreRT는 이를 사용하는 런타임입니다. AOT(Ahead-of-Time 컴파일러)는 RyuJIT를 사용하여 AOT 컴파일을 구현하거나 다른 AOT 컴파일러를 사용할 수 있습니다. AOT는 IL을 미리 기계어 코드로 컴파일하므로 모바일 장치의 시작 속도와 에너지 절약 효과도 향상됩니다.

마지막으로 오픈 소스 크로스 플랫폼 소스 코드 컴파일러인 Roslyn에 대해 언급하고 싶습니다. 지금까지의 두 컴파일러와는 다릅니다. JIT 및 AOT 컴파일러는 주로 IL을 네이티브 기계 코드로 컴파일하는 데 사용되는 반면 Roslyn은 C# 또는 VB.NET 코드는 프로그램 중간 언어(IL)로 컴파일됩니다.

로슬린 컴파일러

Roslyn 컴파일러는 C# 또는 VB.NET 코드를 어셈블리(어셈블리)로 컴파일하는 데 사용됩니다. 해당 컴파일 프로세스는 총 4단계로 구성된 파이프라인 형식의 프로세스입니다. 구체적인 프로세스는 아래 그림과 같습니다.

compiler pipeline

A. 파서(분석)

문법에 따라 소스 코드를 구문 분석합니다.

나. 선언

코드에 대한 메타데이터(메타데이터)를 생성합니다. 메타데이터는 현재 코드에 정의된 데이터 유형 및 멤버를 설명하고 참조된 유형 및 멤버도 설명하는 데이터 테이블의 모음입니다.

C.바인드

생성된 IL 코드를 이를 설명하는 메타데이터와 바인딩하여 관리되는 모듈을 생성합니다.

D. 방출(생성)

하나 이상의 관리 모듈을 결합하여 어셈블리를 생성합니다.

RyuJIT 컴파일러

프로그램이 실행되는 동안 특정 메서드를 실행해야 하는 경우 컴파일된 IL을 먼저 로컬 기계어 코드로 변환해야 하며 이 작업은 RyuJIT에 넘겨집니다. 최초로 AMD64 아키텍처를 구현한 차세대 JIT 컴파일러입니다. RyuJIT는 JIT64(이전 세대 컴파일러)보다 빠르게 코드를 생성하여 프로그램 실행 효율성을 향상시킬 수 있습니다.

CoreCLR 및 CoreRT

.NET Core 런타임(CoreCLR) 및 .NET Core 런타임(CoreRT)은 모두 .NET Core 런타임(런타임)입니다. 이들은 .NET Framework CLR(메모리 관리, 어셈블리 로딩, 보안, 예외, 스레드 관리, 등)은 모든 런타임 지향 언어에서 사용할 수 있습니다.

CoreRT와 CoreCLR의 차이점은 CoreRT는 .NET Core 프로그램을 네이티브 코드로 컴파일하고 .NET 런타임에 의존하지 않고 호스트 시스템에서 실행할 수 있는 AOT 메커니즘 세트를 제공한다는 것입니다. 또한 GC 등 두 런타임의 기능 코드 대부분이 공유됩니다. AOT 최적화는 많은 이점을 제공합니다.

  • 컴파일 후 CoreRT를 포함한 모든 종속성이 포함된 단일 파일이 생성됩니다. 프레임워크를 설치할 필요가 없습니다

  • 시작 시 기계어 코드입니다. 기계어를 생성하거나 JIT 컴파일러를 로드할 필요가 없습니다.

  • LLLILC, IL에서 CPP를 포함한 다른 최적화 컴파일러를 사용할 수 있습니다

CoreRT에는 기계 코드를 생성하는 두 가지 방법이 있습니다. 첫 번째는 IL을 기계 코드로 직접 컴파일하는 것입니다. 기본적으로 RyuJIT는 IL을 기계 코드로 컴파일하는 AOT 컴파일러 역할을 합니다. 해당 플랫폼의 C++ 컴파일러를 호출하여 최적화하고 기계어 코드로 컴파일합니다.

RyuJIT를 사용하여 기계어 코드로 컴파일

dotnet restore
dotnet build --native --ilcpath <repo_root>\bin
\Product\Windows_NT.x64.Debug\packaging\publish1

C++ 코드 컴파일 및 생성

dotnet restore
dotnet build --native --cpp --ilcpath <repo_root>\bin\Product\Windows_NT.x64.Debug\packaging\
publish1 --cppcompilerflags /MTd</repo_root>

CoreRT에는 단점도 있습니다. 다양한 플랫폼에 대해 한 번만 컴파일해야 하지만 엔지니어가 지원하지 않는 플랫폼에 게시할 수 없습니다(예: 게임은 데스크톱만 지원하고 휴대폰은 지원하지 않음). .

참고: 이 두 이름은 .NET Core RC2 버전에서 사용할 수 없습니다. 공식 성명에 따르면 이 명령은 현재 버전에서 제거되었으며, 최종 상황은 6월 27일 공식 버전이 출시될 때까지 알 수 없습니다. >

CoreFX(.NET 코어 라이브러리)

CoreFX에는 주로 System.Collections, System.IO, System.Xml 등과 같은 여러 공용 라이브러리가 포함되어 있습니다. CoreFX는 .NET Standard Library의 구현이며, .NET Framework 4.6.3도 .NET Standard Library를 기반으로 합니다. 현재 .NET Standard Library 버전 1.6을 기반으로 합니다. 자세한 내용은 아래 표를 참조하세요.

.NET Core 구성 시스템의 상세 분석(그림)

.NET Core 코드 개발, 배포 및 실행 프로세스

.NET Core 구성 시스템의 상세 분석(그림)

위 그림을 보면 JIT를 사용하여 컴파일하는 것과 AOT를 사용하여 소스 코드를 컴파일하고 프로그램을 실행하는 것은 두 가지 다른 프로세스임을 알 수 있습니다.

JIT 컴파일러를 사용하여 프로그램을 배포하는 경우 프로그램을 IL 어셈블리로 패키징하기만 하면 됩니다. 컴파일러는 메서드가 처음 실행되기 전에 IL을 대상 기계어 코드(네이티브 코드)로 컴파일하고 AOT 컴파일을 수행합니다. 컴파일하는 동안 소스 코드를 대상 기계 코드로 직접 컴파일합니다.

AOT는 소스 코드를 기계어 코드로 컴파일하며 다음과 같은 특징을 가지고 있습니다.

  • 리플렉션을 정적 코드로 대체합니다. 예를 들어 값 유형이 ValueType.Equals의 equals 메서드를 재정의하지 않으면 기본적으로 동일한 것으로 판단됩니다. 그런 다음 값을 동일하게 비교합니다. AOT 컴파일에서는 리플렉션을 대체하기 때문에 값만 동일한지 비교할 수 있습니다.

  • 종속 타사 라이브러리와 .NET 라이브러리는 최종 컴파일된 프로그램에 패키지되어 있습니다.

  • 패키지된 프로그램은 주로 가비지 컬렉터를 포함하는 간소화된 버전의 런타임(CoreRT)에서 실행되며 런타임도 앱 파일에 패키징됩니다.

  • 컴파일 중에 리플렉션 코드가 교체되더라도 동적 리플렉션 코드가 발생하면 할 수 있는 일이 없습니다. 런타임에 동적 리플렉션 호출이 발생하면 해당 메타데이터와 구현을 찾을 수 없기 때문에 예외가 발생합니다. 해결책은 사용할 어셈블리를 지정하기 위해 컴파일하기 전에 런타임 지시문 파일을 구성하는 것입니다.

요약

이 섹션에서는 .NET Standard Library를 따르는 여러 가지 새로운 컴파일러와 CoreFX를 포함한 .NET Core의 구조를 소개합니다. 일반적으로 .NET Core는 성능 및 개발 효율성 측면에서 이전 .NET Framework보다 훨씬 뛰어납니다. 핵심은 .NET의 완전한 크로스 플랫폼 기능의 기본 기술 스택을 처음으로 실현하는 것입니다.

.NET Core는 크로스 플랫폼 기능을 기반으로 하며 GUI와 관련된 API를 .NET Core로 이식하지 않았습니다. 따라서 Windows Forms 또는 WPF(Windows Presentation Foundation)는 .NET Core로 이식되지 않았습니다. .NET Core는 콘솔 애플리케이션 및 클래스 라이브러리 유형 프로젝트를 지원합니다.

그러나 Microsoft는 UWP(유니버설 Windows 플랫폼) 개발 플랫폼에서 .NET Core를 사용하고 .NET 네이티브 기술을 사용하여 성능을 네이티브 코드에 매우 가까운 속도로 향상시킵니다.

ASP.NET Core는 콘솔 애플리케이션을 사용하여 호스팅 환경 Kestrel Server를 구동하여 ASP.NET Core 프로그램 실행을 지원합니다.

위 내용은 .NET Core 구성 시스템의 상세 분석(그림)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.