栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

第一章 程序设计ABC

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

第一章 程序设计ABC

如果早几年写这本书,可能作者还要列举一些轰轰烈烈的计算机推动产业的例子。但今天不同了,己经不需要了,因为几乎所有的人都已经体会过 IT 所节来的成功与便利。但我要说的是,即使你每天与计算机和网络为伴,你所体会的还只是冰山一角。
从某种程度看,IT 业更像发电厂、自来水厂,是其他行业的支持者。IT业纵深研究的主要目的之一,是为其他行业提供更好的服务。这种努力的结果已经显现出来,各行各业几乎都开始逐渐离不开IT了。例如,在自动控制领域,计算机的出现简直令其改天换地。因为这一领域主要应用嵌入式系统 (Embedded System),而且实时性要求高,所以这个行业里的程序员对 C/C++语言及计算机底层技术的掌握程度甚至超过了绝大多数计算机专业人士。再如玩钢筋水泥的建筑业,对建筑师来说,鼠标已成为安全帽以外的另一个标配。如果不用计算机画设计效果图,不用软件仿真各种应力对建筑的影响,那么这个建筑师就落伍了。国外的众多建筑公司协同软件公司开发了很多非常流行的专用软件,为建筑这一最古老的工程行业带来了新的动力。国内也正在做这方面的努力。这样看来,“水泥+鼠标”绝不仅仅是网络泡沫下 IT人士的理想,而在另一领域,“听诊器+鼠标”则成了医生的一个梦。生物医学技术的飞速发展同样依靠IT技术。例如当前的研究热点基因组图谱工程,其工作量巨大,如果
没有计算机的帮助,几乎不可能完成。在医学上,CT、核磁共振和彩超等医疗器械也广泛使用了计算机技术,未来的远程医疗将更加依赖IT。IT 对其他学科有影响,而反过来,其他学科对 IT 也有影响。例如,“DNA 计算机”就是利用生物技术建造的全新架构的计算机,它成本更低、速度更快、容量更大,在一些领域很可能完全替代现有的计算机。再如,计算机科学里很重要的一个方向软件工程,它从建筑工程里借鉴了很多宝贵的管理、设计经验。在计算机专业,现在有越来越多的研究方向是与生物、机械、控制、管理等相结合的交叉方向。由此可见,不管未来是什么样的世界,它都离不开 IT。不管读者从事什么工作,IT 都将是你的有力工具。2015 年,李克强总理站在国家战略层面提出的 “互联网+”的概念,强调互联网技术与传统行业的融合和应用,正印证了这一点。

嵌入式系统:简单地说,将计算机嵌入到另一个系统里,控制那个系统工作,就是嵌入式系统。典型的嵌入式系统有机器人、手机和智能家电等。这是IT 未来的主要发展方向之一。

网络泡沫:20 世纪末,随着Internet 的发展,网络经济迅速崛起,很多年轻的网络公司很快壮大起来,其股票市值扶摇直上。21 世纪初,因为这些公司中的绝大部分都不赢利,股票开始大幅下跌,投资人信心崩溃,“网络泡沫”破灭,众多网站合并、倒闭或惨淡维持。那时诞生了一个观点,就是互联网要和传统行业结合发展,也就是所谓的 “水泥+鼠标”。

1.2计算机与程序设计语言

