.NET 20 週年:臨危受命阻擊 Java,見證微軟轉向開源

語言: CN / TW / HK

20 年前的 2002 年 2 月 13 日,仍高舉著閉源大旗的微軟正式釋出 Visual Studio .NET,時任執行長比爾·蓋茨將其描述為“第一個用於構建 XML Web 服務和下一代網際網路應用程式的完全整合的開發環境”。

它被創造出來的目的非常明確 —— 建立一個全新的技術體系以取代如日中天的 Java

“臨危受命”取代 Java

時間回到 2000 年 2 月,Windows 2000 剛剛釋出不久,微軟當時的開發平臺是由 Visual Studio 6.0 組成的,它是一組獨立的 IDE,旗下包括 Visual C++、Visual Basic (VB)、FoxPro、Visual InterDev 和 Visual J++。其中除了 Visual C++ 以外,其他的語言在當時或多或少都存在著一些問題。 

VB 曾經非常流行,但面向物件程式語言的狂熱分子經常抱怨 VB 缺乏對繼承的支援,對於使用 COM 和 Windows API 的高階應用來說,VB 過於複雜,而且幾乎在所有方面都被 Borland 公司的 Delphi 所取代;作為微軟早期的資料庫語言,FoxPro 也日薄西山,其 DBF 資料庫格式並不好用,加上此時的 Access 更受歡迎,後者與 SQL 和 SQL Server 更好地相容;Visual InterDev 是微軟首次使用 Active Server Pages (ASP) 進行 Web 開發,這是一種 VB 版本的 PHP,但卻沒有 PHP 的易用性和跨平臺功能。 

值得一提的是,Visual J++ 由 Delphi 的架構師 Anders Hejlsberg 設計(他於 1996 年跳槽到微軟),可以看做是微軟的 Java 版本,對當時的 Windows 開發相當有利。但它的問題並不是語言本身不夠好,而是其不符合 Java 規範,正面臨著來自 Sun 公司的訴訟危機。 

也就是說,當時的微軟開發生態領著一眾“老弱病殘”,看起來唯一能打的在法律上也被競爭對手拿捏,面對來勢洶洶的 Java,微軟不得不另闢蹊徑。 

2000 年 7 月,時任微軟平臺戰略集團副總裁 Paul Maritz 在微軟專業開發者大會上首次公佈了 .NET Framework 戰略。Maritz 將該戰略的重要性比作八年前隨 Windows NT 引入的 Win32 API。該專案最初在開發過程中被稱為 NGWS(下一代 Windows 服務),Maritz 說“我們最終選擇了 .NET 這個名稱,因為它代表了旨在將網際網路變成真正的分散式計算平臺的一組技術。” 

根據 Maritz 的描述,微軟最初的想法是建立一個由使用 SOAP(簡單物件訪問協議)的 XML 網路服務驅動的程式化網路,SOAP 是一種在網際網路上交換資料的 XML 標準。Maritz 說:“我們稱之為網路服務架構......我們的 .NET 平臺旨在使建立這些型別的應用程式變得更加容易”。

該戰略旨在通過其 Passport 目錄和一組代號為 Hailstorm 的第一方 XML 服務將微軟置於網際網路的核心,成為網際網路軟體分發的中轉站。該服務於次年推出,但由於涉及不正當競爭很快被放棄。 

而其中的 .NET Framework 專案則保留了下來。 

“這是我們長期以來的目標,將 Visual Basic、Visual C++ 和我們的其他語言置於共同的基礎上……我們今天擁有第一個真正的現代通用多語言面向物件的執行時環境”,Maritz 說。 

儘管該計劃的“面向物件”、“跨平臺”等特性與 Java 有很多共同點,Maritz 的措辭仍試圖將 .NET Framework 與 Java 區分開來。在微軟的宣傳中,Java 只是一種程式語言,而 .NET Framework 則是一種具有可以執行各種語言的“公共語言執行時”(CLR)—— 這在今天看來似乎有點奇怪,畢竟 JVM 語言的概念在當時就已經很普遍,而如今人們印象中大多數 .NET 開發都是用 C# 來完成的 —— 但在當時,這個宣傳口徑對 .NET 的推廣還是起了很重要的作用。 

除了宣傳策略外,微軟甚至在 2000 年就嘗試打了“開放牌”。“我們的目的是在這個公共語言執行時和這些類庫中獲取全部智慧財產權,並將它們提供給標準機構,這樣它們就可以成為一套真正開放的標準,”Maritz 說。

實際上,此時的微軟對開放 .NET 並不全心全意。直到 2014 年新 CEO 上任,微軟才將 .NET 分叉出開源的 .NET Core,真正支援開源 .NET,並使其成為跨平臺的開發環境。甚至在去年,微軟還一度做出(後來又撤銷了)一些會破壞開源版本的決定。當然這些都是後話了。

