初步了解 .NET 2015

感謝成功大學資訊工程研究所陳顥文同學協助翻譯微軟公司資深高階主管 Bath Messi 於 2015/2/25 發表的文章:

Understanding .NET 2015

文中主要提示了即將發佈的 .NET 2015 在各種角度上的改變,包括對各平台的支援、走向開放等等。

在進入本文之前,她的結論提到身為多年的微軟人,親身經歷 .NET 走向開源的過程及感想,說出了許多人,尤其是長期關注微軟技術者的心聲,在此轉述如下:

對微軟來說,開放原始碼並不是新的舉動,但對 .NET Runtime 函式庫卻是。這對一個超過 15 年的老專案是個非常重大的決定,對許多內部的員工來說,這開放的不是單單只有程式碼而已,而是將整個工程都開放出去。改變是需要時間的。所以這是為甚麼 .NET 小組剛開始只能釋出一小部分的物件函式庫。我們在未來需要有更長更遠的路要走。從決定開放也至於現今的成果,可以讓我們這個團隊學到這些舉動激起的漣漪、以及產生的貢獻,這些都讓我們自嘆不如。”

.NET 2015 – 主要架構

clip_image002

其中,針對 .NET Core 有以下三個主要的投資及改變:

1. .NET Innovation-微軟已將許多語言的編譯器重新設計、改良,以符合新一代開發者的需求,包括底層物件函式庫 (BCL: Base Class Libraries)、應用程式模型(App Models)、執行階段 (Runtimes) 及相關工具。

2. Open Source (開放原始碼)-微軟已將開發流程透過開源社群公開,也透過開源社群得到進一步的支援及協助,經由這樣與全世界開發者間的互動,一起培育 .NET 的生態系統。

3. Cross Platform (跨平台)-使用者的執行平台及環境越來越多樣,有鑑於此,讓 .NET 跨平台相容至 Linux, Mac 等平台上當然也是必需的。

.NET 2015 的主要元件
Frameworks and Runtimes

.NET Framework 持續提供一個受控管的執行環境,於其上提供各種服務讓應用程式使用。.NET Framework 主要由兩個元件組成:其一是通用語言執行庫 (CLR),CLR掌管並且提供應用程式的執行引擎;另一個元件是 .NET Framework 物件函式庫,是一組穩定且可重複使用使用的現成程式庫,讓他們能夠在自己的應用程式中呼叫使用。

.NET Framework 4.6 建立於 4.5.2 版之上,加入了許多新的 API,並且強化了事件追蹤 (Event tracing) 並修復了許多的Bug,這將會是下一個完整的.NET Framework! .NET Framework 4.6 也將會包含於 Windows 10 之中。先前的作業系統也可以透過 Windows Update 來取得最新的.NET Framework! (Vista 含以上的版本)

更多有關於.NET Framework 4.6的詳細資訊參考 .NET Framework 2015 Preview

.NET Core 5 是一個提供多種功能、模組化的設計框架 (framework),能在橫跨多種平台的環境中使用,且為開放原始碼,將會支援Windows、Linux、Mac OSX。.NET Core 5 的內部架構包含底層物件函式庫 (corefx) 以及 Rutime (coreclr),包括 JIT 編譯器 (RyuJIT),.NET 回收機制 (GC),原生語言互通性 (Native Interop),以及其他.NET Rumtime 元件。

.NET Core 5 目前可運行在 Windows 上面,微軟也即將加入 Linux 以及 Mac 支援,讓 .NET 的主要元件能運行在這兩個平台上。

更多有關於 .NET Core 的詳細資訊請參考 Introducing .NET Core 以及 CoreCLR is now Open Source.

如果以上兩個詳細資訊您只想選一個來看,那我會推薦看 Introducing .NET Core ,這會讓您瞭解為何我們需要 .NET Core, 以及適合在那裡使用。

Compilers ( 編譯器)

.NET 編譯器平台 (“Roslyn”) 提供開放原始碼 C# 以及 Visual Basic 的編譯器,並提供豐富的程式碼分析以及 API、並提供了程式碼分析工具。

