语言的前世今生 》。作为长期使用 C 语言开发网络游戏服务器的程
序员,云风是有理由写这样一篇文字,不过还是感觉谈的不够深入,C 语言在业界使用的现状
没有怎么描写,有些意犹未尽。在这里想比较系统的谈谈个人对 C 语言学习方式方法的理解。
分别按照书籍、实验环境搭建、网络资源来分别介绍,希望能写的比较完整全面一些,给想学
习 C 语言的朋友一个有价值的参考。
为什么要学习 C 语言?
为什么要学习、使用 C 语言?为什么要学习一个可能比自己都岁数大的编程语言?
我在前面如何学习编程语言的博客文章 http://sunxiunan.com/?p=1597 里提到,选择一门
编程语言,“为什么而学”这个目的是最重要的,目的不明确就没法学好。这也是为什么很多学
生朋友在大学里必修 C 语言却觉得没学明白的原因。因为学习的目的不明确,学习当然也没有
动力。还有一个原因是 C 语言是工程实践性很强的语言,它不是来自某个研究所某个大学学院,
而是实实在在从项目需要中产生,伴随着 Unix 的兴起而流行,语义简明清晰,功能强大而不
臃肿,简洁而又不过分简单,实在是居家旅行工作学习必备之良友。
C 语言相比 C++的优点之一就是最小惊讶原则,一是一二是二,不会在私底下产生一些莫名其
妙的额外产物。用 C++做个例子,比如这样一个函数原型 void
PassWithClassValue(COneClass clsParam1),稍微了解 C++的朋友都会知道,如果你没
有实现 COneClass 的拷贝构造函数,编译器会好心的帮你实现一个,而且在调用这个函数
PassWithClassValue 的时候,偷偷地调用拷贝构造函数产生一个临时对象作为参数传递,对
于某些情况,比如编写操作系统这类必须优化性能的情景下,这些自以为是的东西是非常邪恶
的事情。
C 语言本身只提供必要的语言特性,其它复杂一点功能如文件处理、数学计算等等都以库函数
方式提供,甚至连 malloc、free 这种“必须有”的功能,也是以标准库函数的方式提供,而不是
作为 C 语言核心出现。在伟大的著名的无所不包的《K&R》开头部分就提到了,for 其实可以
通过 while 来完成,只不过 for 可以写的更简洁,言外之意,对于 C 语言 for 其实不是必要的。
跑题一点说,在其它程序语言中 Lua 可以说继承了 C 语言简洁的设计哲学,甚至连 continue
这种几乎必备的关键字都一直拒绝加入,在 Lua 的 maillist 以及 wiki 里都提到过 continue 这
个问题,Lua 语言维护者认为 continue 对于 Lua 而言不是必要的,也不考虑在后续版本中添
加这个关键字。这种简洁哲学也让 C 语言的可移植性、便携性特别优秀,也使得很多嵌入式系
统依然使用 C 语言作为主要编程工作语言。
Java 语言有一个口号:“一次编写,处处运行”,就是跨平台这个噱头。实际上 C 语言从早期开
始就几乎达到了“一次编写,处处编译”,在 ANSI 在 1989 年统一了 C 语言标准以后(称之为
C89),只要特定平台上的编译器完整实现了 C89 标准,而且你的代码没有使用某些特殊的扩
展(GCC 以及微软都有自己的编译器特定扩展),那么代码一定可以编译通过,再实现一下操
作系统相关的函数库,C 语言的移植就是很简单的事情。可以用 Lua 作为例子,Lua 本身是完
全遵循 C89 标准,没有使用任何特定扩展,这也保证了有 C 语言编译器的平台,都可以编译使
用 Lua。可以编译运行 C 语言的硬件平台可以从 A 排到 Z,真是非常有意思的事情。
C 语言也是一个比较少见的应用领域极为广泛的语言。比如编写操作系统这种高难问题,只有
C++、汇编语言可以做到。C 语言可以编写服务器端软件如 Apache、Nginx,或者编写 GUI
程序,如 GTK。大多数程序语言的第一版是通过 C 语言实现,借助前面提到的“一次编写处处
编译”,最大的保证了这些程序语言的可移植性。在 Web 开发领域,C 语言的应用相对较少,