C# 成爲2023年度編程語言之王

原文發表在公衆號 騰訊雲開發者:https://mp.weixin.qq.com/s/5owE5hmJVkwOLJrKMXfR6Q

導讀

2023 TIOBE 年度編程語言正式揭曉,C# 在陪跑多年後首次斬獲這一殊榮。TIOBE表示,C#在 Web 應用後端和遊戲等領域變得持續流行,並開始蠶食 Java 的市場份額。然而在國內,C#的認知度卻並不高。騰訊雲開發者社區特邀國內 .Net 平臺開發專家張善友,創作了這篇 C# 奪魁背後的解讀文章,讓我們一探究竟!讀完全文還可以參加文末龍年紅包封面抽獎活動哦!

目錄

1 引言

2 從 C# 的語言特性看前世今生

3 從 C# 的應用場景看未來發展

4 結語


01


引言

2023 年 TIOBE 年度編程語言已經正式公佈,C# 在穩居前10名20多年之久後,首次摘下年度編程語言桂冠。TIOBE 數據顯示,C# 在2023年的漲幅達1.43%,遠超過競爭對手 Scratch 的0.83%和 Fortran 的0.64%。

TIOBE 還表示,C# 目前正在逐步蠶食 Java 的市場份額,並且在 Web 應用後端和遊戲等領域變得越來越流行。C# 作爲一種新式、創新、開放源代碼、跨平臺,面向對象的編程語言,可以開發包括但不限於桌面、移動、IoT、遊戲、Web、雲原生、移動和 AI 全場景支持。

爲什麼 C# 能突然獲得流行?C# 語言的發展歷程是怎樣的?它有哪些核心應用場景?爲什麼國內 C# 的流行度並不高?騰訊雲開發者社區特邀騰訊雲 TVP、.Net 平臺開發專家張善友,針對這些關鍵問題創作了本篇文章,以饗讀者。

ps:以下內容僅代表作者個人觀點。

02


從 C# 的語言特性看前世今生
2.1 C# 的誕生之路

其實,C# 的誕生可以追溯到20世紀90年代末。當時,微軟公司意識到互聯網的迅速發展和軟件複雜性的增加對開發者提出了新的挑戰。傳統的編程語言無法滿足日益增長的需求,開發者需要一種更強大、更現代化的語言來應對這些挑戰,因此 C# 應運而生。

C# 旨在提供更好的生產力、更強大的面向對象支持和更高的性能。它從 C++、Java 和 Delphi 等語言中吸取了靈感,並結合了微軟自身的創新,於2000年首次發佈。隨着時間的推移,C# 逐漸發展成爲 .NET 平臺的主要編程語言之一,爲開發者提供了強大而靈活的工具來構建各種類型的應用程序。

2.2 C# 的設計目標和發展理念

在我看來,C# 的設計目標和理念是爲了提供一種強大、現代化的編程語言,以提高開發者的生產力和代碼質量。

C# 的首要設計目標是簡單易用。它採用了類似於 C++ 和 Java 的語法,使得開發者能夠迅速上手,並編寫清晰、簡潔的代碼。而且它還是一種純面向對象的編程語言,支持封裝、繼承和多態等面向對象的特性,因而十分有助於組織和管理代碼,提高代碼的可維護性和可擴展性。當然,安全性也是 C# 的關注重點,它引入了類型安全檢查、空引用檢查和異常處理等機制,以防止常見的編程錯誤和安全漏洞,提高代碼的可靠性和穩定性。同時 C# 致力於提供高性能的代碼執行。通過即時編譯(Just-In-Time Compilation)技術,C# 代碼可以被轉換爲機器碼,並在運行時進行優化,從而提高程序的性能。

此外,C# 還追求跨平臺開發,引入了 .NET Core 平臺,最後演化成一個統一平臺 .NET,使得 C# 可以在不同的操作系統上運行,包括 Windows、Linux 和 macOS 等,擴展了應用程序的部署範圍。並且集成開發環境(IDE)支持也是 C# 設計目標的一部分。藉助強大的IDE工具(如Microsoft Visual Studio/Visual Studio Code 和 Rider),我們可以進行代碼編輯、調試、自動完成和重構等操作,有效提高開發效率。

