.Net 新一代編譯器 Roslyn 會帶來怎樣的影響?


.Net 新一代編譯器 Roslyn 會帶來怎樣的影響?

Roslyn是微軟創建的一個.NET編譯器平台,該項目於2014年4月3日開源。

最初 C# 語言的編譯器是用 C++ 編寫的,后來微軟推出了一個新的用 C# 自身編寫的編譯器:Roslyn,它屬於自舉編譯器。

.NET Compiler Platform,也被稱為Roslyn

該項目特別包括 C# 的自承載版本和 VB.NET 編譯器(用語言本身編寫的編譯器)。編譯器可通過傳統的命令行程序獲得,但也可作為 API 從 .NET 代碼中本機獲得。Roslyn 公開了用於代碼的句法(詞法)分析、語義分析、CIL 動態編譯和代碼發布等模塊。[注3]

Roslyn最顯着的主要特征包括:

  • C# 和 Visual Basic 語言的編譯器通過 API 作為服務公開。
  • 用於代碼分析、代碼生成和重構的 API。

C#代碼編譯器 Roslyn   附帶的源生成器(Source Generators)。 源生成器是一項 C# 編譯器功能。

 

 

1,NET Framework和.NET Core的結構體系

    a.NET Framework 包含,Windows Form,WPF,ASP.NET

    b.NET Core 包含,UWP,ASP.NET Core

    c.Xamarin,新的.NET還包括第三個部分,即XAMARIN用於構建移動APP,包含iOS、 OS X 、Android等。

    即所謂的.NET三架馬車,下面是最新的.NET生態體系圖:

 

2,.NET Core構成體系

    上面說到.NET的三駕馬車,.NET Framework、.NET Core、XAMARIN,下面主要看一下.NET Core的組成

 

 

 

 如上圖,NET Core 構成體系:

    (1) Runtime    在.NET Core 中有實現兩種RunTime,NativeRuntime 和 CoreCLR。NativeRuntime 將C# 或 VB.net 代碼直接轉換為原生機器碼。而CoreCLR是一個開源的JIT運行時,會將代碼編譯成中間語言(IL)在最終運行時再轉換機器碼。

    (2) Unified BCL    Base Classlibrary即基礎類,例如 FileSystem、Console、XML操作等。

    (3) Windows Store AppModel & ASP.NET Core 1.0    提供開發Windows系統的各種觸屏設備和ASP.NET程序的一組基礎庫。

 

3,.NET Core各個功能模塊

 

 如上圖:

    應用層: .NET Core的系統構成,最上層是應用層,是開發基於UI應用的框架集,包括了ASP.NET Core(用於創建web app),和 UWP(用於創建Windows10 app)。

    中間層:中間層是公共庫(CoreFX):實現了.NET Standard Library ,囊括了常用系統級操作例如(文件、網絡等)。

    在CoreFx下是運行時環境,.NET Core 包含了兩種運行時(CoreCLR、CoreRT),CoreCLR是一種基於即時編譯程序(Just in time compiler,JIT)的運行時,它使用了跨平台開源的編譯器RyuJIT,

    而CoreRT是使用提前編譯器(Ahead of time compiler,AOT)的運行時,它既可以使用RyuJIT來實現AOT編譯也可以使用其他的AOT編譯器。由於AOT提前編譯IL成了機器碼,在移動設備上也具有更好的啟動速度和節能性。

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

    下面介紹這個編譯器。

 

 

 

 4、NET Core的Roslyn 編譯器

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

 

 

 

A. Parser(解析)

    根據語法對源代碼進行解析。

    B. Declaration (聲明)

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

    C. Bind(綁定)

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

    D. Emit(生成)

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

    (2)RyuJIT 編譯器

    在程序運行中需要執行某一個方法,首先需要將已經編譯好的IL轉換本機的機器碼,而這個任務就交給了RyuJIT。它是新一代JIT編譯器,第一次實現了AMD64的架構,RyuJIT能夠比JIT64(上一代編譯器)更快地生成代碼,以提高程    序運行效率(測試詳情鏈接)。

    (3) CoreCLR & CoreRT

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

CoreRT 和 CoreCLR 不同的是,CoreRT 提供了一套AOT 的機制,可以將.NET Core程序編譯成原生代碼,不依賴 .NET 運行時而運行在宿主機器上。

除此之外兩個運行時大部分功能代碼是共享的,比如GC。AOT的優化帶來不少好處:

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

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

    可以使用其他優化編譯器,包括 LLILC ,IL to CPP

    CoreRT有兩個方式生成機器碼,第一個使用是直接編譯IL成機器碼,默認情況下,RyuJIT 作為一個 AOT 編譯器將IL編譯成機器碼,另一個方式是將C#代碼編譯成C++代碼,然后調用對應平台的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

 

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

 

    (4) CoreFX(.NET Core Libraries)

 

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

 

 

 

 5、.NET Core 代碼開發、部署、運行過程

 

 

 

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

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

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

    (1)用靜態代碼替換反射,例如如果一個值類型(value type)沒有重寫 ValueType.Equals 的equals的方法,默認情況判斷相等,會使用反射找到filedinfo以確定type是否相等,然后再比較value是否相等。而在AOT編譯中由於替換了反射因此只能比較value是否相等。

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

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

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

6,總結

    主要介紹了.NET的三駕馬車.NET Framework、.NET Core、Xamarin,.NET Framework是開發基於Windows平台的王者框架,而.NET Core的跨平台特性、開源及靈活的部署機制將是.NET的未來。后面介紹了.NET Core的組成、.NET Core主要功能模塊:應用層、中間層、編譯器。最后簡要介紹了.NET Core的開發、部署、運行流程。

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM