原文发表在公众号 腾讯云开发者:https://mp.weixin.qq.com/s/5owE5hmJVkwOLJrKMXfR6Q
导读
2023 TIOBE 年度编程语言正式揭晓,C# 在陪跑多年后首次斩获这一殊荣。TIOBE表示,C#在 Web 应用后端和游戏等领域变得持续流行,并开始蚕食 Java 的市场份额。然而在国内,C#的认知度却并不高。腾讯云开发者社区特邀国内 .Net 平台开发专家张善友,创作了这篇 C# 夺魁背后的解读文章,让我们一探究竟!读完全文还可以参加文末龙年红包封面抽奖活动哦!
目录
1 引言2 从 C# 的语言特性看前世今生3 从 C# 的应用场景看未来发展4 结语
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:以下内容仅代表作者个人观点。
其实,C# 的诞生可以追溯到20世纪90年代末。当时,微软公司意识到互联网的迅速发展和软件复杂性的增加对开发者提出了新的挑战。传统的编程语言无法满足日益增长的需求,开发者需要一种更强大、更现代化的语言来应对这些挑战,因此 C# 应运而生。
C# 旨在提供更好的生产力、更强大的面向对象支持和更高的性能。它从 C++、Java 和 Delphi 等语言中吸取了灵感,并结合了微软自身的创新,于2000年首次发布。随着时间的推移,C# 逐渐发展成为 .NET 平台的主要编程语言之一,为开发者提供了强大而灵活的工具来构建各种类型的应用程序。
在我看来,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 支持等特点使得其成为广泛应用于各个领域的强大编程语言之一。
值得注意的是,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 的系统对于新手而言则难于上青天。
C# 作为全场景应用开发平台,可以快速应用在云边端不同场景下的硬件设备上,包括云服务器、移动终端以及 IoT 设备等等,高效运行并能有效协同。目前 C# 在云原生、全栈 Web 应用、桌面应用、移动应用、游戏、物联网 IoT、人工智能 AI 等场景的应用已较为成熟。尤其当前人工智能爆火,这将是未来的一大瞩目方向。
毋庸置疑,人工智能场景应用是 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 的大门。
云原生、容器技术发展带来整体后端工业化、生态的进步,我们也可以基于 k8s 本身服务构建分布式架构,共享所有语言的中间件。比如:你可以基于 Dapr 使用任何语言的任何中间件,C# 正好是 Dapr 支持的第一语言。
.NET 8 重塑了我们构建可按需扩展的智能、云原生应用程序和高流量服务的方式。无论我们是部署到 Linux 还是 Windows,使用容器还是我们选择的云应用程序模型,.NET 8 都可以让我们更轻松地构建这些应用程序。它包括一组经过验证的库,目前 Microsoft 的许多大规模服务都在使用这些库,可以帮助我们应对可观察性、弹性、可扩展性、可管理性等方面的基本挑战。
.NET 8 支持将 .NET 应用程序编译为本机代码,使用更少的内存并立即启动,无需等待 JIT(即时)编译器在运行时编译代码,也无需部署 JIT 编译器和 IL 代码。AOT 应用程序只部署应用程序所需的代码。我们的应用程序现在可以在无法使用 JIT 编译器的受限环境中运行。
值得一提的是,C# 在游戏开发领域口碑也非常不错,具体主要在学习上手、招聘人才、编程规范、运行性能方面都表现十分平衡,没有明显缺陷。游戏开发人员使用 Unity 构建游戏,典型代表便是腾讯的国民游戏王者荣耀,它主要使用 Unity 打造,已经拥有超过上亿的活跃用户。C# 与 Unity 引擎无缝集成,此外,还有一些新兴的游戏引擎也采用了 C# 语言,例如开源 godot 引擎。
除游戏前端,C# 和 .NET 技术在游戏后端(游戏服务器)也获得了越来越广泛的应用,C# 的服务器可以无障碍在 Linux 上运行。
.NET 8 中的 Blazor 可以同时使用服务器和客户端来处理我们的所有 Web UI 需求。它通过专注于优化页面加载时间、可扩展性和提升用户体验的多项新增强功能,开发人员现在可以在同一应用程序中使用 Blazor Server 和 Blazor WebAssembly,在运行时自动将用户从服务器转移到客户端。两者对比之下,显然 .NET 代码在 WebAssembly 上的运行速度更快,这主要归功于新的基于“Jiterpreter”的运行时和新的内置组件。
总之,Blazor 填补了欠缺的一环,C# 开发人员可以直接在用户浏览器*享代码和业务逻辑,对于 C# 开发人员来说,这无疑是一项十分强大的功能,有效提升我们的工作效率。
其实,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 平台完全访问设备的本机功能。
.NET 多平台应用程序 UI (.NET MAUI) 是一个跨平台框架,用于使用 C# 和 XAML 创建本机移动和桌面应用程序, 使用 .NET MAUI,可以开发可在 Android、iOS、macOS 上运行的应用,Windows 以及从单个共享代码库运行的应用。.NET MAUI 包含 BlazorWebView 控件,该控件运行将 Razor 组件呈现到嵌入式 Web View 中。通过结合使用 .NET MAUI 和 Blazor,我们可以跨移动设备、桌面设备和 Web 重复使用一组 Web UI 组件。
除桌面和移动应用外,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 上。
在我看来,客观实际并不是一成不变的,而是不断向前发展变化的。C# 在全球使用人数历来排在 Top5,但很多人却认为它在国内的使用场景似乎比较稀缺,主要是因为大部分人依旧用老眼光来看问题,而不是以发展、变化的观念来看问题。最新的 C# 12 是一门既有 Python 的开发效率,又有 C/C++/Rust 性能的编程语言。
在 Linux 桌面市场上,以 C# 的 AvaloniaUI 补充 Window Forms 和 WPF 的跨平台需求,逐步成为 QT 的有力竞争者。在 GenAI 加持的人工智能场景下,以 Semantic kernel 项目驱动的 新的开发范式在2024年会有更多的采用者。
张善友,智用人工智能应用研究院 CTO,腾讯云 TVP,毕业于兰州大学数学系,专注于云原生开发,推崇开源文化, 使用开源软件构建云原生软件系统,运营微信公众号“dotNet 跨平台”和“新一代智能应用”,推广和普及云原生技术在企业业务开发的应用。 从事 .NET 平台开发20年,业余爱好写作,在个人技术博客上撰写了大量的系列技术文章,并在腾讯云开发者社区开设专栏。