《C程序设计新思维》封面上的动物是斑袋貂(Spilocuscus maculatus),一种生活在热带澳大利亚、新几内亚和附近的小岛的雨林和红树林的有袋目哺乳动物。它头部圆形,耳朵小而隐藏,皮毛厚实,有一条有助于攀援的可卷曲的尾巴。卷曲的尾巴是典型的特征;尾巴上部贴近身体的部分覆盖绒毛,而下半部分的内侧覆盖粗糙的鳞甲,适合抓住树枝。它的眼睛可以看到黄色、橙色到红色,视野像蛇一样狭窄。
斑袋貂通常非常胆小,所以很少被人发现。它是夜间活动的,在夜间捕猎和进食,白天在树枝上自己搭建的巢穴睡眠。它行动缓慢,有时很懒——因此经常被误认为是树懒、负鼠,甚至是猴子。
典型的斑袋貂是独居动物,独自筑巢和进食。与其他个体,特别是具有竞争性的雄性之间的互动,常是有侵略性和冲突性的。雄性斑袋貂以气味标识它们的领地以警告其他雄性,从他们的身体和气味排泄腺散发出穿透性的麝香气味。他们在树枝和嫩枝上散布唾液以通知他们领地的其他个体以缓冲相互交往。如果他们在自己的领地遇到其他的雄性个体,他们会发出吠叫、咆哮和嘶叫的声音,并且直立起来保护他们的领地。
斑袋貂具有非特异性的牙齿排列,使得他们可以食用很宽范围的植物产品。已知它们可以吃花朵、小动物,并且偶尔也吃蛋。斑袋貂的天敌包括蟒蛇和一些掠食性鸟类。
C程序设计新思维作者对《C程序设计新思维》的解说
Q:这本书与其他书有什么不同?
A:C语言的教科书都非常相像(我曾经读过很多这样的教科书,包括[Griffiths, 2012]、[Kernighan,1978]、[Kernighan,1988]、[Kochan,2004]、[Oualline,1997]、[Perry,1994]、[Prata,2004]和[Ullman,2004])。多数教材都是在C99标准发布并简化了很多用法之后写成的,你可以看到现在出版的这些教材的第N版仅仅在一些标注上做了一点说明,而不是认真反思了如何使用这门语言。他们都提到你可以拥有一些库来编写你自己的代码,但是他们都是在现在常用的、可以保障库的可靠性和可移植性的安装与开发环境之前编写的。那些教科书现在仍然有效并且具有自己的价值,但是现代的C代码已经看起来和那些教科书里面的不太一样了。
这本书与那些教科书的不同,在于对这门语言及其开发环境进行了拾遗补漏。书中讲解的方式是,使用提供了链表结构和XML解析器的现成的库,而不是把这些从头再写一次。这本书也体现了如何编写易读代码和用户友好的函数接口。
Q:这本书的目标读者是谁?我需要是一个编程大师么?
A:你必须有某种语言的编程经验,或许是Java,或者类似Perl的某种脚本语言。这样我就没有必要再和你讲为什么你不应该写一个很长的没有任何子函数的函数了。
你最好有一定的C语言基础,但是没有必要特别精通——既然我将描述那些细节,如果你从来没有学过它们也许更好。如果你是白纸一张,只是对C语法充满敬意,那它还是非常简单易学的,而且你也可以用搜索引擎找到很多在线教材;如果你有其他语言的经验,用一两个小时就可以基本掌握。
请允许我介绍我写的另一本关于统计和科学计算的教科书,Modeling with Data[Klemens,2008]。那本书不仅提供了很多关于如何处理数值和统计模型的内容,它还可以用作一本独立的C语言的教材,并且我认为那本书还避免了很多早期教材的缺点。
Q:我是个编写应用软件的程序员,不是一个研究操作系统内核的人。为什么我应该用C而不是像Python这类可以快速编程的脚本语言呢?
A:如果你是一个应用软件程序员的话,这本书就是为你准备的。我知道人们经常认定C是一种系统语言,这让我觉得真是缺少了点punk的反叛精神——他是谁啊?要他告诉我们要用什么语言?
像“我们的语言几乎和C一样快,但更容易编写”这样的言论很多,简直成了刻板的套话。好吧,C显然是和C一样快,并且这本书的目的是告诉你C也比以前的教科书所暗示的那样容易使用。你没必要使用malloc,也没必要向20世纪90年代的系统程序员那样深深卷入内存管理,我们已经有处理字符串的手段,甚至核心语法也进化到了支持更易读的代码的境界。
我当初正式学习C语言是为了加速一个用脚本语言R编写的仿真程序。和众多的脚本语言一样,R具有C接口并且鼓励用户在宿主语言4太慢的时候使用。最终我的程序里有太多的从R语言到C语言的调用,最后我索性放弃了宿主语言。随后发生的事情你已经知道,就是我在写这本关于现代C语言技术的书。
Q:如果原本使用脚本语言的应用软件程序员能喜欢这本书当然好,但我是一名内核黑客。我五年级的时候就自学了C语言,有时做梦都在正确编译。那这本书还有什么新鲜的么?
A:C语言在过去的20年里真的进化了很多。就像我下面要讨论的那样,像“要支持所有C编译器”等必要的工作准则也变化了不少,因为自从ANSI标准发布后又发布了两个新的C语言标准。也许你应该读一下第10章,找找有什么能叫你感到惊讶的。
并且,开发环境也进化升级了。Autotools已经改变了代码发布的方式,意味着可以更加可靠地调用其他的库,意味着我们的代码可以花费更少的时间在重建常用结构和函数上,而是更多地调用本书下面将讨论的库。
Q:我实在忍不住要问,为什么这本书中差不多有三分之一的篇幅都没有C代码?
A:的确。良好的C实践需要具备精良的C工具5。如果你没有使用调试器(独立的或者集成在你的IDE中),你就是在自讨苦吃。如果你告诉我追踪内存的泄露是不可能的,那么就意味着你还没有听说过Valgrind,一个用来确切地指出是哪一行产生内存泄漏并发生错误的系统。Python及其附带工具有内建的包管理器;而本书将告诉你,属于C的、事实上的跨平台打包系统,即Autotools,它是一个独立的系统。
如果你在使用一个不错的集成开发环境(IDE)作为这些工具的调用界面,你仍然可以从了解“IDE如何处理环境变量以及其他隐藏的细节,同时还能为你处理错误抛出”等问题中受益。
Q:你所谈论的一些工具有点老了。难道没有更现代的工具能替代这些基于shell的工具么?
A:如果我们嘲笑那些仅仅因为事物是新的就对其抵制的人,那么我们也没有理由仅仅因为事物是旧的就加以抵制。
其实很容易找到可靠的来源证明第一件六弦的吉他出现在1200年左右,第一个四弦的小提琴出现在大约1550年,带键盘的钢琴出现在1700年左右。有趣的是,你今天听到的多数(如果不是全部)音乐都与以上乐器中的某种有关。Punk rock当初并没有拒绝吉他,只不过用得更加有创造性,比如将吉他的输出接连到新的滤波器上。
Q:我能上Internet,一两秒的功夫就能找到命令和语法的细节。那么说真的,为什么我还要读这本书?
A:的确。在 Linux或Mac机器上你只要用一个带有 man operator 的命令行就能查到运算符优先级表,那么我为什么还要把它放在这本书里?
我可以和你上同样的Internet,我甚至花了很多的时间阅读网上的内容。所以我有了一个之前没谈到的、准备现在讲的好主意:当介绍一个新工具的时候,比如gprof或者GDB,我给你那些你必须知道的方向,然后你可以去自己习惯的搜索引擎中查找相关问题。这也是其他教科书所没有的。
C语言已经有40年的历史了。经过长时间的发展和普及,C语言应用场景有了很大的变化,的一些旧观念应该被淡化或者不再被推荐。
本书展现了传统C教科书所不具有的最新的相关技术。全书分为开发环境和语言两个部分,分别从编译、调试、测试、打包、版本控制等角度,以及指针、语法、文本、结构、面向对象编程、库等主题,对C程序设计的核心知识进行查缺补漏和反思。本书鼓励读者放弃那些对大型机才有意义的旧习惯,拿起新的工具来使用这门与时俱进的简洁语言。
本书适合有一定基础的C程序员或C语言学习者阅读,也适合想要较为深入地理解C语言特性的读者参考。
关于作者:
Ben Klemens为布鲁金斯学会、世界银行、美国国家精神健康中心和美国政府编写统计分析和计算机模型。他与布鲁金斯学会和自由软件基金会一起合作,确保程序员保留其作品使用权的权利。
专家评论:
“你的C语言开发环境还是只有vi和cc么?C语言的内存管理还是像20世纪90年代那样对你来说是场灾难么?Ben Klemens可以帮你解决这些和其他常见问题,并展示出新的工具是如何使C编程更加容易的——帮助你调试、跟踪内存泄流、组织编译过程和管理源代码版本。”
——Dave Kitabjian,NetCarrier Telecom软件开发总监
网友评论