计算机很神奇,其魔力可用古老的中国哲学《易经》来解释。“易有太极,是生两仪,两仪生四象,四象生八卦,八卦定吉凶,吉凶生大业。”“吉凶”与“大业”可代表世间万物,《易经》中的这句话阐述的哲学观点是,万物起源于 “两仪”,也就是“阴阳”。按此观点,如果计算机想 “什么都能干”,想控制万物,那么它只要抓住万物的本质—“阴阳”就可以了。计算机确实以“阴阳”为根本,并把二者表示成“0”和“1”,命名为“二进制(Binary)”。
二进制是否源自于《易经》,各界人士有很多论战,并无定论,有兴趣的读者可以从网上搜索一下相关文章,但计算机靠二进制来表达万物确是真的。
计算机为什么用二进制呢? 为什么不用我们日常然悉的十进制?一方面,二进制在电器元件中容易实现。二进制只有0 和1两个数,在电学中具有两种稳定状态,并可以用0和1表示的东西很多。例如,电压的高和低、电容器的充电 与放电、豚油的有与无、晶体管的导通与械止,等等。而要找出具有10种稳定状态的电子元件则是很因难的。另一方面,二进制数的加法运算规则只有2²=4 条,非常简单,而十进制数的加法运算公式从 0+0=0到9+9=18共有加法运算法则10²=100条。显然,计算机进行二进制数运算比进行十进制数运算要简单得多。
英文里“Computer”是 “Compute(计算》” 加“er”后缀派生而来的,直译过來就是“计算的机器,简称计算机。从名字上看,计算机不过是一合机器,它只会计算,事实上也确安如此。它把万物都表达成二进制数0与1的排列组合的形式,形成一个个二进制数序列,然后用各种运算手段对这些数序列进行计算,结果还是二进制数序列。这样做看上去并不复杂,你我稍加学习都能做到同样的事情,但是我们都没有计算机算得快、记得多,且不知疲倦,所以计算机大有用处。
正因为计算机只会计算,所以专门研究计算的数学在计算机科学中是很重要的。现实世界中的各种过程都被抽象成数学模型,表达成一个个数学公式;各种事物都用数字表示,代入公式中求解。这里面的奇特原理,实非本书所要阐述的重点,若读者有兴趣,可以广泛闭读其他专业资料。本书在后面的章节也会简单地介绍这方面的知识。
不管多么复杂的算式,计算机都能算。怎么让计算机知道你想让它算什么呢?最理想的情况是对着它说一声:“嗨,计算机,帮我把 《高等数学》第12页第 25 题做了。”答案马上打印出来,甚至直接用电子邮件发给老师。不过目前计算机还做不到,但将来肯定能做到。这里面的主要问题是,计算机听不懂“人话”。
你可能用过 iPhone 内置的 Siri 软件,它能根据人的语音指示去回答问题、搜索资料、安排日程等。例如你可以对着手机说:“siri,附近哪里有麦当劳?”siri 就会在手机地图上为你标记最近的麦当劳餐厅的位置,并指明路线。看上去好像计算机己经理解了我们说的话但其实它的“理解力” 非常有限,准确度也不高。如果发音稍有含糊,遣词造句也不够大众化,问题又比较生僻,siri 就很难给出想要的结果,甚至会闹笑话。为什么会这样? Sir是套非常复杂的系统,集成了语音识别、自然语言处理和搜索等顶尖技术。这些技术都是用计算机语言编写的程序实现的,这些程序没有“智能”,只会将用户说的话和内置的各种模式匹配。如果匹配对了,就做对应的动作,否则就会犯错。整个过程是先要有人懂计算机语言,用计算机语言对计算机说话(编写程序),再一点点地教计算机学会人类的语言(完善各种模式)。因为人类的表达和思维都太多样了,所以不可能穷尽所有的模式,计算机也就不可能完全精确地理解人类的语言(为了做到“精确”,联想公司的“乐助理” 采用了比较有喜感的“人肉〞方式,由真正的人听用户的语音,再做出反应)。那么精确控制计算机的唯一途径,就是我们学习并掌握计算机语言,也就是“程序设计语言”。
在弄清程序设计语言之前,我们先看一看计算机是如何工作的。
1946 年,冯·诺依曼在总结前人工作的基础上,率先在计算机中采用二进制,并且提出了著名的 “冯·诺依曼机” 结构。这一结构至今仍然被几乎所有的计算机采用,他也因此被誉为 “计算机之父”(图 1-2)。

冯·诺依曼 John von Neumann (1903—1957),生于匈牙利的布达佩斯,是20 世纪最杰出的数学家之一,现代计算机之父。

图1-2 冯·诺依曼和世界上第一台计算机——ENIAC

冯•诺依曼机,把计算机简化为控制器、运算器、存储器、输入和输出设备五个部分。控制器和运算器就是 CPU,它被比作计算机的大脑;存储器被分为内存和外存两部分,它们使计算机具有记忆能力;输入设备就是计算机的耳朵和眼睛,是人给计算机发送指令的工具,如键盘、鼠标;输出设备是计算机给人反馈结果的设备,如显示器、打印机。
人与计算机的一次对话是这样完成的:用户从键盘输入程序和数据 (程序就是用计算机语言书写的指令集合),程序和数据被存入计算机的内存中;然后由 CPU逐一读出每条指令、数据,按指令对数据进行运算;运算的结果写回内存中,并显示给用户。如果用户认为有长久保存结果的必要,则将其存入外存备用。
硬盘、磁盘等均为外存,它们与内存的主要区别是数据可以长久保存。内存在每次计算机关闭后都会丟失所有数据,而外存则不会。外存除了可以保存数据外,也可以保存程序。使用过计算机的读者应该知道,想运行某个程序,只需在命令行中输入程序名,或者在窗口中双击该程序的图标即可,并不需要输入程序代码。这些程序就是预先保存在外存中的,用户需要运行它时,只要发出运行命令,它们就被读入内存中,然后按照上面的过程执行
图1-3是一个简化了的计算机工作过程示意图,计算机的实际工作过程当然比这复杂得多,但它还是完整地体现了其基本工作原理,尤其体现了 “软件指挥硬件”这一根本思想。在整个过程中,如果没有软件程序,计算机什么也干不了,可见软件程序多么重要。而且,如果软件程序编得好,计算机就运行得快且结果正确;如果程序编得不好,则可能需要运行很久才出结果,而且结果还不一定正确。程序是软件的灵魂,CPU、显示器等硬件必须由软件指挥,否则只是一堆没有灵性的工程塑料与金属的混合物。这本书就是要教会读者怎样用 C语言又快又好地编写程序(软件)。


图1-3 简化了的计算机工作示意图

1.3 程序设计语言的故事

计算机直接能够读懂的语言是机器语言(Machine Language),也叫机器代码 (Machine
Code),简称机器码。这是一种纯粹的二进制语言,用二进制代码来代表不同的指令。
【例1.1】 下面这段程序是用我们通常使用的x86 计算机的机器语言编写的,功能是计算 1+1。

10111000
00000001
00000000
00000101
00000001
00000000

x86语言:美国 Intel 公司推出的系列CPU 统称为 x86 CPU。 使用x86 CPU 的计算机被称为 ×86 计算机。目前绝大部分个人计算机都使用这个家族的 CPU 或者兼容其指令系统的 CPU。早期的 286、386、486 及现在流行的奔腾(Pentium)系列都在此列。

这段程序是不是给你一种看“天书的感觉? 在最早的用拨钮开关和纸带打孔的方式局向计算机输入程序的时代,程序员编写的都是这样的程序。很明显,这种程序编起来费我力气,人类很难读懂。从那时候起,让计算机能够直接懂得人的语言就成了计算机科学家们梦麻以求的目标。
有人想出了这样的办法,编一个可以把人类的语言翻译成计算机语言的程序,这样计算机就能读懂人类语言了。这说起来容易,做起来难。就拿计算 1+1 来说,人们可以用“1+1等于几”、“算一下 1+1 的结果”、“1+1得多少”…多种说法,再加上用英语、法语、日语、韩语、爪哇语等来描述。如果想把这些都自动转换成上面的机器码,是可望而不可即的。所以人们退后一步,打算设计一种中间语言,它还是一种程序设计语言,但比较容易翻译成机器代码,且容易被人学会和读懂。于是诞生了 “汇编语言 (Assemble Language )”
【例1.2】用汇编语言计算 1+1。

 MoV AX, 1
 ADD AX, 1

这个程序的功能是什么?从程序中 ADD 和1的字样,或许我们能猜个大概。没错,它还是计算 1+1 的。这个程序经过编译器(也是一个程序,它能把 CPU 不能识别的语言翻译成 CPU 能直接识别的机器语言)编译,就会自动生成例1.1的程序。这己经是很大的进步了,但并不理想。这里面的 MOV 是什么含义?好像是Move 的缩写。这里的 AX 又代表什么?这是一个纯粹的计算机概念。从这个小程序,我们能看出汇编语言虽然已经开始贴近人类的语言,但还全然不像我们所期望的那样,里面还有很多计算机固有的东西必须要学习。它与机器语言的距离很近,例1.2 的每行程序都直接对应例 1.1的三行代码。也许以后你有机会学习、使用汇编语言,那时你将学到更多有关计算机内部的知识。
程序设计语言要无限地接近自然语言,所以它注定要不停地发展。此时出现了一道分水岭,人们把机器语言和汇编语言称为低级语言,把以后发展起来的语言称为高级语言。低级语言并不比高级语言“低级”,而是说它与计算机(硬件)的距离的级别比较低。高级语言高级到什么程度呢?我们先看一个很著名的高级语言——BASIC 语言,怎样完成 1+1 的计算。
【例1.3】 用 BASIC 语言计算并显示 1+1。

 PRINT 1+1

怎么样?如果你不知道英文 PRINT 的中文意思,马上查字典吧。比起前两个例子,它确实简单了不少,而且功能很强。前两个例子的计算结果只保存在 CPU 内,并没有输出给用户。就算你拿纳米显微镜往里看也看不到。这个例子直接把计算结果显示在屏幕上,它才是真正功能完备的程序。如果让你把计算 1+1 改成计算10-8,能想出来怎么改前两个程序吗?第三个程序呢?相信读者很快就体会到了高级语言的魅力。
因为高级语言易学、易用、强大,所以它发展很快,其种类己经不能用“百家争鸣”来形容。据一位民间人士 Bill Kinnersley 耗时多年的不完全统计,目前己经有超过 2500 种计算机语言,其中绝大多数都是高级语言。

1+1改成10-8:改为“PRINT 10-8” 即可。另两个程序要分别改成“10111000 | 000010 | 01 00000000 | 00101101 | 00001000 | 00000000” 和"MOV AX. OA | SUB AX. 08"。
2500种高级语言: 在ttp://people ku.edu/~nkinners/LangList/ Extras/anglist.htm 可以看到这 2500 种语言的列表和简介。另外,网站http://www.levenez.com/lang/搜集了大约 50 种极具代表性的语言故事和资料,它们都正在或曾经叱咤风云。

1.4 C语言的故事

高级语言门类繁多,其中影响最大的是 C语言;高级语言此起彼伏,其中寿命最长的也是C语言。Tiobe 每个月都会统计各种程序设计语言的受欢迎程度。图1-4是2001年到 2016年的统计图,可以看到C语言始终稳居前两位。


图1-4 截至 2016 年编程语言受欢迎程度趋势

20 世纪 60年代,美国 AT&T公司贝尔实验室(AT&T Bell Laboratory)的研究员 Ken Thompson(如图1-5 所示)闲来无事,手痒难耐,想玩一个他自己编的、模拟在太阳系航行的电子游戏——Space Trave1。他背着老板,找到了一台空闲的机器——PDP-7。但这台机器没有操作系统,而游戏必须使用操作系统的一些功能,于是他着手为 PDP-7开发操作系统。后来,这个操作系统被命名为——UNIX.
1971 年,同样酷爱 Space Travel 的 Dennis M. Ritchie为了能早点儿玩上游戏,加入了Thompson 的开发项目,合作开发 UNIX。他的主要工作是改造 B语言,使其更成熟。后来这个语言被命名为 C 语言。

Space Trave1:这个游戏是真实存在的,请参考 http://cm.belllabs.com/cm/cs/who/dmr/spacetravel .html。
Dennis M. Ritchie:生于1941年,卒于 2011年10月,C语言发明人。后人评价道:“他的名宇并非耳熟能详,但是,如果你用显微镜来仔细观察一台计算机,会发现到处都有他做的贡献。

1973 年年初,C语言的主体完成。Thoropson 和 Riichie 迫不及待地开始用它完全重写了UNIX。此时,编程的乐趣使他们已经完全忘记了那个 Space Trave,一门心思地投入了UNIX和C语言的开发中。随者 UNIX 的发展,C语言自身出在不断地完普。直到今天,备种版本的 UNIX 内核和周边工具仍然使用C语言作为最主要的开发语言,其中还有不少继承来自 Thompson 和 Ritchie 之手的代码。
在开发中,他们还考虑把 UNIX 移植到其他类型的计算机上使用。C语言强大的移植性(Portability)在此显现。机器语言和汇编语言都不具有移植性,为 x86 开发的程序,不可能在 AlphaSPARC 和 ARM 等机器上运行。而C语言程序则可以在任意机器上运行,只要那种计算机上有 C语言编译器和库。
C语言继续发展,在 1982年,很多有识之士和美国国家标准协会 (American National Standards Institote, ANSI)为了使这个语言健康地发展下去,决定成立C 标准委员会,建立C语言的标准。委员会由硬件厂商、编译器及其他软件工具生产商、软件设计师、顾问、学术界人士、C语言作者和应用程序员组成。1989年,ANSI 发布了第一个完整的 C 语言标准:ANS1 x3.159-1989,简称C89,不过人们世习惯称其为 ANST C。 C89 在1990 年被国际标准化组织 ISO (International Organization for Standardization)一字不改地采纳,所以也有C90 的说法。1999年,在做了一些必要的修正和完善之后,ISO 发布了新的C语言标淮,命名为 ISO/EC 9899:1999,简称 C99。
C99 之后,C语言的发展基本停止。直到今天,C的标准文档只在字面上做过两次少量的修订,最新版 C11 于 2011年生效,http://wwww.open-std.org/jtc1/sc22/wg14/提供免费下载。此文档是对C 语言最精准的描述,所有关于C语言的疑惑都可以在其中找到答案。因为 C11和C99区别并不大,而C99 的影响更深远,所以业内交流通常只会提 C99。
C99虽然修正了 C89 中很多不完善甚至被广泛诟病的地方,但它扩展的一些新特性在实践中并不被看好,编译器对其进行支持的进度也比较缓慢。相对而言,支持 C89 的编译器就遍地开花了,大多数教科书、资料也都是以 C89为核心进行讲述的,大量的软件也根据 C89标准编写,所以本书也以 C89 为蓝本讲述,但适当时候会对 C89 不完善的地方加以说明,并介绍 C99 的改进。值得一提的是,1983年,Thompson 和Ritchie 共同获得了图灵奖。虽然这个奖项的授予是因为他们在 UNIX 上的开创性工作,但谁也不能忽视C 语言在其中发挥的巨大作用。图1-5中,Thompson(左)和Ritchie(右)
在1999年接受前美国总统克林顿授予的国家技术勋章。

UNIX 的发展有很多分支,产生过多种流派,可以参见 http://www.levenez.com/unix。

图 1-5 Thompson(左)和 Ritchie(右)在 1999年接受前美国总统克林顿授子的国家技术勋章

看了上面的讲述,如果你认为C语言就是用来开发 UNIX 的,那可就大错特错了。它是一种通用语言,任何想让计算机做的事情,都可以用它编程实现。你可不要小看这个能力,2500 种计算机语言中,真正“什么都能做”的语言很少。例如开发操作系统,除了C语言和马上会讲到的 C++语言以外,还没有任何一个成熟的系统(包括 Windows、 Linux 、ios 和Android) 采用其他高级语言 (这样说有些武断,笔者的能力确实无法做一个最完备的统计。在能力所及范围内,此论点成立)。而且现在使用 C++语言开发操作系统的也是风毛麟角,还不是用于做关键的核心开发,由此,C语言的能力可见一斑。在很长时间内,c 语言一直是应用最广泛的语言。既然C语言如此强大,那还要其他语言做什么?此言差矣。C语言的万能源自于它的简单、灵活,对各种需求的适应性强。适应性和专用性是一对冤家对头,这就注定了 C语言很难专用化。有一个笑话说:“如果你想用 C语言来造汽车,那么你不得不自己先造轮子。”而很多其他高级语言都已经把各种轮子造好放在那里,任你挑选。另外,C语言距离机器代码比其他高级语言更近。因此也有人把C语言看成唯一的介于低级语言和高级语言之问的语言。这就使它距离自然语言比较远,其思维还是顺应计算机而不是顺应人的,所以学起来比较费
劲,用起来也不简单。
【例 1.4】下面是用 C语言编写的计算 1+1 的程序,里面有英文单词,也有不知所云的
符号(很快你就会知其所云了)。

#include sstaio
int main (void)
{
printf ("%d n", 1+1)
return 0

在当今世界,C语言已经偏居一隅,除其固守的系统软件开发阵地和历史延续下来的大型软件外, 几乎仅在小型的且追求运行效率的软件和嵌入式软件开发方面还有一定空间。这一点点空间也正在逐渐缩小。取而代之的是C++、Java 和C#等“后生” 语言,以及一些很专门化的语言。有趣的是,C语言有为数不少的铁杆迷,他们对其爱不释手,对那些 “后生”语言不屑一顾。这样的人,在代表最高编程水平的黑客社区里特别多。能轻松驾驭C语言几乎是“高手”必备的素质之一。
C++从名字上看就知道其与 C语言有着不解的渊源。它的设计者 Bjarne Stroustrup 早年曾Thompson 和Ritchie 的实验室工作,而C++又几乎完全兼容 C语言的语法,且所有流行的C++编译器都能编译 C程序,所以很多人认为 C++就是C 语言的升级。在很多场合,二者也被放在一起,称为 C/C++。这个“++〞加上的,便是大名鼎鼎的“面向对象 (Object Oriented)”。
在面向对象被广泛接受之前,流行的是结构化程序设计思想。C和Pascal 等语言都是结构化的,在后面章节中你会学到详细的结构化思想。面向对象的程序设计思想对程序设计的影响可谓翻天覆地,整个计算机界的思维都因其而改变,程序设计更加贴近现实世界,更加符合人类固有的习惯。C++借助 C 语言的影响力,携面向对象的威力,其影响迅速增大。在20世纪 90年代曾有民间组织统计,在当年发布的软件中,90%以上采用 C++语言开发。C++兼有C语言的能力,也是一种“什么都能干” 的高级语言,所以学习和使用起来也不简单。做系统开发的毕竟是少数,直接面向最终用户的应用开发才是语言的必争之地。Java语言就是在这种情况下诞生的。
Sun 公司推出的Java 语言,以纯面向对象、平台无关和易学易用而著称。它全面照搬了C++语法,并去掉了其不常用和不成功的部分,化繁为街,迎速博得了程序员的认可,获得了越非越多的支持。Jave语言融合了很多先进的程序设计、思想、方法,不管是桌面应用,还是网络服务、联入式应用,都可用它进行高效的开发。当然,如果要做底层的、占用资源少的程序,Java 语言就无能为力了。Java 语言的市场做得很不错,它已经被广泛接受,以至于很多客户都指名道姓地要求开发商必领用 Java 语言为其开发软件,尽管他们并不十分明白Java语言究竟如何。到如今,Java 是阿里巴巴、腾讯、网易等互联网公司用得最多的开发语言,多数网站都是用 Java 开发的,而 Android 上的 App 也都只能用 Java。
Java语言的成功,让软件大鳄微软 (Microsof) 公司坐不住了。它及时推出了 C#(读作C Sharp),语高。“#”这个符号就是4个加号围坐一圈,所以有人戏称其为 C++++。从名字可以看出它与C/C++的渊源。没错,它也照搬了 C/C++的语法。
C#诞生在Java 语言之后,所以它能把 Java 语言的成功之处吸收进来,把不成功之处地弃,打造了一个似Java 而非 Java, 还有点超越 Java 的语言。但它年龄不大,于2000年延生(Java 语音诞生于 1995年),发展得也不算很好,主要在一些大型企业应用系统里采用。
此外,Python、 PHP、Ruby、JavaScript 等其他语言都在一些专属领域里发挥着巨大作用。同时,C++、Java 和C#语言也在不断地完善、扩充自身,极力挤压其他语言的空间。在此种情况下,C语言的空间变得越来越小,那么为什么还要学习C语言呢?相信聪明的读者已经能从上面的故事中找到答案了。C语言可以说是C++、Java 和C#语言的基础,还有很多专用语言也学习和借鉴了 C 语言,例如进行 web 开发的 PHP 语言,做仿真的 MATLAB 内嵌语言浏览器上唯一可运行的 JavaScript 语言、被广泛用于智能家居、物联网、无人机、智能小车、3D打印机的 Arduino 开发板的 Arduino 语言等。另外,学好C语言对以后再学习其他语言大有帮助。计算机科学发展很快,若干年之后,什么技术、什么语言尽显风流无法预言。唯有掌握最基础的,才能以不变应万变,并立于不败之地。
在这里我们并不想误导读者,使读者认为学习C语言是学其他语言的必由之路。相反有不少人认为,C语言学得太好有碍于继续学习其他语言,典型例子就是前面提到的那些不愿接受新事物的 C 语言的铁杆迷们。其他语言从C语言所继承的主要是语法和一些基本概念等外在的东西。每种语言都有其内涵,都有其独特的神韵。己经完全陶醉于一种语言的人,较难领会、接受另一种语言的神韵,这就造成了学习新语言的障碍。例如,有为数不少的人在使用 C++的时候总按照C 的习惯去编程,导致程序表面看上去是 C++的,但内部却还是结构化而非面向对象的,完全发挥不出 C++的威力,以至于 C++之父跳出来疾呼 “C++是一个全新的语言,使用的时候请忘记 C语言。〞同样的现象在从C++程序员转变成 Java 程序员时也发生了。可见,唯有以包容的心态去面对,以客观的手段去选择,才能将各种语言把玩于手中,趋利避害,成为语言的主宰而并非奴隶。所以,学习语法是次要的,学神韵是最重要的。各种语言的语法都大同小异,就算互不抄袭,也基本难以逾越几条普遍规则。只要熟练掌握一种语言的语法,再学任何其他语言的语法基本上只要几天,甚至几个小时就可以搞定。但要真正掌握语言的神韵,就非一蹴而就了。
学习程序设计的道路不止一条,从C语言开始也不见得是最明智的。但既然现在有机会从此入门,那么为什么不牢牢抓住这个机会呢?

1.5 程序设计语言的工作原理

虽然本书力图让学习c语言成为一件快乐的事情,但总无法避免讲述一些可能有点儿枯燥的理论。阳光总在风丽后,不经历跋涉的辛苦与攀岩的枯燥,又怎能体会到“会当凌绝顶,一览众山小”的快乐呢?所以,先学点枯燥的 (其实,至少对计算机爱好者而言,这些内容并不枯燥,反倒非常有趣)吧,为了快乐。

1.5.1 运行

程序源代码是静态的,只有运行起来才能发挥作用。
编译运行是最经典、效率最高的运行方式。C/C++的高性能在很大程度上归功于编译。用编译语言开发一个软件所要经历的过程是:编辑、编译、链接和运行。
编辑(Edit ),就是用程序设计语言编写源代码(Source Code)。这是一个创造艺术品的过程,你所有的思维、能力、知识都体现在这个过程中。本书的其余章节讲的都是怎样把这个过程做好。
对于编译(Compile),用户只需要发出编译指令,其余的事情都交给*编译器 (Compiler)*自己完成。前面提到过编译器,它是把程序设计语言转换成 *目标代码(Object Code)*的软件。这个转换过程很复杂,如果读者将来有机会学习 “编译原理”这门课程的话,会了解其复杂程度。我们作为编译器的用户,可以全然不管这些。鼠标一点,键盘一按,轻轻松松,编译完成。程序设计的意义就在这里体现出来,因为我们编写程序时,把复杂的东西都 “包装”在程序里,给用户一个最简单的使用界面。
如果程序员编写的源代码有问题,通常指语法错误,那么编译器会报错,并停止编译。因为它读不懂程序员编写的代码,不知道该转成什么。一些聪明的编译器还会找出程序中逻辑上的问题和不安全的地方。当遇到编译器给出错误提示时, 就要分析出错的原因,重新修改代码后,再重新编译。如此往复,直到编译成功为止。
**链接(Link)**过程很简单,有时候甚至完全体会不到,所以很多人习惯上把它也算作编译的一部分。在这个过程中,*链接器 (Linker)*把用户程序和支持它运行的必需的其他程序都“合成”在一起,形成最后的可执行文件(在DOS 和 Windows 下扩展名为.exe 的文件)。可执行文件里面都是执行代码,也就是机器语言代码。全部转换过程完毕,用户就可以把这个文件复制给别人用了。通常,使用者并不需要程序的源代码,有这个可执行文件足矣。使用者唯一要做的就是 ***运行(Run)***它。
不要以为程序能运行就万事大吉了。运行时还会出现错误,开发者必须捕获这些错误,并通过修改源代码解决错误,重新编译、链接,最终交付无错的可执行文件。有些错误很快就会被发现和及时改正;有些错误则隐藏很深,很长时间才会发现,比如著名的 2000 年问题千年虫。
还有一种被大量采用的程序运行方式,称为解释运行。最具有代表性的是 BASIC、JavaScript、PHP、ASP、 Perl、 Python 和 Ruby 等语言。这些语言的共同特点是运行速度慢,但简单。
用这类语言编写的程序在运行时,必须先运行一个 “解释器”。解释器能读懂这种语言,按照程序指令一步一步地工作,完成开发者需要的功能。因为必须一条一条地解释语句并执行,所以速度很慢,比编译语言要慢数十甚至上百倍。因为解释器的功能可以做得很强,并且可以把计算机的复杂性隐藏起来,所以这类语言都比较易学。
解释语言简单好用,获得了大量的支持者,甚至有人预言,它将完全替代编译语言。说此话的人好像忘记了一件事情,那就是解释语言的解释器几乎都是用C/C++开发的。编译语言的编译器、链接器可以用编译语言自己编写,而解释语言只能借助编译语言发展。
解释语言还有一个致命伤——源代码必须交给用户。对把源代码视作最高商业机密的软件企业来说,这简直是自砸饭碗,不会有人愿意这样做。因而,也有人语言,解释语言的生命力不会长,不过他也错了。现在,解释语言已经是高级语言中不可或缺的一部分,它在Web开发和软件应用脚本扩展等领域发挥着巨大作用。通过法律的保护,人们已经不再特别介意源代码的保密,甚至有人愿意公开源代码与人交流。至于速度问题,一方面,因为硬件性能提、成本下降,硬件瓶颈不再突出;另一方面,解释语言也采用了很多提高速度的办法。有一种办法是:先编译、后解释。这演变出了一种新类型的语言。
Java 和C#语言都是先编译、后解释的。编译器并不把它们编译成机器代码,而是编译成一种中间代码(Java 语言中称为字节码,C#语言中称为 MSIL),当然,这个中间代码必须在其支特的平台上运行。Java 语言提供的平台称为 JVM (Java Virtual Machine),它纯粹靠解释字节码来运行程序;C#语言的运行平台称为 CLR (Common Language Runtime),它并不是一个纯粹的解释器,而是翻译器,把MSIL 代码翻译成机器代码,再运行它。
总之,它们都要有平合才能运行,所以它们都比编译语言慢,Java 语言比 C#语言更慢。不过它们具备解释语言最大的好处一简单,而且只需经过一次编译,避免了源代码的传播,非常适合开发大型应用软件。

1.5.2 内存

通过前面的介绍我们知道,程序在运行时是和数据一起保存在内存(Memory)中的,由CPU 执行。内存是怎样存储它们的呢?
程序和数据都是以二进制形式存储的,存储单位是字节(Byte)。每台计算机的内存都能存储一定字节数的内容,也就是我们俗称的 “内存大小”。通常,每个存储单元能保存1字节。程序和数据怎样存储和该往哪里存储并不需要用户操心,操作系统和编译器会打理这一切。但在程序运行时,我们经常需要知道某个数据究竟保存在什么地方,这就需要知道地址信息。
内存的每个单元都被分配一个唯一的整数,称为地址(Address)。这就像门牌号码一样,用它就能我到你要找的地方。因此知道数据所在的地址,也就知道了数据的存储位置。程序指令存储在内存中,所以它也有地址。关于地址,将在第7章中讲到很多奇妙的用法

1.6 本章小结

本章简要介绍了计算机程序设计语言发展中的人和事。总的来说,计算机和计算机语言都越来越易用,越来越符合人类自身的习惯。C 语言是这个发展过程中的一个里程碑。
程序可以指挥计算机做各种事情。但是计算机不能直接读懂高级语言,必须由编译器或者解释器把高级语言翻译为机器可读懂的机器语言。
驾驭计算机必须编写程序。仅懂得程序设计语言还不足以编写好的程序,至少需要了解一定的计算机工作原理,例如计算机的工作过程、二进制和内存等基础知识。

习题1
1.1 列举几种你说知道的计算机硬件和软件。
答:硬件:鼠标、键盘、显示器
软件:谷歌浏览器、wps、计算器
1.2 冯·诺依曼机模型有哪几个基本组成部分?
答:控制器、存储器、输入、输出、运算器
1.3 尝试把例1.4改为计算123+456。
答:

#include sstaio
int main (void)
{
printf ("%d n", 123+456)
return 0

1.4 列举几种程序设计语言。
答:Java、C、C++、C# 、HTML、PHP、BASIC、Perl、Python、Ruby、ASP/JavaScript
1.5 列举几个在生活和学习中成功应用IT的例子。
答:线上购物、网站查询、线上社交、在线视频

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/931598.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号