綜上所述,C# 基於簡單易用、面向對象、安全性、高性能、跨平臺和 IDE 支持等特點使得其成爲廣泛應用於各個領域的強大編程語言之一。

2.3 C# 的發展現狀

值得注意的是,C# 目前處於極度被低估的狀態,這主要是和微軟公司過去的閉源政策有很大關係,在2014年11月12日,微軟宣佈 .NET 平臺全技術棧開源並且託管到 .NET 基金會,將讓 .NET 運行在 Linux 和 MacOS 上,並且會通過 .NET Foundation(.NET 基金會)來與社區密切合作在未來改進 .NET。目前我們可以在 GitHub 上找到所有 .NET 平臺組件的開源項目,包括 C# 的編譯器。

在帶 GC 和性能尚可的系列主流工程語言裏,C# 率先支持 AOT 創建動態庫,這樣一來,C++的任何場景,所有桌面端開發、WebAssembly、大部分移動端(包括安卓、iOS),C# AOT 都能參與 (不是完全替代,而是參與),而語言各有所長,只是參與就能帶來很多改變。

最新版本的 C# 已經是一個現代化的編程語言,C# 在2022年和2023年發佈了改變遊戲規則的特性是上下游語言無關的代碼複用。無論是 Java、Python、JS 還是 Rust 開發,我們都可以使用 C# 代碼庫,輕量、無需引入其他運行時和構建依賴,這充分發揮了 C# 代碼優雅的優勢,讓上層應用的程序員也能做底層的東西。

當然,C# 除了是現代的編程語言,還有以下亮點:

  • 跨平臺:.NET 8支持跨當前所有主流的桌面、移動平臺。C# 12可以對標 gcc/g++。

  • 高層級 GC 支持,屏蔽底層細節:.NET 有可配置的 GC,.NET GC 的實現雖然不如很多 JVM 的 GC 實現,但也是身經百戰,經過了高併發的考驗。

  • 跨語言複用性,全面超越同時代的編程語言:相比榜單上靠前的 Java、Python、JavaScript 這些語言,C# 支持 AOT 輸出單個動態鏈接庫,能定義導出C函數符號,那麼交付方不管使用什麼語言,我們都可以用C#進行操作。並且我們還可以切換到 bflat 工具鏈,不用安裝 .NET SDK,實現快速編譯。

  • 支持值類型,讓開發者完全掌控與 C 的互操作:有了動態庫的優勢,加上具有原生的值類型,在 C# 裏定義 C API 接口也是極簡單的。值類型能實現運行時無關的內存佈局,在導出動態庫時,導出函數的傳參規範時可直接使用 C 調用約定,在這過程中我們需要注意返回值大小不要超過 intptr_t 即可。

  • 導出函數聲明簡單:使用 UnmanagedCallersOnly 特性可以將 C# 函數導出提供給 C 調用,如果你去領略 C/C++ 的 DLL_EXPORT 四億種寫法,各個項目各有千秋符合人體工學的命名空間設計,對開發者的要求更低。這點和 Java 類似,遠比 C++ 好。

  • 兼容性好:標準庫 API 比較穩定,方便代碼移植。

  • 功能全面的標準庫:.NET 標準庫很全,質量非常高,爲 C# 在各個應用場景下的應用鋪平了道路。社區裏經常聽到很多人在說 C# 庫少,只需登錄 GitHub 便可驗證其真假,沒有幾個編程語言能和 C# 拼庫多,一個用了這麼多年一直排名前幾的語言庫不可能少。尤其是再考慮庫的覆蓋廣度上就更少有能相比的了,和上面同樣的原因,有很多編程語言看似庫多,但都是重複的。

  • 性能上限足夠高:性能上限很多評測已經給出了,最新的 .NET 8 在少數測試中甚至可以略微超過 C++。就算綜合來看,C/C++,Rust 是第一梯隊的話,C# 也是之下第二梯隊了,Go 和 Java 只能算是第三梯隊級,雖然很多人把 Java 和 C# 經常一起對比,但是目前在性能上限來說,C# 和 Java 已經有了斷檔級別的差距。

  • 使用下限足夠低:基本上只要學過編程就能很快上手,可以完成基本功能。在易用性來說,Golang 確實是第一梯隊,C# 和 Java 算是第二梯隊,而 C++ 和 Rust 的系統對於新手而言則難於上青天。