為 .NET 2015 量身打造的 Roslyn,其平台與核心、框架皆使用獨立的中繼語言(IL) 所完成。在 .NET 2015 釋出之時,整個 .NET Framework 將都會是由 Roslyn 所編譯完成的。除此之中,在 C#、VB 甚至 F# 語言本身都將有重大的革新。

Roslyn 的專案已開放原始碼放置在 Roslyn on GitHub

“RyuJIT” 是 .NET 在 64 位元平台上的全新預設 JUST-IN-TIME(JIT) 編譯器。於執行期間,JIT編譯器將使用中繼語言 (IL),即時編譯於目標機器中執行。

在桌上型電腦以及伺服器的執行情境裡,RyuJIT 更新了先前 64 位元的 JIT 編譯器,顯著減少了啟動所花費的時間。RyuJIT 也支援 SIMD (單指令流多資料流, Single Instruction, Multiple Data),這代表能夠同時平行執行大量的數學運算。將讓使用到向量運算的應用程式得到顯著的效能提升!

更多關於下一代 JIT 編譯器的訊息,請參考 The next-generation JIT compiler for .NET

.NET Native 將 C# 直接編譯為為原生機器碼,如同 C++ 一樣。亦即,開發者能夠在享受 .NET Framework 高生產力的同時,還能得到優異的執行效能。一般情形下,.NET 所編譯的應用程式會先被轉換成中繼語言 (IL),在執行時期再透過JUST-IN-TIME(JIT) 編譯器將中繼語言 (IL) 轉換成原生機器碼。

而 .NET Native 則是一種提前編譯器 (ahead-of-time compiler),會先把應用程式直接編譯成原生程式碼,並且包含最小的通用語言執行庫 Runtime (CLR Runtime) 以降低套件大小。如此一來,能讓使用 .NET Native 編譯的 Windows Store Apps 再啟動的速度加快 60%,並且減少 15~20% 的記憶體。Universal Windows apps 都將會運行在 .NET Native 上(包括 ARM, X86, X64 的 CPU 架構)

有關於 App 使用 .NET Native 編譯的詳細資訊參考Compiling Apps with .NET Native.

App Models

在 .NET Framework 4.6 以及 .NET Core 5 中,延伸了先前的通用函式庫以及應用程式模型,例如 Windows Forms、WPF、ASP.NET Web Forms、MVC 5 等等。您所熟悉的應用程式模型在 .NET Framework 中將會加入許多新功能,能夠與全新的程式語言和 Roslyn 編譯器、RyuJIT 作完美的整合。在 .NET 4.6 中新增了許多有趣的東西! 請參考 ASP.NET Overview – What about Web Forms?The Roadmap for WPF.NET Framework 2015 Preview.

附帶一提,新的應用程式模型也為 .NET Core 5 做了設計的優化。

ASP.NET 5 使用現代的 .NET 應用程式模型來設計 Web 應用程式。透過已優化的開發框架打造雲端或者本地端的網頁應用程式。透過 ASP.NET 5 模組化的元件以最小的資源耗費打造出有彈性的專案,ASP.NET 5 可以運行於 .NET Framework 4.6 或者 .NET Core 5 之上。現在 ASP.NET 5 已可以透過 Mono runtime 執行在 Linux 以及 Mac 上面。

從 .NET Core 開始支援 Linux 以及 Mac 後,ASP.NET 5 將會計畫透過 .NET Core在這些平台運行。

關於ASP.NET5 的詳細內容可以參考ASP.NET 5 Overview以及Introducing ASP.NET 5

