第一课的视频链接点这里
C语言是现在应用最为广泛的编程语言之一,也是现在依然流行的编程语言中历史最悠久的一种之一。在目前业界广泛使用的编程语言中,许多 种语言是以C为基础发展而来。在多类大学的工程类专业尤其是信息类专业的教学计划中,C语言也是极为重要的基础课之一。 而对于一名以编译型语言为主要开发工具的程序员来说,熟练掌握C语言的用法和理论也可以对其他编程语言获得更深的理解。因此,在这一系列教程中我们希望可以深入理解C语言的方方面面,为后续理解更高级的技术奠定更好的基础。
1、参考资料
《C程序设计语言》 Brian W.Kernighan(布莱恩·克尼汉),[美] Dennis M.Ritchie(丹尼斯·里奇)
该书作者Ritchie为C语言的最初设计者之一,Kernighan也是贝尔实验室的高级研究员,C和Unix设计的参与者。这本书作为最经典的C语言书籍之一,其篇幅却短小精悍总共只有两百多页,这得益于作者对C语言无与伦比的深入理解以及简洁精悍的文笔和语言组织能力。多年以来被许多程序员奉为首选参考书籍。
《深入理解计算机系统》Randal E. Bryant,David R.O Hallaren
该书并非直接讲述C语言方面的内容,但是从另一个角度阐述了计算机系统的本质,代码如何影响程序的功能和性能,以及计算机系统的方方面面的深层原理。这本书也因此成为多所世界著名大学的CS专业的指定教材,对于希望晋级为高级程序员的开发者来说也是强有力的助推器。
其他参考书籍:
《C Primer Plus》
C语言经典教程之一,讲述了C语言大量的细节来深刻诠释概念。条理清晰,易于入门,唯一的缺陷是太厚……
《 POINTERS ON C》
对指针这一C语言中最重要的概念提供了深入的讨论
《C Traps and Pitfalls》
从词法分析、语法语义、连接、库函数、预处理器、可移植性缺陷等几个方面分析了C编程中可能遇到的问题,适合初学者获取进一步的编程经验,在编程能力上获得进阶
《Expert C Programming Deep C Secrets》
当对C编程有了一定经验后,可以对进一步提高水平
《Compilers:Principle,Techniques and Tools》和《汇编语言》
对C语言和其他语言理解的终极目标和最高水平是对其汇编和编译的每一个细节了如指掌。达到这个程度,此时便可以称作“精通”和“专家”了。
2、C语言的诞生
C语言诞生的摇篮位于AT&T公司设立的贝尔实验室。AT&T是由著名的亚历山大 · 贝尔与1887年建立的,他在一年前获得有线电话的发明专利。经过多年的发展,AT&T的电话业务逐渐从纽约扩展到美国中部再到美国全国,随后又扩展到欧洲。
AT&T大楼
1925年,AT&T成立了公司的贝尔实验室作为公司的研发机构。由于处于电信业垄断地位的AT&T每年将营业额固定的3%作为研发经费,贝尔实验室的诸多衣食无忧的科学家们在基础科学、通信科学和计算机科学等领域硕果累累,多次获得诺贝尔奖和图灵奖。其中著名的有射电望远镜、半导体晶体管、程控数字交换机、太阳能电池、信息论、C语言和Unix操作系统等,产生了丹尼斯·里奇、肯·汤普森、香农、肖克利等彪炳史册的著名科学家。
贝尔实验室外景
到了1984年,受制于反垄断法,AT&T不得不进行了自我分裂,将市话业务独立为包括西南贝尔公司(SBC)在内的七个小贝尔公司。然而这不是最后一次,到了1995年,为了促进通信设施销售的增长,AT&T一分为三,其中最重要的是将通信设施销售公司朗讯拆分独立上市。然而犹豫2000年互联网泡沫的破裂,大量通信设施销售额变为了坏账,使得朗讯元气大伤。后来,已经日薄西山的朗讯居然再次杀鸡取卵,将无线设备部门再次拆分上市,至此朗讯彻底崩溃,直到最终被法国阿尔卡特收购,变为阿尔卡特·朗讯。值得一提的是在我国国内市场上,该公司依然在积极开展业务,而且有着比较高的知名度,即上海贝尔-阿尔卡特-朗讯。
而与此同时,母公司AT&T也做了同样作死的事,将AT&T无线业务再次拆分上市,此后AT&T也失去了在新时代电信行业的竞争力,直到后来被西南贝尔公司SBC收购。在这几轮拆分中,贝尔实验室先是被划归朗讯旗下,后来由于朗讯已是自身难保,不得不将贝尔实验室的大部分机构关闭,只保留了一个招牌。最终,贝尔实验室随着朗讯被阿尔卡特收购。
虽然贝尔实验室已不复当年的辉煌,但是肯·汤普森和丹尼斯·里奇等人发明的Unix系统和C语言至今依然活跃在计算机与互联网业界。Unix操作系统的最初版本与1971年开发完成,当时该系统还是通过汇编语言实现。后来由于里奇和汤普森认为汇编语言实现操作系统实在太过难以移植,希望通过一种高级语言重新优化Unix系统。最终到了1973年,二人完成了一种新的编程高级语言即C语言,并且很快最新版本的由C语言实现的Unix也问世了。由于远胜过汇编语言的可移植性,C开发的Unix系统对后续的操作系统产生了巨大的影响,其中最著名的就是芬兰人Linus·Torvalds开发的Linux操作系统,这个开源操作系统已经成为现在最流行的操作系统内核之一。由于在这方面的卓越贡献,汤普森和里奇在1983年获得了有“计算机界诺贝尔奖”之称的图灵奖。
肯·汤普森、丹尼斯·里奇和林纳斯·托瓦兹
3、C语言的特点
C语言名义上是一门高级语言,通常可以屏蔽程序对内存、寄存器等物理硬件的操作,在编程时可以专注于实现程序的逻辑功能;但是在需要的时候,C语言依然可以直接对内存地址等物理原件进行操作。自从第三版本的Unix完成以来,C语言到目前也是最适宜做系统开发的编程语言。
相比汇编语言各个指令集所提供的无数种指令,C语言的语法更加精炼。C语言共计提供了39个关键字、9种控制语句、34种运算符。将这些资源合理灵活运用可以实现极为强大的功能,并且不会显著增加程序员的工作负担。
另外,C语言提供了多种强大的数据类型,有整型、实型、字符型、数组类型、指针类型、结构体类型、共用体类型,以及C语言提出的最重要的感念之一——指针等。通过这些数据类型可以实现多种复杂的数据结构,且不会过分影响性能。据测算,通常C语言的编译程序的效率只比汇编程序低不足20%。
作为一种结构式语言,C语言的另一显著特点是代码及数据的分隔化,即程序的各个部分除了必要的信息交流外彼此独立。这种结构化方式可使程序层次清晰,便于使用、维护以及调试。C语言是以函数形式提供给用户的,这些函数可方便的调用,并具有多种循环、条件语句控制程序流向,从而使程序完全结构化。 语法限制不太严格,程序设计自由度大。
4、C语言是否已经过时?一定要学C语言么?
自从C语言诞生之日,至今已有40多年。这么多年里,伴随着新的开发领域和新的业务需求的不断涌现,各种不同的编程语言也是层出不穷。那么今时今日,作为高级编程语言中祖爷爷级的“人物”,C语言是否已经过时?是否还值得现在的学生和新手程序员花大力气去研究呢?如果值得,是不是每个人都应该去学习这门语言?这都是值得思考的问题。
现在,我们看看招聘网站上招聘程序员的需求,满眼都是“iOS”、“Android”、“云计算”、“大数据”、“异构开发”、“数据挖掘”、“分布式系统”等等一堆高大上的名词,现在只会C语言,的确在找工作的过程中缺乏很大的灵活性和选择空间。但是这并不代表着C语言已经过时。从TIOBE编程语言排行榜的榜单上可以看出,经过了这么多年,C语言依然牢牢占据榜单前两位的位置,甚至曾经多次冲到榜首。其操作低层设备的能力、对bit进行操作的能力是大多数高级语言所不具备的,因此C语言在嵌入式开发等领域始终占据不可撼动的统治地位;另外,由于相对于其他高级语言,C语言显得更加贴近硬件,且效率更高,因此也是系统级编程的不二选择。
2015年11月TOBIE编程语言排行榜
那么是否每个程序员都必须要学C?其实也不尽然。对于网站、前端开发,PHP开发,HTML+CSS+JavaScript以及其他一些以解释型语言为主要开发工具,以及其他一些对底层、系统原理要求不高的程序员来说,C语言不是必选项。而对于底层开发(如驱动)、嵌入式开发、Windows开发,以及其他以编译型语言(如C/C++/C#/Objective-C)为主要开发工具的程序员来说,不熟悉C语言必然会对后面的学习造成极大的困难。我们可以肯定的是,对于每个软件工程师,将C语言学至“精通”的程度都是有百利而无一害的。
5、如何学好C语言?
- 选择合适的参考书。其实对于大部分编程技术来说,最好的办法是直接从又一个实战项目开始着手,边做边学。但是对于C语言这样比较基础,而又有必要学至精通的技术,找一本靠谱的参考书还是很重要的,这样可以保证知识体系的连续性和完整性,在后期学习更加高级的技术时可以奠定较好的基础。
- 多看代码,多敲代码。“纸上得来终觉浅,绝知此事要躬行”。作为一门编程语言,只是看书不亲自去写程序,想学好C语言是万万不可能的。想要深入理解,务必要亲自动手去写足够多的C代码,并且最好可以养成单步调试运行的习惯。
- 理解数据结构和算法理论。C语言只是一种工具,如果单纯只是学习这门语言那么不但个人竞争力是非常孱弱的,而且对语言的理解也不会很深入。只有深入理解了数据结构和算法理论之后,C语言才有机会真正实现它的强大功能。也就是说,编程语言只是程序的肉体,算法和数据结构才是程序的灵魂。
- 理解汇编语言和编译原理。作为一种高级语言,C语言是需要编译过后才能运行的。希望真正理解C的精髓,需要明白C语言是如何编译称为汇编语言,汇编语言又是如何操作计算机硬件的。只有理解了汇编和编译原理,才能打通高级语言和低级语言、程序与硬件之间的两堵墙,真正掌握程序开发的灵魂。
- 研究C语言开发的开源工程。各种各样的开源工程可以说是编程语言的终极应用,如果可以熟悉几个比较著名的开源工程甚至参与其中的话,那么就可谓达到炉火纯青的境界了。
- 应用,使用学会的C语言进行更高级的开发,如桌面客户端、服务器程序、网络应用等。在可以将业务需求理解转换为技术需求,并且将其实现出来,且没有bug,此时便已经达到了集大成的境界,完全可以依此去找一份软件开发工程师的工作了,而且基本可以保证十分称职。
综上所述,我们知道,C语言其实比较容易入门,但是如果希望学成专家并将其在技术开发中融会贯通,其实是难上加难。所以在学习的过程中我们需要耐心、专注、意志,不为暂时的困难所吓倒,勇敢地解决掉问题,相信每个有志者都可以成为专家级的人才。