为什么C语言从不被淘汰?Rust/Go的安全特性,C语言真的做不到吗?
侧边栏壁纸
  • 累计撰写 1,121 篇文章
  • 累计收到 3 条评论

为什么C语言从不被淘汰?Rust/Go的安全特性,C语言真的做不到吗?

私人云
2026-01-31 / 0 评论 / 0 阅读 / 正在检测是否收录...

有一段时间,武侠小说风靡中文世界,我也乐此不疲,高中的零花钱几乎都给了街头那个租书的小贩。

在武侠小说中,一直有2大流派,没错,就是少林和武当。错,今天我们说的不是他们,而是刀客和剑客,用刀的和耍剑的!

用剑的里面,有独孤求败,独孤九剑,有破刀式,破箭式,破尽天下武功,所向无敌,但求一败!

用刀的里面,有小李飞刀”,列无虚发,排行榜排第三,却是隐藏的大Boss,天下第一照杀不误!

但用刀的里面,还有个异类,就是傅红雪。他的特点,就是拔刀,号称从三岁开始,每天拔刀10w次,所以出刀速度奇快。有时候,敌人眼睛一眨,傅红雪的刀就已经归鞘了,只留下敌人脖子上面的一圈红印,人头落地。

这就是“速度”的力量!

独孤九剑的传人,令狐冲看到西门吹雪,估计也犯怵,破这个破那个,什么都看不见,怎么破?

而C语言,就像傅红雪的刀一样,不仅快,而且还有3个优势!

1、时间

我们知道,每一种成功的语言都必然伴随一次计算机浪潮,才能被广泛使用。

Java是互联网浪潮!

Go语言是Docker、Ethernet。

Python是AI风生水起!

而C语言的搭档则是Unix,地球上最伟大的操作系统,没有之一。

在Unix的发展初期,它是用汇编语言编写的。 为了改写 Unix,使其可移植到其他硬件平台,C语言之父丹尼斯·里奇在 B 语言(源于 BCPL)的基础上创造了 C 语言。Unix 内核也在 1973 年用 C 语言重写。

从此之后,C就成为了Unix的”御用语言“,-Unix 内核、核心工具(如 shell、ls、cp 等)和后来的几乎所有应用程序都是用 C 语言编写的。这使得开发操作系统和系统工具变得前所未有的高效和清晰。

C 语言的许多设计特性(如直接内存访问、指针操作、位运算、简洁的语法)都是为了满足操作系统开发的需求(高效、贴近硬件、强大)而设计的。Unix 的成功完美验证了 C 语言在系统编程领域的强大能力。

用汇编写的 Unix 只能在 PDP-7 上运行。而用 C 语言重写后,理论上只需为新的硬件平台编写一个相对较小的 C 语言编译器,再重新编译整个 Unix 系统,它就能在新平台上运行。这极大地加速了 Unix 在不同学术机构和商业公司的传播。

时至今日, 今天几乎所有主流操作系统(Linux、macOS、Windows 内核的许多部分、iOS、Android)的核心都是用 C(和 C++)编写的。这个传统直接源于 Unix。

数十年来,C 语言和 Unix 环境(或类 Unix 环境,如 Linux)是计算机科学教育的核心,一代一代的计算机初学者的第一语言都是C!

2、简单

C89仅用32个关键字,非常容易学习。

这种简单,带来了几个好处!

第一个是极佳的ABI兼容性。在C语言里面,一旦基本类型布局、结构体和调用约定确定,就会很稳定。

同C++相比,C++还有名称修饰、虚函数表布局、多重继承、RTTI、异常处理、模板实例化、内联函数等。不同编译器,甚至同一编译器的不同版本,C++ ABI都可能不兼容。

这就是为什么C接口常被用作跨语言(C++、Rust、Python等)交互的稳定桥梁,同时也是很多API只提供C的SDK接口的原因,特别是操作系统的API。

第二个是编译器非常容易实现。因为C语法非常简单,各种平台的C编译器非常容易编写,导致其如同“病毒一样”的传播。

每一个操作系统,几乎都可以找到C编译器,并且随着时间的发展,都已经非常成熟。

第三个就是容易学习,但上限很高。

每一个计算机从业人员的第一语言,几乎都是C语言。

3、速度

C 语言是最能贴合硬件模型、直接操控硬件的主流编程语言。

这就是为什么很多操作系统的编写用C的原因。作为应用程序的底层,操作系统的速度至关重要,关系程序的速度和用户界面的响应速度!

而C则直接去掉了虚拟机、自动内存回收这些特性,编译器能将 C 代码高度优化为高效的机器指令,其执行效率仅略低于手工编写的汇编代码。

同时,C也是跟计算机硬件高级一致的。

计算机硬件的核心物理模型是「CPU + 内存 + 寄存器 + I/O 外设」,而 C 语言的语言抽象模型几乎是对这套硬件模型的 “一对一映射”,没有额外的抽象层割裂与硬件的联系:

C 语言的变量 ≈ 硬件的内存单元

硬件中内存是按字节编址的物理存储单元,C 语言的变量(int a、char b等)在编译后会直接对应到内存的某个具体地址(通过地址总线寻址),变量的读写操作本质就是对内存物理单元的读写,没有中间虚拟层(如 Java 的堆内存由 JVM 管理,不直接对应物理内存)。

C 语言的指针 ≈ 硬件的内存地址 / 地址总线

指针的本质是 “内存地址的封装”,这直接对应硬件的地址总线功能。通过指针,C 语言可以直接读写任意内存地址(如*(int*)0x12345678 = 10;),这相当于直接通过地址总线寻址到物理内存地址0x12345678并写入数据,完全复刻了硬件的寻址逻辑,是操控硬件的核心利器。

C 语言的局部变量 ≈ 硬件的 CPU 寄存器

C 语言的局部变量(函数内定义的变量)会被编译器优先分配到 CPU 寄存器中(寄存器访问速度远快于内存),这直接对应硬件的 CPU 寄存器资源,契合硬件的执行效率优化逻辑,而高级语言大多不支持直接操控寄存器(汇编除外,但汇编可移植性极差)。

C 语言的函数调用 ≈ 硬件的栈操作(栈寄存器 + 栈内存)

C 语言的函数调用会通过「栈」来传递参数、保存返回地址和局部变量,这完全对应硬件的栈寄存器(如 x86 的esp/ebp寄存器)和栈内存区域的工作机制,函数的压栈 / 出栈操作直接映射硬件的指令执行逻辑,无额外开销。

这个在其它语言里面是没有的。

总结

C语言的真正优势在于它找到了"强大"与"简单"之间的完美平衡点:

- 它足够低级,可以控制硬件

- 它足够高级,可以提高开发效率

- 它足够简单,可以被广泛理解和实现

- 它足够稳定,可以构建长期可靠的系统

这也是为什么在出现了Rust、Go、Zig等现代系统语言后,C语言依然保持着强大的生命力—它解决的是一个基础而永恒的需求:用最小的开销获得对计算机的最大控制。

我是明月,

把酒言欢,笑谈IT!

0

评论 (0)

取消