The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

關於 Roslyn 與 CodeDOM 的差別

最近由於開始動手研究 Visual Studio 2015C# 6.0Roslyn 架構,也寫了幾篇文章分享,由於我的一個好友 Lex Li 分享了一篇在 Stack Overflow 上的一篇文章,覺得講的蠻清楚的,因此特別翻譯這篇文章

以下是 .net - Microsoft Roslyn vs. CodeDom - Stack Overflow 這篇文章權威回答的內容翻譯:

CodeDOM 是 Roslyn 的前身,但這兩者之間只有些微相關。基本上,CodeDOM 是一套簡單且與程式語言無關的方式產生程式碼,這是從 .NET 1.0 加入的一個功能,主要為了幫助 Visual Studio 的設計工具產生相對應的 C# 或 VB 程式碼。由於 CodeDOM 嘗試提供一個產生 C# 或 VB 或其他程式語言程式碼的通用模型,所以他必須符合各語言之間都通用的語言特性,因此使用 CodeDOM 產生的程式碼通常會失真(例如你無法透過 CodeDOM 產生 switch 語法)。而 CSharpCodeProvider.CompileAssemblyFromSource 也只是一個 csc.exe 的封裝而已,程式碼實際上還是透過 csc.exe 程式進行編譯的。

Roslyn 則是完全另一件事。他是一個特別為 C# 與 VB 個別從頭打造的編譯器,且完全用 Managed Code 撰寫而成。也就是 C# 編譯器是用 C# 寫的,VB 編譯器用 VB 寫的。在 Roslyn 之前的編譯器(csc.exe 或 vbc.exe)都是用原生碼(native code)寫成的。使用 Managed Code 打造編譯器的優點是,使用者可以將 Roslyn 函式庫直接加入參考到專案之中,且完全沒有其他原生函式庫的相依性。

打造編譯器管線的每個元件時,我們在最上層揭露了幾個公開的 APIs:

  • Parser                          -> Syntax Tree API
  • Symbol Table/Metadata Import    -> Symbol API
  • Binder                          -> Binding and Flow Analysis APIs
  • IL Emitter                      -> Emit API

Compiler pipeline APIs

Roslyn 可以當成複雜的 C# 與 VB 的程式碼產生器,只有這件事跟 CodeDOM 很像,但可以產生的程式碼是更加精準的,沒有任何限制。Roslyn 編譯器的 APIs 可以用來解析程式碼、執行語意分析、編譯程式碼、動態執行任何程式碼。

除了編譯器之外,Roslyn 團隊也基於這些公開的編譯器 APIs 對 Visual Studio 2015 重新打造對 C# 與 VB 的功能支援。因此,這些編譯器的 APIs 已經足以支持 Visual Studio 建構一個完整的設計時期工具支援,像是 IntelliSense、擷取方法(Extract Method)等程式碼重構功能都可以辦到。同時,在編譯器這層之上,Roslyn 也提供了更高階的分析服務或數據轉換等功能。例如有服務可以提供基於 C# 與 VB 樣式規則而進行格式化程式碼的功能,或是在方案中依據特定符號(Symbol)尋找所有參考(Find All Reference)等功能。

說真的,這並不是用 Roslyn 替換 CodeDOM 的唯一效益,想當年 CodeDOM 解決了產生程式碼的特定需求,現今的 Roslyn 則是透過一個框架,解決了整個程式語言工具領域的需求,只要你想在開發工具上添加任何針對 C# 或 VB 的相關功能,你能想到的 Roslyn 通通辦的到。

 

以下有些相關連結,可供大家進一步了解 Roslyn 的相關知識。

 

相關連結