Universal Windows App (通用型應用程式) 是一個能夠讓您在 Windows Phone 及 Windows apps 上互相共用程式碼,並能部署到 Windows Store 的一個應用程式模型。通用型應用程式將會以 .NET Native 運行,將中繼語言編譯成原生機器碼,並包含執行所需要最小的通用函式庫`。

更多關於 Universal Windows App 以及如何使用 .NET Native 開發可以參考Building universal Windows apps for all Windows devices 以及 Getting Started with .NET Native

讓我們再複習一下.NET Core

.NET Core 5 是一個泛用途、模組化,且因為重構並使用底層物件函式庫(corefx)以及Rutime(coreclr),因此具備跨平台特性的 Framework。

.NET Core 在不同的應用程式模型使用相同的底層物件函式庫(BCL),或許這些 API 看起來不太一樣,但其實它們分享同一種實作方式。大部分的 API 都擁有高度模組化且易於重構、並獨立於作業系統的平台之外的特性。

clip_image004

.NET Core 的開發之路
我想在學習新的技術時,有個心智圖會比較好理解這些東西將會怎麼運作。

下圖是當您在使用 .NET Core 開發應用程式時的簡化圖。從撰寫程式碼/建置/除錯的循環,及至於部署並執行的過程。請注意在部署執行階段,會根據最後的執行平台,以不同的應用程式模組去編譯您的程式。

clip_image006

在您撰寫程式碼中,會參照許多位於底層物件函式庫 (BCL) 內的參考。Roslyn 編譯器會將您的程式碼轉換成獨立於平台的中繼語言 (IL)。除此之外,編譯器擁有豐富的 API,讓您能夠做各式各樣的程式碼分析工作。如果您正在使用Visual Studio,將會有許多的新功能應用這些 API,讓您在撰寫程式的過程中更有效率。

如果您正在打造通用型 Windows 應用程式,可以利用 .NET Native tool chain將 您的程式建置為原生碼,且包含執行最小需求的通用函式庫。

而如果您在開發 ASP.NET 5 ,將可參照使用您部署伺服器端的 CoreCLR,同時利用 JIT 彙整程式碼後,由 RyuJIT 建置。

另外一提,ASP.NET 5 允許您在執行階段更改並儲存程式碼,之後只要重整您的瀏覽器而不需要在執行重新建置。Visual Studio 使用 Roslyn 的動態編譯,讓您擁有強大的開發框架,更能提供您更流暢更像直譯式語言的開發。

附記:如果您要使用 .NET Framework 4.6 為建置的目標,您仍然能夠使用這些全新的功能以及 Roslyn 編譯器。應用程式部署將不會因為目標改變而有變化,這必須要依賴於您編譯該應用程序系統的 Framework 版本。但在執行階段則會使用JIT彙整並且編譯利用 RyuJIT 執行。

到底有哪些開放了?

在 .NET 2015 底下,有許多部份是開放原始碼且由 .NET Foundation 管理。我們正在將這些專案一一的開放給開源社群們使用。

clip_image008

您可以在 .NET Foundation 的 GitHub 上面看到所有可供使用的開源專案: https://dotnet.github.io/

以下有幾個不錯的代碼庫,能夠透過以下連結來得到不同專案的原始碼及專案檔:

值得一提的是,完整的 .NET Framework 是 ”source open”,這代表我們不是全然的將程式碼開放並且也不是全然的遵守 OSI 授權 (譯註:OSI 為 Open Source License),但您仍然可以瀏覽所有的原始碼: https://referencesource.microsoft.com/

敞開心胸

對微軟來說,開放原始碼並不是新的舉動,但對 .NET Runtime & 函式庫卻是。這對一個超過 15 年的老專案是個非常重大的決定,對許多內部的員工來說,這開放的不是單單只有程式碼而已,而是將整個工程都開放出去。改變是需要時間的。所以這是為甚麼 .NET 小組剛開始只能釋出一小部分的物件函式庫。我們在未來需要有更長更遠的路要走。從決定開放也至於現今的成果,可以讓我們這個團隊學到這些舉動激起的漣漪、以及產生的貢獻,這些都讓我們自嘆不如。

您或許會問自己,「我沒有足夠的時間打造我自己的應用程式,但至少我還能寫一點 code 來貢獻 CLR!」。您的想法沒錯,我們將會與您一起努力,您可以自由選擇您要用甚麼方式來參與我們,您也可以不成為寫程式碼的貢獻者,可以選整理問題提供一些您的意見、或者回答問題,或者只是到處看看社群努力的成果

您又或許會想「我不想要失去簡單好用以及有一定品質的 .NET Framework…」,別擔心!我們的等級跟品質還有服務會跟以前一樣好,我們所做的只是單純開放我們的工程成果。純粹將先前我們所在內部做開放,同時也會保持我們軟體上面的品質。

我對 .NET 以及 .NET 小組迎接的新文化感到興奮!