2011-10-21 40 views
94

從上InfoWorld的一個press release昨天關於新Microsoft Roslyn微軟羅斯林與CodeDom中

這種「解構」的最明顯的優勢編譯器是 ,它使整個編譯過程執行要在.Net應用程序中從 調用。 Hejlsberg演示了一個C#程序, 將幾個代碼片段作爲字符串傳遞給C#編譯器;編譯器 將作爲結果的IL彙編代碼作爲對象返回,然後將其傳送到公共語言運行庫(CLR)以供執行。瞧!利用Roslyn,C#獲得了動態語言在運行時生成和調用代碼的能力。

我已經能夠做到這一點,因爲.NET 4與CSharpCodeProvider.CompileAssemblyFromSource釋放我在書面前一段時間所做的正是這一個ASP.Net項目其實使用 - 允許用戶鍵入代碼到一個文本框,選擇要引用的程序集/名稱空間,然後執行並顯示該代碼的輸出以便在Windows Azure上進行實時環境代碼測試。

CodeDom Roslyn的前身的一部分? Roslyn優於CodeDom有什麼特別的好處?

回答

215

免責聲明:我在Roslyn團隊的微軟工作。

CodeDom是Roslyn的前身,但只是略有相關。從本質上講,CodeDom是一種簡單的(略)語言不可知的方式來生成在.NET 1.0中添加的代碼,以支持設計人員(一個WinForms)。由於CodeDom試圖提供一種可以用C#,VB和其他語言生成代碼的統一模型,因此它不支持任何支持的語言的高保真度(這就是爲什麼您無法使用CodeDom創建switch語句的原因)。 CSharpCodeProvider.CompileAssemblyFromSource只是執行csc.exe的一個包裝器。

羅斯林是一個完全不同的動物。它使用託管代碼從頭開始重寫C#和VB編譯器--C#中的C#和VB中的VB(今天發佈的csc.exe和vbc.exe版本均使用本機代碼編寫)。在託管代碼中構建它們的優點是用戶可以將真正的編譯器引用爲.NET應用程序的庫(不需要包裝器)。

構建編譯器管道的每個組成部分,我們已經暴露在頂部的公共API:

  • 分析器 - >語法樹API
  • 符號表/元數據導入 - >符號API
  • 粘結劑 - >結合和流動分析的API
  • IL發射極 - >的Emit API

羅斯林可以用作一個複雜的C#中的nd VB源代碼生成器,但這就是與CodeDom相似的地方。 Roslyn編譯器API可用於解析代碼,執行語義分析,動態編譯和評估代碼等。

除了編譯器之外,Roslyn團隊還在公共編譯器API的頂層上重建Visual Studio C#和VB IDE功能。因此,編譯器API足夠豐富,可以構建Visual Studio設計時工具,如IntelliSense和Extract Method重構。此外,在編譯器之上的層,Roslyn提供更高級的分析或數據轉換服務。例如,可以使用C#和VB格式化規則對代碼進行格式化,或在解決方案中查找對特定符號的所有引用。

真的,不只是其中一個羅斯林超過CodeDom的特殊好處。在CodeDom填補了特定代碼生成需求的地方,Roslyn正在通過提供一個框架來解決整個語言工具空間,使您可以構建任何您可以想到的C#或VB語言工具。

+2

@Dustin:Roslyn會支持其他語言嗎? JavaScript(.NET),例如? – dbarros

+0

@Dustin:這對於構建完整的IDE體驗來說非常完美,它可以強化我的組織中的代碼質量,儘管我沒有看到手動代碼審查的完全替代,但我看到質量顯着提高。不久! –

+0

如果有人已經創建了一個基於Roslyn的工具來將使用CodeDom的代碼轉換爲使用Roslyn的SyntaxFactory的代碼,這將是非常棒的。(部分原因是.Net Core有Roslyn但沒有CodeDom,我使用的是一個lib CodeDom中) – Emyr

40

CodeDom允許您編譯 - 但它不能讓您真正獲取有關代碼本身的信息(編譯器錯誤除外)。基本上,這是一個黑匣子,你說「編譯這個」,它說「我成功了」或「我失敗了,這裏有一些錯誤」。

Roslyn允許您完全檢查並快速構建代碼。這包括能夠查看/檢查源代碼片段中的註釋,關於完整結構的詳細信息等。您可以瀏覽並獲取您傳遞給Roslyn的源代碼的整個語法樹,並進行詳細分析或對其進行轉換。

鑑於豐富的語法信息,您擁有大量額外的控制權和靈活性。例如,這是如何複製C#代碼塊並將其粘貼爲VB.NET代碼的示例工作。使用Roslyn,你可以做的不僅僅是編譯 - 你也可以乾淨地操作代碼。這應該使得很多工具的生成變得簡單得多,因爲重構之類的工作可以非常簡單地完成,因爲工具理解完整的語法,包括元信息(如評論),並且可以直接使用它。

6

羅斯林使得整個過程非常非常精細的控制 - 例如,你可以分析字符串,甚至產生額外的代碼(編譯過程中分析的基礎上對即時)等

的CodeDOM是「只是使用編譯器」,而Roslyn是「編譯器作爲一個服務,可以完全訪問(子)部分」......你在「編譯器內部」可以看到代碼看起來像什麼,允許Roslyn你以目前不可能的方式改變事物。例如,您可以使用Roslyn擴展C# - 這非常方便,並且比AOP實現的當前狀態要好得多。

對於當前羅斯林狀態的概述,以及不同級別的訪問和控制它提供,請參閱http://msdn.microsoft.com/en-us/hh500769

UPDATE

微軟只是提供額外的功能和大量的API的一個新的CTP修改/添加。詳情請參閱here

+1

事實上,你可以使用Roslyn來擴展C#和其他關鍵字。 –

+0

謝謝...更正...雖然不是在第一個版本中,我很漂亮,這將是可能的... – Yahia

+2

@DustinCampbell,如果你處理任何編譯器錯誤,由生成代碼引起的僞關鍵字? –

9

我看到了一個很大的區別:使用CodeDom,每次編譯一些C#或VB.NET時,都會發生處理過程。 CSC.exe或VBC.exe是幕後真正的工作者。

如果你想在體系結構,可伸縮性,隔離等方面構建一個服務(你提到Azure),這不是很好。

隨着Roslyn它的進行。

我想這是他們稱之爲「編譯器即服務」的原因之一。另外,CodeDom是一個相對較差的API,缺少很多功能,並且不是最新的,因爲它主要是爲支持Visual Studio UI設計器自動生成代碼而設計的。我認爲Roslyn會做得更好,因爲它是由編寫編譯器的人編寫的。我希望這會有所作爲。

PS:與CSC.exe和VBC.exe有一個顯着的區別:Roslyn似乎是純.NET(並且使用CCI)。