C语言一直被视为老古董,认为它已经过时且没人使用。这是因为Rust、Go、Swift这些新兴语言试图取代它。但如果你在关键场景里用过C语言,你就会明白它的价值仍然无可替代。我举个例子,上次调试一个嵌入式传感器时,硬件底层代码必须非常精确,没有任何误差。有位队友告诉我,这个芯片的响应时间不能超过1微秒,而只有C能做到。我存疑时翻阅了许多资料后发现,这是实实在在的行业事实。比如Linux内核就是最好的证明,50%以上的代码是用C编写的。而且这些代码从99年就没怎么改动过,包含了无数直接操作硬件寄存器的代码。C之所以能运行至今,关键在于它使用宏和内联汇编进行底层操作。Rust在操作底层硬件时显得抽象度过高,让人摸不着头脑,而C却非常直白。我最近在查看一份文档时发现硬实时系统工程师需要模拟估算一个事件处理的最坏距离,并精确到纳秒级别。这意味着C可以通过静态分析工具提前算出极限时间,而Rust还没有实现这个功能。 这个话题还没说完,比如视频编解码中的FFmpeg里的HEVC编码器就是一个例子。你可能以为高层用Python等语言就可以轻松搞定视频处理,但实际上这是不现实的。HEVC编码中需要进行数千个Cabac熵解码查表操作,这些操作都依赖于长时间训练、优化好的静态数组放在L1缓存中进行快速访问。如果换成其他语言,要么得在堆里找数组或者复制拷贝,导致帧率急剧下降。只有在C里才能通过静态常量来实现最优路径。 还有一次我帮朋友调研加密算法时发现恒时间操作非常重要,C语言中的volatile和内联汇编正好能帮助锁死执行流程、减少时间差。Rust中的unsafe块虽然有一定控制力但却无法达到如此细致程度。FIPS认证对加密算法也有特殊要求,必须能被工具完整分析出来。目前只有C语言才能满足这一要求。而Rust想要做到还需要等待更多工具支持。 有趣的是在FFmpeg解HEVC视频编码时,你会注意到有一个像纹理一样的静态数组直接放在L1缓存中进行访问。我用带缓存内存监控工具观察时发现它访问指令连续执行而没有任何中断或跳变过程。如果换成其他语言封装过的数组每次访问都可能导致帧率下降和粒子边缘模糊问题。 另一个场景是WebRTC时间戳同步问题只有直接调用POSIX接口里面的clock_gettime(CLOCK_MONOTONIC_RAW)才能保证时间漂移几乎为零而其他语言无法做到这一点。 SQLite写操作中使用uint8_t直接操作字节而没有多余对象创建也能提升效率超过C++或其他语言封装方式。PostgreSQL WAL日志写入绕过glibc缓冲区直接写文件也能有效降低CPU占用率大约50%。 你可能会觉得C写起来麻烦但如果你想保证硬件响应时间直接操作硬件寄存器必须谨慎行事每一行代码都不能出错但如果只是写高层应用那就没必要这么麻烦了。 我还试过Zig语言它简洁但底层能力还不够强所以不能完全代替C语言只是可以补充一些死角而已。 这就是为什么不少硬核工程师选择用C来编程是因为它能把控每一条指令让人感觉比高级语言更可靠虽然自动化工具可能继续进步但在那之前C还是最可靠最顺手的工具你怎么看呢?