微软是如何使用 C# 重写 C# 编译器并将其开源的
Roslyn 是 C# 和 Visual Basic.NET 開源編譯器的代號。這篇文章將介紹它是如何從微軟過去的十年至暗時刻走出來,成為開源跨平臺的 C# 和 VB 公共語言引擎。
我于 2005 年加入微軟,也就是在.NET?2.0 發(fā)布之前,當(dāng)時微軟內(nèi)部已經(jīng)開始在討論 Roslyn 項目,這個項目是關(guān)于使用 C# 重寫 C# 編譯器。這對于一門編程語言來說是一件很正常的事情,證明語言已經(jīng)開始成熟。但我們的動機(jī)則更為實際:作為 C# 的創(chuàng)建者,我們并沒有使用 C# 編程,而是用 C++!
要重寫一個用戶已經(jīng)使用了好幾年的編譯器,關(guān)鍵問題在于用戶會希望新編譯器的行為方式與舊編譯器完全相同。為 C# 開發(fā)新的編譯器意味著需要匹配舊編譯器的缺陷。我說的不只是已知的缺陷,也包括那些未知的缺陷,以及開發(fā)人員已經(jīng)發(fā)現(xiàn)并嚴(yán)重依賴的無意識行為,這些通常是在不知情的情況下發(fā)生的。
多年來,這些挑戰(zhàn)導(dǎo)致我們無法開始這個項目。
雖然使用 C# 編寫新的 C# 編譯器會給語言團(tuán)隊本身帶來很多好處,但這樣能給用戶也帶來價值嗎?新編譯器如何給現(xiàn)有的用戶帶來幫助?也許唯一關(guān)心是否使用 C# 編寫 C# 編譯器的人就是編譯器開發(fā)團(tuán)隊本身。
但與此同時,我們面臨著另一個越來越嚴(yán)重的問題:基于 C# 的不同工具之間的存在大量的重復(fù)性工作。除了編譯器,我們的姐妹團(tuán)隊在為 Visual Studio 提供 C# IDE 支持,他們必須通過編寫大量的代碼(他們當(dāng)時主要也是在用 C++)來理解 C# 的語法和語義。
除此之外,還有很多來自微軟和其他公司的工具,如 StyleCop、CodeRush,等等。這些工具都需要實現(xiàn)與 C# 源代碼文本相關(guān)且對用戶來說有意義的功能,并且都存在一些微妙的錯誤。它們對一些概念的理解處于不同的水平上,而且需要做出不同的折中和權(quán)衡。所有人都需要花費(fèi)大量的精力來理解代碼。
最后,我們提出了我們的價值主張:我們只需要一個 C# 代碼庫,并把它共享給任何一個想要基于代碼庫構(gòu)建工具的人!可用工具的增加將給用戶帶來價值,特別是現(xiàn)有工具質(zhì)量的提升。我們將語言正確性和性能方面的需求集中在同一個代碼庫上,并努力提升質(zhì)量以及添加大量的功能。我們將會構(gòu)建出一個語言引擎!這將為 C# 代碼提供統(tǒng)一的公共 API:我們將重新定義“編譯器”的含義。
當(dāng)然,既然你在為 C# 社區(qū)構(gòu)建 API,它就應(yīng)該是使用 C#實現(xiàn)的.NET?API。因此,使用 C#“引導(dǎo)”C# 的老想法借助這個機(jī)會得到了實現(xiàn)。
可以說,Roslyn 的誕生就是始于這種開放的心態(tài):向世界開放 C# 語言的內(nèi)部開發(fā)工作。在微軟的封閉文化中,這本身就是一個大膽的主張:我們會免費(fèi)分享這個知識產(chǎn)權(quán)嗎?我們會助力那些工具開發(fā)商更好地與我們展開競爭嗎?
我們希望增強(qiáng)生態(tài)系統(tǒng)并成為世界上最好的工具語言的想法最終贏得了勝利。我們想要的是 C# 和.NET 的長期增長,而不是為了短期變現(xiàn)和保護(hù)微軟資產(chǎn)。因此,雖然說不上是開源,承擔(dān) Roslyn 項目的成本和風(fēng)險對于微軟來說也是一個重大的抉擇。
當(dāng)然,你不一定只是構(gòu)建這些東西。Roslyn 有著雄心勃勃的愿景,充滿了技術(shù)挑戰(zhàn),我們花了五年時間才實現(xiàn)。
在我們構(gòu)建初始版本時,Roslyn 仍然是一個閉源項目。從 2009 年項目啟動以來,我們一直希望我們的編譯器是開源的,但微軟還沒有為開源做好準(zhǔn)備。開發(fā)私有代碼并提交專利的文化代表了微軟自 20 世紀(jì) 70 年代以來的工作方式——雖然變革已經(jīng)在悄然發(fā)生,但速度比我們團(tuán)隊所希望的要慢。
事實上,曾經(jīng)有一段時間,我們感覺公司正朝著完全相反的方向發(fā)展。
Windows 8 項目幾乎占據(jù)了整個公司的資源。因為采用了新的編程模型,其觸角已經(jīng)觸及到開發(fā)者工具和語言團(tuán)隊的內(nèi)部,所有的東西都被極端地保護(hù)起來,而且不僅僅針對外部,甚至也針對公司內(nèi)部。例如,我們當(dāng)時開發(fā)的異步功能融合到 Windows 8 的編程模型中,我甚至不敢在內(nèi)部發(fā)表設(shè)計說明,因為擔(dān)心會意外泄漏有關(guān) Windows 8 的信息讓自己陷入麻煩之中!這給創(chuàng)新造成了一個糟糕的環(huán)境,對于我們開放 C# 編譯器的愿望來說,這當(dāng)然不是什么好兆頭。
最終,在 Windows 8 步入正軌之后,微軟開始轉(zhuǎn)型并找到了新的方向。它的核心理念變得與原來完全不一樣了,也就是我們今天所知道的微軟。開源運(yùn)動現(xiàn)在開始在微軟內(nèi)部占據(jù)一席之地。
F# 已于 2010 年發(fā)布,基于開源許可,并提供了自己的基礎(chǔ)——F# Software Foundation。圍繞它而成長起來的一個充滿活力的社區(qū)讓我們所有人都感到羨慕。我們的團(tuán)隊強(qiáng)烈要求為 Roslyn 提供開源許可,最后,在公司范圍的出現(xiàn)了一個致力于實現(xiàn)這一目標(biāo)的基礎(chǔ)設(shè)施。
2012 年,微軟成立了 Microsoft Open Tech,一個專門關(guān)注開源項目的組織。Roslyn 轉(zhuǎn)到了 Microsoft Open Tech 之下,并正式成為開源軟件。Roslyn 是一個非常適合開源的候選項目:開發(fā)者都是內(nèi)部有名的開發(fā)者,而且項目本身很獨(dú)立,沒有太多的依賴,不太有可能造成許可沖突。
2014 年 4 月,在舊金山舉行的微軟“Build”開發(fā)者大會上,Anders Hejlsberg 將 Roslyn 作為開源項目進(jìn)行展示,并于 4 月 3 日基于 Apache 2.0 許可發(fā)布在了 CodePlex(微軟之前的開源托管平臺)上。
與此同時,.NET Foundation 成為包括 Roslyn 在內(nèi)的.NET 項目的家。
開放為微軟帶來了是一股清新的空氣!在我們開始從 CodePlex 的開放性中獲得好處的同時,微軟也理順了其余的開源障礙。今天,開源已經(jīng)成為我們團(tuán)隊工作的一個直接且不可或缺的部分。
此外,在其他方面,微軟意識到我們不需要控制一切。很明顯,我們可能不需要 CodePlex 了,Roslyn 加入到了從 CodePlex 遷移到 GitHub 的項目行列,GitHub 是當(dāng)時事實上的開源之家。不僅僅是源代碼,就連構(gòu)建過程都搬到了 GitHub 上:它不只是個發(fā)布代碼的地方,我們把它當(dāng)成工作的地方。
C# 語言設(shè)計和編譯器實現(xiàn)的流程現(xiàn)在是完全開放的,有很多微軟以外的實體或個人參與,包括由外部貢獻(xiàn)者構(gòu)建的全語言功能。C# 的價值是巨大的,不僅僅在于通過添加新功能和錯誤修復(fù)來發(fā)展項目,還包括我們通過開源提供的即時反饋閉環(huán)來獲得見解和發(fā)展路線修正。
這是一段漫長而瘋狂的旅程,在我看來,這是微軟在過去十年中所經(jīng)歷的一個巨大的變化。Roslyn 從至暗時刻走出來,開放思想讓它茁壯成長,并通過開源的力量演化成了現(xiàn)在這種具有廣泛用途的項目。
Roslyn 和 C# 語言設(shè)計相關(guān)資源:
https://github.com/dotnet/roslyn
https://github.com/dotnet/csharplang
查看英文原文:https://medium.com/microsoft-open-source-stories/how-microsoft-rewrote-its-c-compiler-in-c-and-made-it-open-source-4ebed5646f98
原文地址:https://www.infoq.cn/article/O9Gb9hGfpR2yEX_T2zto
.NET社區(qū)新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com
總結(jié)
以上是生活随笔為你收集整理的微软是如何使用 C# 重写 C# 编译器并将其开源的的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET 开源简史
- 下一篇: 如何在ASP.NET Core程序启动时