九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項超值服

開通VIP
簡析.NET Core 構(gòu)成體系


來源:帥蟲哥

鏈接:http://www.cnblogs.com/vipyoumay/p/5613373.html


本文將詳細(xì)介紹.NET Core 框架的構(gòu)成和各模塊主要功能,以及如何實現(xiàn)跨平臺。



上圖描述了 .NET Core的系統(tǒng)構(gòu)成,最上層是應(yīng)用層,是開發(fā)基于UI應(yīng)用的框架集,包括了ASP.NET Core(用于創(chuàng)建web app),和 UWP(用于創(chuàng)建Windows10 app)。


中間層是公共庫(CoreFX),實現(xiàn)了.NET Standard Library ,囊括了常用系統(tǒng)級操作例如(文件、網(wǎng)絡(luò)等)。


在CoreFx下是運(yùn)行時環(huán)境,.NET Core 包含了兩種運(yùn)行時(CoreCLR、CoreRT),CoreCLR是一種基于即時編譯程序(Just in time compiler,JIT)的運(yùn)行時,它使用了跨平臺開源的編譯器RyuJIT,而CoreRT是使用提前編譯器(Ahead of time compiler,AOT)的運(yùn)行時,它既可以使用RyuJIT來實現(xiàn)AOT編譯也可以使用其他的AOT編譯器。由于AOT提前編譯IL成了機(jī)器碼,在移動設(shè)備上也具有更好的啟動速度和節(jié)能性。


最后還要提到一個開源的跨平臺源代碼編譯器Roslyn,它有別于剛才兩個編譯器,JIT和AOT編譯器主要用于將IL編譯成本機(jī)機(jī)器碼,而Roslyn是將C# 或 VB.NET 代碼編譯成程序中間語言(intermediate language,IL)。


Roslyn 編譯器


Roslyn編譯器用于將C#或VB.NET代碼編譯為程序集(assembly),它的編譯過程是一個管道式的處理過程一共包含4個步驟,具體過程見下圖。



A. Parser(解析)


根據(jù)語法對源代碼進(jìn)行解析。


B. Declaration (聲明)


為代碼生成元數(shù)據(jù)(metadata),元數(shù)據(jù)是一個數(shù)據(jù)表的集合,描述了在當(dāng)前代碼中定義的數(shù)據(jù)類型和成員,同時也描述了引用的類型及成員。


C. Bind(綁定)


將生成的IL代碼與描述它的元數(shù)據(jù)綁定在一起,生成托管模塊(managed module)。


D. Emit(生成)


將一個或多個托管模塊合并生成程序集(assembly)。


RyuJIT 編譯器


在程序運(yùn)行中需要執(zhí)行某一個方法,首先需要將已經(jīng)編譯好的IL轉(zhuǎn)換本機(jī)的機(jī)器碼,而這個任務(wù)就交給了RyuJIT。它是新一代JIT編譯器,第一次實現(xiàn)了AMD64的架構(gòu),RyuJIT能夠比JIT64(上一代編譯器)更快地生成代碼,以提高程序運(yùn)行效率。


CoreCLR & CoreRT


CoreCLR 和 CoreRT 都是.NET Core的運(yùn)行時(Runtime),
它們提供了與.NET Framework CLR 類似的核心功能(內(nèi)存管理、程序集加載、安全性、異常、線程管理等),可由面向于運(yùn)行時的所有語言使用。


CoreRT 和 CoreCLR 不同的是,CoreRT 提供了一套
AOT 的機(jī)制,可以將.NET Core程序編譯成原生代碼,不依賴 .NET 運(yùn)行時而運(yùn)行在宿主機(jī)器上。除此之外兩個運(yùn)行時大部分功能代碼是共享的,比如GC。


AOT的優(yōu)化帶來不少好處:


編譯后生成一個單文件,包含所有的依賴,包括 CoreRT,無需安裝Framework


啟動時是機(jī)器碼,不需要生成機(jī)器碼,也不要加載JIT編譯器


可以使用其他優(yōu)化編譯器,包括 LLILC ,IL to CPP


CoreRT有兩個方式生成機(jī)器碼,第一個使用是直接編譯IL成機(jī)器碼,默認(rèn)情況下,RyuJIT 作為一個 AOT 編譯器將IL編譯成機(jī)器碼,另一個方式是將C#代碼編譯成C++代碼,然后調(diào)用對應(yīng)平臺的C++編譯器優(yōu)化編譯成機(jī)器碼。


使用 RyuJIT 編譯成機(jī)器碼


dotnet restoredotnet build --native --ilcpath \bin\Product\Windows_NT.x64.Debug\packaging\publish1


編譯生成 C++ 代碼