03


從 C# 的應用場景看未來發展

C# 作爲全場景應用開發平臺,可以快速應用在雲邊端不同場景下的硬件設備上,包括雲服務器、移動終端以及 IoT 設備等等,高效運行並能有效協同。目前 C# 在雲原生、全棧 Web 應用、桌面應用、移動應用、遊戲、物聯網 IoT、人工智能 AI 等場景的應用已較爲成熟。尤其當前人工智能爆火,這將是未來的一大矚目方向。

3.1 人工智能

毋庸置疑,人工智能場景應用是 C# 最有發展潛力的方向,回顧近10年的算法發展,主要經歷了3個階段:利用數學及統計知識,設計特徵,進行處理和判別的傳統算法階段,採用深度神經網絡,標註數據進行訓練,自動提取特徵,進行處理和判別的深度學習算法階段,基於大模型,零樣本(Zero-Shot)處理,或採用少量樣本微調的大模型應用開發階段。前兩個階段 C# 有 ML.NET 庫可以做這方面的應用開發,大模型的 Zero-Shot 特點和泛用性,使得完成一件事情,不再需要經歷收集數據、標註、訓練、優化這個完整的過程,只需要理解,即可進行應用層開發。

C# 語言的某些特性,包括對非結構化數據友好,支持 Native AOT,跨平臺,Blazor 等特別適合人工智能類應用,使得它十分適合開發人工智能產品。例如,在應用層的開發上,微軟2023年3月份開源的 Semantic Kernel,在2023年12月 20日正式發佈了1.0 版本。Semantic Kernel 的出現,直接打開了 C# 通向 AGI 的大門。

3.2 雲原生

雲原生、容器技術發展帶來整體後端工業化、生態的進步,我們也可以基於 k8s 本身服務構建分佈式架構,共享所有語言的中間件。比如:你可以基於 Dapr 使用任何語言的任何中間件,C# 正好是 Dapr 支持的第一語言。

.NET 8 重塑了我們構建可按需擴展的智能、雲原生應用程序和高流量服務的方式。無論我們是部署到 Linux 還是 Windows,使用容器還是我們選擇的雲應用程序模型,.NET 8 都可以讓我們更輕鬆地構建這些應用程序。它包括一組經過驗證的庫,目前 Microsoft 的許多大規模服務都在使用這些庫,可以幫助我們應對可觀察性、彈性、可擴展性、可管理性等方面的基本挑戰。

.NET 8 支持將 .NET 應用程序編譯爲本機代碼,使用更少的內存並立即啓動,無需等待 JIT(即時)編譯器在運行時編譯代碼,也無需部署 JIT 編譯器和 IL 代碼。AOT 應用程序只部署應用程序所需的代碼。我們的應用程序現在可以在無法使用 JIT 編譯器的受限環境中運行。

3.3 遊戲

值得一提的是,C# 在遊戲開發領域口碑也非常不錯,具體主要在學習上手、招聘人才、編程規範、運行性能方面都表現十分平衡,沒有明顯缺陷。遊戲開發人員使用 Unity 構建遊戲,典型代表便是騰訊的國民遊戲王者榮耀,它主要使用 Unity 打造,已經擁有超過上億的活躍用戶。C# 與 Unity 引擎無縫集成,此外,還有一些新興的遊戲引擎也採用了 C# 語言,例如開源 godot 引擎。

除遊戲前端,C# 和 .NET 技術在遊戲後端(遊戲服務器)也獲得了越來越廣泛的應用,C# 的服務器可以無障礙在 Linux 上運行。

3.4 全棧 Web

.NET 8 中的 Blazor 可以同時使用服務器和客戶端來處理我們的所有 Web UI 需求。它通過專注於優化頁面加載時間、可擴展性和提升用戶體驗的多項新增強功能,開發人員現在可以在同一應用程序中使用 Blazor Server 和 Blazor WebAssembly,在運行時自動將用戶從服務器轉移到客戶端。兩者對比之下,顯然 .NET 代碼在 WebAssembly 上的運行速度更快,這主要歸功於新的基於“Jiterpreter”的運行時和新的內置組件。