Java 和 .NET 的愛恨情仇

Java 對 .NET 的影響是複雜且深遠的。

Sun 公司最初推出 Java 時,是有意識地試圖破壞微軟當時在商業計算領域的壟斷地位,而 Visual J++ 和後來的 .NET 都是微軟對 Java 的反擊。 

根據 ASP.NET 創始人之一 Mark Anders 的說法,早期 .NET 的很多技術主要來自 Visual Basic 團隊。VB 團隊當時正在開發一個新的執行時,該 CLR 專案代號為“Project Cool”,它不像 COM 那樣複雜,而且擁有很好的物件系統和垃圾回收器,這些特性都與 JVM 很相似。  

Anders 還透露,ASP.NET 的早期原型就是用 Java 編寫的,“我喜歡 Java 這種語言,Scott (ASP.NET 之父、現任微軟副總裁)也是。”因此,Anders 和 Scott 也成為了微軟內部首批採用 VB 團隊 CLR 技術的開發人員,並推動了 .NET 專案的建立。 

前文提到的 Anders Hejlsberg 也是 .NET 的主要建立者。從 Borland 跳槽加入微軟時,他就幫助微軟構建了 Visual J++ 6.0 和 Windows Foundation Classes (WFC),儘管前者由於法律問題慘淡收場,但他很快又幫助微軟建立了另一個有能力與 Java 抗衡的程式語言 C#。 

剛剛面世的 C# 看起來就與 Java 有著驚人的相似。它包括了諸如單一繼承、介面、與 Java 幾乎同樣的語法和編譯成中間程式碼再執行的過程。但是 Hejlsberg 又在 C# 中巧妙融入了一些 Delphi 和 VB 的特性來作為與 Java 的區分,包括與 COM(元件物件模型)直接整合、將 WFC 改編為 Windows 窗體類庫等,規避了很多版權糾紛,這使得 C# 順利成為了微軟 .NET 框架的主角。

日後的很多公開場合,Hejlsberg 都承認過“Java 是 .NET 的靈感來源”,但其分量與 Delphi 和 VB 相當。

見證微軟轉向開源

.NET 能夠獲得今天的地位,很大程度上歸功於微軟對於開源的態度轉變。

在 .NET 剛剛面世的前幾年,微軟的決策層仍聚焦於鞏固自己的專利護城河,這使得 .NET 在很長一段時間裡只能用於 Windows 平臺,缺乏其釋出會時所提出的跨平臺能力,這對 .NET 在非 Windows 使用者群體中的推廣造成了阻礙。

2004 年,一個來自微軟外部的開源專案 Mono 橫空出世,率先為 .NET 的跨平臺工作提供了非官方的支援。 

Miguel de Icaza 是 Xamarin 公司的創始人之一,同時也是 Mono 專案的發起者。在接觸 .NET 之前,de Icaza 的另一個身份是知名 Linux 桌面環境 GNOME 的創始人。Icaza 接受媒體採訪時提到,自己對於 .NET 的興趣源於為 GNOME 應用程式尋找更好的程式設計工具。 

“當我們剛開始建立 GNOME 時,那個時代的 Unix 世界有一個基於高階語言降低程式設計複雜性的方案,一個叫 John Ousterhout 的人構建了一種名為 TCL 的語言和一個稱為 TK 的 UI 工具包,用這套工具來構建應用程式很有趣,但問題是 TCL 並不是一種出色的程式語言。”Icaza 說。 

Icaza 和 GNOME 團隊其他成員還嘗試使用過 Java,但 Java 的即時編譯器 JIT 在當時發展有限,工具包也還不夠完善。於是 GNOME 團隊最終使用了一個由 C 語言編寫的 GUI 應用程式開源工具包 GTK。“GTK 符合我們的要求,但它是用 C 程式設計的,我們真的想讓它可以支援多種更高階的程式語言。”de Icaza 說。 

採用 GTK 後,GNOME 團隊為包括 Objective-C、ADA、Perl、Python、C++ 和 Scheme 在內的語言建立了繫結協議。“我們的想法是將程式設計保持在一個高度抽象的水平上,但是存在著一些效能問題。當 .NET 出現的時候,它滿足了很多要求。它是一種高水平的語言,有較快的編譯速度,且沒有受到當時指令碼語言的一些弊端的影響。” 

de Icaza 說,Mono 最初只是基於 .NET 的“ECMA 子集”,並補充了自己的技術棧,但是隨著社群的壯大,越來越多的人向 Mono 貢獻程式碼,使得其陸續獲得 ADO.NET,ASP.NET 和 Windows Forms 的能力,逐漸成長為官方 .NET Framework 的開源、跨平臺替代品。 