dotnet restoredotnet build --native --cpp --ilcpath \bin\Product\Windows_NT.x64.Debug\packaging\publish1 --cppcompilerflags /MTd


CoreRT也有不足之處,它需要為不同平臺編譯一次;但凡事有但是,它允許工程師可以不發(fā)布到不想支持的平臺(比如某游戲僅支持桌面,不支持手機(jī))。


注:這兩個命名在.NET Core RC2 版本中均無法使用,按照官方說法是在當(dāng)前版本中已經(jīng)移除這個命令了,具體等6月27日正式版發(fā)出后才知道最后的情況

CoreFX(.NET Core Libraries)


CoreFX主要包含數(shù)個公共庫,例如 System.Collections, System.IO, System.Xml等。CoreFX是 .NET Standard Library 的實現(xiàn),同樣的.NET Framework 4.6.3也是基于.NET Standard Library的實現(xiàn)。它們目前都是基于.NET Standard Library1.6版本,具體見下表:



.NET Core 代碼開發(fā)、部署、運(yùn)行過程



從上圖可以看到使用JIT編譯和使用AOT編譯源代碼并運(yùn)行程序是兩種不同的流程。


如果使用JIT編譯器部署程序時只需要將程序打包為IL的assemblies,在方法第一次執(zhí)行前編譯器將IL編譯為目標(biāo)機(jī)機(jī)器碼(Native code),而AOT編譯會在編譯時將源代碼直接編譯為目標(biāo)機(jī)機(jī)器碼。


AOT將源代碼編譯為機(jī)器碼,擁有如下特性:


用靜態(tài)代碼替換反射,例如如果一個值類型(value type)沒有重寫 


ValueType.Equals 的equals的方法,默認(rèn)情況判斷相等,會使用反射找到filedinfo以確定type是否相等,然后再比較value是否相等。而在AOT編譯中由于替換了反射因此只能比較value是否相等。


依賴的第三方類庫以及.NET Libraries均打包至最終編譯的程序中。


打包后的程序運(yùn)行在一個精簡版的運(yùn)行時上(CoreRT)主要包含垃圾回收器,而運(yùn)行時也會打包在app文件中。


雖然編譯時會替換反射代碼,但遇動態(tài)反射代碼無能為力,運(yùn)行時若遇動態(tài)反射調(diào)用則會因找不到對應(yīng)的元數(shù)據(jù)及實現(xiàn)而拋出異常。解決辦法是編譯前配置運(yùn)行時指令文件(Runtime directive file)指定需要用到的程序集。


總結(jié)


本節(jié)介紹了.NET Core的構(gòu)成體系,包括新增的多個編譯器以及遵循.NET Standard Library的CoreFX,總體來說.NET Core較之前的.NET Framework 從性能和開發(fā)效率上都有很大的提升。關(guān)鍵是首次實現(xiàn)了.NET的完全跨平臺能力的基礎(chǔ)技術(shù)棧。


.NET Core 基于跨平臺能力,并沒有將與 GUI 高度相關(guān)的 API 移植到 .NET Core 內(nèi),因此像是 Windows Forms 或是 Windows Presentation Foundation (WPF) 并未移植到 .NET Core。.NET Core 支持控制臺應(yīng)用程序 (Console Application) 以及類庫 (Class Library) 類型的項目。


不過微軟在其 Universal Windows Platform (UWP) 開發(fā)平臺使用了 .NET Core,并且利用 .NET Native 技術(shù)將其性能提升至十分接近原生碼的速度。

ASP.NET Core 則以控制臺應(yīng)用程序驅(qū)動其托管環(huán)境 Kestrel Server 以支持 ASP.NET Core 程序的運(yùn)行。


參考鏈接


【1】

https://github.com/dotnet/corefx/blob/master/Documentation/architecture/net-platform-standard.md


【2】https://github.com/dotnet/corefx


【3】https://github.com/dotnet/corefx/blob/master/Documentation/project-docs/glossary.md


【4】https://www.microsoft.com/net/core#windows


【5】https://msdn.microsoft.com/en-us/library/dn807190(v=vs.110).aspx


【6】https://blogs.msdn.microsoft.com/dotnet/2013/09/30/ryujit-the-next-generation-jit-compiler-for-net/


【7】https://zh.wikipedia.org/wiki/.NET_Core


本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
.net core
精彩 .NET 2015
Java三種編譯方式: 前端編譯 JIT編譯 AOT編譯
誰偷了我的熱更新?Mono,JIT,IOS
解讀 | 華為方舟編譯器是如何實現(xiàn) Android 性能革命的? | 雷鋒網(wǎng)
華為 P30 Pro 順暢體驗背后的秘密:一文看懂 EMUI 9.1 兩大核心優(yōu)化
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服