.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 平台取得的成績已經足夠矚目。

參考鏈接:

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

http://fairysoftware.com/vb_28.html

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

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

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