再过四年,C语言将迎来它的 50 岁生日,同样进行周年庆的还有 PL/M和Prolog。不过,C语言至今仍然非常受欢迎,它在几乎所有编程语言中的受欢迎程度,始终排在前十名。
大多数操作系统的内核(包括 Windows,MAC,Linux,IOS 和 Android 等)都主要由使用C语言实现。此外,python 的 CPython 解释器,perl,ruby,差不多一半的 R 语言,以及 mysql 的 MysAm 代码,甚至 java 的第一个编译器都是使用C语言编写的。
几个月前,新的 C语言标准——C18 获得批准,只要 198 法郎(瑞士货币单位)就可以购买 ISO/IEC 9899:2018标准,共520页。当然,也可以在 openstd 上免费查看该标准的最终草案。
不过,可能只有开发C语言编译器的人,或者对编译器非常感兴趣的人才会去了解吧,哈哈。
新的C语言标准 C18 并没有添加什么新功能,更多的只是修复,所以它在很大程度上可以说是 C17 的延续。对C语言最后一个主要更改是在 C11 中,包括新增对变长数组、多线程、更好的 Unicode、匿名结构体和联合体等的支持。
C语言和C++打了个平手
C++ 在 C语言的领域中取得一些进展,特别是自从 C++11 中增加了移动语义,如果能够正确使用该语法,在处理指向大对象的指针时,C++能以更小的开销,带来更好的性能,并且C++也能够在传统的嵌入式C语言领域使用。
但是,C++程序代码编译后通常还是会比C语言的大一点,因为C++增加了异常处理,以及内联模板等C语言没有的机制。例如在 Visual C++ 2017 的 release 模式编译下面这段C++代码:
#include <iostream>
int main()
{
std::cout << "Hello world" << std::endl;
return 0;
}
最终得到的 exe 可执行文件的大小达到 10752 字节。再来编译相同功能的 C语言代码:
#include <stdio.h>
int main()
{
printf("hello world\n");
return 0;
}
得到的 exe 可执行文件大小为 9216 字节,只有 C++ 程序的 85%。这里的差别还不是特别大,但是可以肯定的是,使用C++编程时,一旦加入了其他类,它与C语言程序大小的差异会越来越大。
代码大小非常重要,因为物联网(IOT)设备的数量越来越多,微控制器的使用也越来越多,要知道这些微控制器的 RAM 和 ROM 通常都是千字节级别的。所以在嵌入式领域,C语言在2005年至2018年期间获得的市场份额实际上是有所提升的。
C语言是编程界的通用语言
就像现实生活中,英语是世界是的通用语言一样,C语言是编程语言界的通用语言。许多其他编程语言编译器输出的其实是 C 语言代码,由C语言编译器进一步生成可执行程序。这不难理解,因为C语言是最低级别的可移植语言。(唯一更低级别的汇编语言与 CPU 紧密相关,不方便移植。)
Github 项目页面上列出了大约 60 个开源编译器,一小部分是 C++ 的,但是C语言占绝对的主导地位。
使用C语言提升效率
python 是如今最流行的编程语言之一,但是因为它是解释型编程语言,同时也受它的动态变量的影响,所以 python 程序的运行效率一直是一个痛点。使用过 python 进行大数据处理的朋友应该知道 numpy、scipy 等库可以提升效率,而 numpy 库就是由 C语言实现的。python 的标准实现是 CPython,它的主要库也是由 C语言(少许C++)实现的。
C语言是“九阳神功”
C语言可能不是每个编程初学者想学的第一编程语言,但是作为第二、第三编程语言,C语言一直很流行。我把它看做编程界的“九阳神功”,学会C语言后,再学其他编程语言都如有神助。
小结
至少在底层硬件设备驱动层,C语言还未逢对手。另外在操作系统内核开发中,C语言也几乎是唯一选择,特别是在 Linux 上,C语言还将存在很长一段时间。
如今,尽管 Go 语言和 Rust 的呼声很高,但是当超过一半活跃的 Web、 服务器运行的是 Apache 和 nginx,它们都是C语言编写的,如今已经存在近 50 年了。