新特性会迅速融入 C 语言社区。
C 语言从语言角度上讲,最大缺陷在于要求程序员自己去做内存管理。用 C 语言去处理复杂的数据结构,程序员大部分的时间都花在了这上面,并且滋生了无数 bug 。调试 C 程序变成了一项独立于编写 C 程序的技能。防止缓冲区溢出、防止数据读写越界、正确的动态回收内存、避免悬空指针,这些在大部分语言看起来不可思议的关注点,在 C 语言程序员眼里变得稀松平常。甚至是衡量 C 程序员技能经验水平的重要标志。可要知道,这些和具体问题的解决过程无关。
也有人试图在 C 语言层面解决这个问题,例如以库形式提供垃圾回收的机制(笔者也曾做过类似尝试)。但 C 语言本身的设计使它无法成为一个完美的解决方案。同样的问题也存在于 C++ 。现在看来,不对语言做大的改造,很难回避。可改造本身又违背了 C 语言一贯的哲学。C 语言的发明人之一的 Ken Thompson 近年来参与了新的 Go 语言的设计和实现,可以看成从另一角度对新的程序开发语言的尝试,可那已经不是 C 。
这个问题在一定程度上也促使了 java 的诞生。Java 采用了虚拟机和字节码的方式改造了底层的机器模型。并在底层模型的基础上加入了垃圾回收机制。并在语言层面取消了指针。在 C 语言的原生地,也有更多的动态(脚本)语言出现。先是有 awk 这样的简易语言,后有 perl ,再是 python 等的流行。在 Unix 风格下,程序员倾向于为特定领域设计特定的语言。C 和 Unix 的设计哲学是一体的。它们都鼓励清晰的模块化设计。让模块之间独立,再用薄的胶合层联系起来。脚本语言在现代类 Unix 系统上大量出现,并充当这种粘合工作就是一种发展必然。而原本的充当粘合部分的脚本语言,也逐步发展起来,远远超出脚本的用途范畴。做为程序员,尤其是 C 程序员,必须对它们有所了解并掌握其中的一些,才能适应现代的挑战。
我们不应该指望一门语言解决所有的问题。可至于 C 语言本身,它将在很长的一段时间,带着它的优雅和缺陷,继续扮演它在计算机世界中重要的角色。