總之,Blazor 填補了欠缺的一環,C# 開發人員可以直接在用戶瀏覽器中共享代碼和業務邏輯,對於 C# 開發人員來說,這無疑是一項十分強大的功能,有效提升我們的工作效率。

3.5 桌面應用

其實,C# 在桌面開發框架上的應用也是一大亮點。在 .NET 平臺上傳統的 Windows 桌面開發框架WPF 和 Winforms 之外,還有很多跨平臺的開源框架,比如 Avalonia UI、UNO Platform。 特別Avalonia UI 是一個基於 .NET  和 XAML 的偏桌面端的跨平臺(WINDOWS、LINUX、MAC)UI 開發框架,不存在某個平臺用 WINUI,某個平臺用原生,導致不同平臺渲染會出現差別的問題發生,所有平臺都使用 SkiaSharp 來渲染。

特別是在國內,在 openKylin 社區成立了 Avalonia SIG,推進 Avalonia UI 對 openKylin 生態的支持,及 Avalonia UI 的相關生態建設。隨着國內的 Linux 桌面向工業、醫療等傳統行業滲透,Avalonia UI 在這個市場上有着充分的競爭力,有越來越多的用戶從傳統的 QT 轉移到開源免費的 Avalonia UI。

除了 Avalonia UI 之外,還有 Blazor 在客戶端應用上表現同樣出色。從 .NET7 版本開始支持的 Blazor Hybird,使用 Blazor Hybrid 將桌面和移動本機客戶端框架與 .NET 和 Blazor 結合使用。在 Blazor Hybrid 應用中,Razor 組件在設備上本機運行。組件通過本地互操作通道呈現到嵌入式 Web View 控件。組件不在瀏覽器中運行,並且不涉及 WebAssembly。Razor 組件可快速加載和執行代碼,組件可通過 .NET 平臺完全訪問設備的本機功能。

3.6 移動應用

.NET 多平臺應用程序 UI (.NET MAUI) 是一個跨平臺框架,用於使用 C# 和 XAML 創建本機移動和桌面應用程序, 使用 .NET MAUI,可以開發可在 Android、iOS、macOS 上運行的應用,Windows 以及從單個共享代碼庫運行的應用。.NET MAUI 包含 BlazorWebView 控件,該控件運行將 Razor 組件呈現到嵌入式 Web View 中。通過結合使用 .NET MAUI 和 Blazor,我們可以跨移動設備、桌面設備和 Web 重複使用一組 Web UI 組件。

3.7 物聯網 IoT

除桌面和移動應用外,C# 在物聯網 IoT 的應用在當前也較爲普遍。.NET 可在各種平臺和體系結構上運行。它支持 Raspberry Pi 和 Hummingboard 等常見物聯網 (IoT) 插件板。IoT 應用通常與專用的硬件(例如傳感器、模數轉換器和 LCD 設備)交互。

在網絡化、標準化或網絡安全方面,對工業網絡的要求正以非凡的速度增長。在這些問題重重的領域,基於以太網的 OPC UA(Open Platform Communications – Unified Architecture,開放平臺通信 - 統一架構)通信標準正在快速發展,OPC 基金會出品的 OPC UA 的標準庫 UA-.NETStandard 就是使用 C# 實現,允許非會員使用 OPC UA 的試用規範、原型或研究項目。

其實,物聯網的後端系統使用 .NET 和 C# 也獲得了越來越廣泛的應用,構建的服務後端系統可以無障礙運行在 Linux 上。

04


結語

在我看來,客觀實際並不是一成不變的,而是不斷向前發展變化的。C# 在全球使用人數歷來排在 Top5,但很多人卻認爲它在國內的使用場景似乎比較稀缺,主要是因爲大部分人依舊用老眼光來看問題,而不是以發展、變化的觀念來看問題。最新的 C# 12 是一門既有 Python 的開發效率,又有 C/C++/Rust 性能的編程語言。

在 Linux 桌面市場上,以 C# 的 AvaloniaUI 補充 Window Forms 和 WPF 的跨平臺需求,逐步成爲 QT 的有力競爭者。在 GenAI 加持的人工智能場景下,以 Semantic kernel 項目驅動的 新的開發範式在2024年會有更多的採用者。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章