對於 Mono 社群的活躍,微軟內部在當時分為了兩派,一部分人選擇支援,一部分人則保持警惕。支持者的觀點很簡單,Mono 確實為 .NET 帶來了他們當初承諾的跨平臺特性,這對 .NET 的推廣是百利而無一害的;而反對派大多數則是閉源時代的殘黨,畢竟想要這艘在專有軟體大海上馳騁超過 30 年的巨輪突然轉向絕非易事,更何況此時的掌舵人仍是當年那個喊出“Linux 就是毒瘤”的鮑爾默。 

這樣的情況導致微軟在那段時間裡對待 Mono 社群的態度非常微妙 —— 出於商業策略考慮,微軟通常會在公開場合介紹 .Net 平臺的時候順帶提及一下 Mono,以證明自己的跨平臺性;但始終沒有從官方角度對 Mono 社群提供任何實質性的支援。

直到 2014 年,微軟新 CEO 納德拉上任。在釋出會上,他在人前表現得頗為和善,談話也比較婉轉,散發著與鮑爾默完全不同的領袖氣質,但是他話語中透出的意思卻非常地明確:Windows 未來將不再具備從前的重要地位,雲和移動才是微軟未來的核心。

從這時起,微軟打出了“擁抱開源”的旗號。而他們做的第一件事,就是官方支援 .NET 的跨平臺工作。 

與此同時,Xamarin 公司使用 Mono 編寫的遊戲開發引擎 Unity 在移動領域取得巨大成功。移動裝置上對 .NET 的需求使得微軟的業務部門加強了與 Mono 團隊的合作。最終在 2016 年,微軟正式收購 Xamarin,完成對 Mono 的收編,以實現 .NET 在移動端的佈局。 

收購 Mono 以後,微軟也推出了首個官方開源的 .NET 版本 .NET Core.NET Core 實現了 .NET Framework 不含使用者介面的部分功能,例如 JIT (.NET Core 採用 RyuJIT)、垃圾收集器 (GC) 以及型別 (包含基本型別以及泛型型別等)。 

根據微軟官方的描述,.NET Core 與 Mono 未來會是合作的關係,Mono 仍會維持社群力量的維護與發展,而 .NET Core 則會以官方角度來進行發展,兩邊也會一起進行彼此功能上的增進。 

可以說,.NET 與開源社群的拉扯正是微軟過去十年從閉源向開源轉變的縮影。

.NET 的未來

根據 StackOverflow 的調查,.NET 在“最受喜愛”技術類別中名列前茅,並且已連續三年位居榜首。.NET 專案管理負責人 Scott Hunter 表示,“.NET 活躍使用者的數量正在增長。我們每年新增使用者超過 540 萬。” 

Hunter 引用了雲原生計算基金會 CNCF 的資料,在去年 .NET 6.0 剛釋出時,該專案在上升速度最快的開源專案中排名第一,此後下降到了 3-4 名,但自 2017 年以來,.NET 一直排在前 30 名以內。 

同樣值得注意的是,.NET 應用程式在 Linux 上的部署也越來越多。“今年某個時候,將有超過一半的 .NET 6.0 及以下版本的 WEB 應用部署在 Linux 上。”Hunter 說。 

儘管增長資料喜人,但 .NET 在開源社群中一直以來仍存在很多爭議。 

例如它仍然主要依賴於微軟一家公司,這讓社群一部分人一直對其中立性保持擔憂。去年 10 月, .NET 社群刪除熱過載功能,強制使用者改用昂貴但功能強大的 Visual Studio 2022 就引發了巨大的爭議。雖然微軟方面很快撤銷了這一舉措並公開道歉,但這一事件也讓其花費多年在開源社群中建立起來的信任出現了裂痕。 

.NET 基金會公佈的一份調查也顯示,目前 .NET 相關的開源社群成員主要由傾向於 Windows、微軟的平臺和更有經驗的開發人員組成,這表明 .NET 對新程式設計師的吸引力仍然十分有限。 

回顧 .NET 的歷史,作為一個綜合開發環境,其在多語言方面只取得了部分成功,大多數 .NET 開發者使用的語言只有 C#,使用 VB 的開發者數量正在不斷下降,而 F# 使用者基數則小到可以忽略不計。

但毫無疑問的是,微軟在 2014 年官方支援跨平臺以及後續不斷擁抱開源的舉措,確實幫助 .NET 取得了巨大的成功。雖然並沒有像 Maritz 20 多年前所希望的那樣完全取代 Java,但 C# 和 .NET 平臺取得的成績已經足夠矚目。

參考連結:

http://www.theregister.com/2022/02/15/20_years_of_dotnet/

http://fairysoftware.com/vb_28.html

http://spectrum.ieee.org/top-programming-languages-2021

http://www.oschina.net/news/165467/microsoft-dotnet-hot-reload-removal-decision-open-source

http://www.oschina.net/news/165695/net-hot-reload-support-via-cli