代码揭秘
代码揭秘 |
本书从程序设计角度出发,以C/C++为描述语言,以VisualC++为形式工具,将隐藏在代码背后的关于计算机组成原理、计算机操作系统等方面的机制和知识娓娓道来,不仅让读者知其然,更要让读者知其所以然。并让这些知识再反作用于编程实践,从而帮助读者写出更适合机器优化的高质量代码。
目录
图书信息
内 容 简 介
本书从程序设计角度出发,以C/C++为描述语言,以VisualC++为形式工具,将隐藏在代码背后的关于计算机组成原理、计算机操作系统等方面的机制和知识娓娓道来,不仅让读者知其然,更要让读者知其所以然。并让这些知识再反作用于编程实践,从而帮助读者写出更适合机器优化的高质量代码。揭开代码背后鲜为人知的秘密,具体说来,全书主要讨论了包括计算机底层编码、内存与指针、计算机指令与代码系统、函数调用的机制、多级存储系统、线程与进程的概念以及代码优化等多个方面的话题。
本书既可作为大专院校相关专业师生的教学参考书,也可供计算机及其相关领域的工程技术人员查阅之用,对于普通计算机爱好者,本书也不失为帮助他们理解计算机底层机制的一本深入浅出的计算机读物。
前 言
算下来这本书应该是我奉献给读者的第三本书了。一路写下来,自己也感觉非常庆幸,庆幸有许多读者如此地厚爱于我!更高兴地看到广大读者能够从我的书里汲取知识,获得启迪。在计算机图书的创作过程中,我不禁感慨:写一本好书不容易!更何况千里马常有,而伯乐不常有,能够让一本书找到它真正的读者同样有难度。因此我写下了后面的文字,希望这些介绍性的东西能够帮助读者理解本书要旨,明确所述内容。
本书缘起
我想有一个问题,很多读者都非常关心,那就是如何成为一名编程高手。这是以往很多读者向我写信讨教的话题。关于方法学上的问题本书附录中谈了很多,这里不再赘述。但是这里我想告诉读者的是本书能够帮助你做些什么。
通常认为一个计算机程序设计高手应当具备的条件是熟练掌握至少一门计算机程序设计语言,然后有比较扎实的数据结构与算法功底。这样,基本上他已经可以从一种比较高的视角来抽象现实问题并运用计算机来进行模拟和求解了。但是,这其实还不够,一个高效的计算机程序需要“内外兼修”。内功就是程序所使用的数据结构和算法,这是决定程序效率的根本因素;而外功就是程序编码是否符合计算机系统的口味,是否能够最大程度地调动和运用系统的资源。
这一点的作用是不容忽视的。但是由于目前很多程序员都是半路出家,没有接受过系统的计算机科学理论教育,因为他们不知道有这么回事,所以无法给予足够的重视就无可厚非了。就像古代人们不知道有细菌和病毒的存在,所以那时也就没有消毒的概念一样。
另外,我需要指出的是,很多计算机专业科班出身的学生也未必能够领悟这项“外功”的奥义。就目前中国的计算机教育来说,学校的课程设置仅仅是将各项知识独立地对待,这样对于悟性不是非常高的学生来说,在没有被点化的情况下就没有办法有机地将这么多课程串接起来。一个不能形成完整系统性的知识结构是空洞和脆弱的结构。
国外先进的计算机教育已经注意到了这一点,很多国外的大学都开设了这样一门从程序设计角度来让学生真切感受计算机组织机制和原理的课程。庆幸的是,国内很多人也已经意识到了这个问题,所以相关的课程和有关的书籍也在被逐步引入到国内。但是目前存在的一个问题是,原封不动地将国外的课程和教材搬到国内明显让这洋学问显得有点“水土不服”。
这种水土不服主要表现在三个方面。首先,这些书籍往往都是国外大学的教材,这些教材面向专业学生,这无疑将广大非专业学生和读者拒之门外了。其次,这些书是以国外大学的情况为参照而写作的,没有充分考虑中国的情况——当然,人家干嘛要考虑呀?这就让中国读者学起来非常不顺手。比如,某些例子可能是以UNIX或者Linux下的编程为基础设计的,中国绝大多数使用Windows的读者就很难完成这些实验。这极大地打击了他们继续学习的积极性和后劲。最后,引进版的书明显要比实际技术的发展老几代。现在都是多核时代了,书里可能还在讲奔腾2,这就让中国的读者只能在后面跟着人家跑,却永远没办法超越。
核心内容
基于上面的考虑我写了这样一本《代码揭秘》。或许很多人对这个名字感到困惑并充满疑问,因为直观上好像不能确定这本书的具体内容是什么。接下来我就要告诉读者这本书到底是写什么的。本书从程序设计角度出发(因为这是广大读者最熟悉、最容易接受的出发点),以C/C++为描述语言(因为这是目前最广为使用的计算机语言,另外,C/C++中像指针这样的底层特性也非常适合用来揭示系统深处的东西),以VisualC++为形式工具(因为它也是中国程序员所习惯使用的开发环境),将隐藏在代码背后的关于计算机组成原理、计算机操作系统等方面的原理和知识娓娓道来,不仅让读者知其然,更要让读者知其所以然。并让这些知识再反作用于编程实践,从而帮助读者写出更适合机器优化的高质量代码。揭开代码背后鲜为人知的秘密,让代码开口说话,告诉你一个真实的计算机,从而让你能够写出适合与计算机交流的优秀代码,这就是本书所能为你做到的。
读者对象
接下来我要回答的问题是本书为谁而写。
如果你是一名渴望在编程技艺上有所精进的程序设计爱好者,那么这本书就是助你成为编程高手的制胜法宝;
如果你是一名正苦于无法突破编程瓶颈的程序员,那么这本书就是帮你打通任督二脉的武林秘籍;
如果你是一名感觉书本知识仍然无法内化的计算机专业学生,那么本书就是替你拨云开雾、指点迷津的通天灯塔。
阅读建议
最后,我还希望和读者谈谈阅读及学习本书的建议。
第一,从整体上看全书共分9章,章节之间相关关联、层层递进,本着循序渐进的原则逐渐展开,因此阅读本书时切不可跳跃式地选读,这样非但不能领悟整个体系间的精髓,更会为进一步的阅读带来困难。特别是第2~7章尤不可拆分阅读,务必按其顺序来学习。
第二,为了帮助读者理解,书中绘制了大量图表。这些图表的作用不可小视,如果在文字理解上遇到困难,可以参照图表来学习。为了帮助读者加深理解,书中还设计了大量的实验,尽管书中给出了实验结果,但也请读者务必亲自动手实践一下这些例子,这样才能让知识凝固在你的脑中。
第三,本书所涉及的知识面比较广,在某些时候限于篇幅的考虑而未能把所有问题都展开来深入探究。对于那些并不是非常深入的知识点,如果读者有兴趣,建议读者多多查阅有关方面的资料,这样学习才能更加博文通识。
关于本书
排除前期构思和素材准备的时间,本书的写作时长也将近有一年之久。在这个过程中,笔者力求精益求精,对很多知识点再三推敲,并翻阅了大量资料和文献。这些工作和努力无非是希望能够写一本对得起读者的书。
在早先的两本书出版之后,我也收到了许多热心读者的来信,一部分人表达了对我作品的充分肯定,这当然是我所乐于见到的,能够获得来自读者的认可对于一个负责任的作者来说无疑是莫大的荣耀。而更多的人则向我问询了书中的一些问题,主要是他们在阅读过程中遇到的困难。这也是我非常高兴见到的事情,因为这让我真切地感知到确实有很多人在读我写的书。很多读者同问的一个问题是如何能够学好编程。为了回答这个问题,我特别撰写了一篇题为《浅谈编程能力的培养与提高》的文章附在本书正文之后,希望对那些仍处在迷茫之中的读者能够起到一定的帮助作用。
写一本好书真的很难,写一本没有错误的好书更是难如登天。我闻听计算机科学大师Knuth在《计算机程序设计艺术》丛书出版后也提出如果谁能够从他书中找到一个错误,就能够获得256美分的奖励,事实证明获得这项奖励的人还是大有人在的。这也客观地说明了即使作者很牛,即使作者很用心,书中出现纰漏和欠缺也的确是在所难免的事情,所以我也真心地希望广大读者能够不吝赐教和批评。不过以往的经验着实有点让我失望。给我写信的读者大有人在,但是指出我书中错误的读者却寥寥无几。我想这其中的一个非常重要的原因在于中国的教育更多地是让我们学会一味接受,而非大胆地思辨!我们太过盲从而迷信权威,只会聆听高人教诲,却不想自己思考。这对于学习来说不是一个好现象。古人云:尽信书则不如无书。我也希望广大读者能够以思辨的态度来看书,这样你将会获得更多。如果在这个过程中,读者有什么感想或者问题希望和作者交流的。
最后诚挚地祝愿每位读者都能够真正感受到编程的快乐,并在编程的路上行得更稳健,走得更长远!
目 录
第1章 绪论 1
1.1 计算机系统初探 2
1.1.1 换个角度看计算机 2
1.1.2 CPU很好很强大 4
1.2 计算机语言与编译技术 ¬8
1.2.1 如何让机器理解你 8
1.2.2 编译技术与开发环境 14
1.2.3 程序开发流程 20
1.3 C语言神话 22
1.3.1 C语言的历史 22
1.3.2 简单说说C语言的特点 23
1.4 奇迹的延续 25
1.4.1 C++的产生与发展 25
1.4.2 C++与面向对象思想 27
1.5 本章小结 31
第2章 揭开数据表示的面纱 32
2.1 进制系统 33
2.1.1 最简单的计数方式 33
2.1.2 计算机里只有黑白 34
2.1.3 压缩表示的二进制 36
2.2 位与位操作 38
2.2.1 计算机存储的单位 38
2.2.2 位操作和位段 39
2.3 计算机中的数值 48
2.3.1 一种最简单的数 48
2.3.2 现实世界需要负数 49
2.3.3 只有整数还不够 51
2.4 让计算机学会写字 56
2.4.1 ASCII码 57
2.4.2 汉字编码 59
2.4.3 更强大的编码 60
2.5 C语言基本数据类型 62
2.5.1 整型 63
2.5.2 字符型 66
2.5.3 注意浮点数陷阱 67
2.6 本章小结 71
第3章 变量与地址 72
3.1 程序都在内存中 73
3.2 很多初学者都怕指针 77
3.3 睁大眼睛看内存 81
3.4 数组与指针是近亲 84
3.5 再谈指针 93
3.6 本章小结 97
第4章 动态内存管理 98
4.1 malloc和free 99
4.2 sizeof并不复杂 101
4.3 内存操作函数 105
4.3.1 memset 105
4.3.2 memcpy和memmove 107
4.4 new和delete 109
4.5 内存错误面面观 113
4.5.1 最怕内存泄漏 113
4.5.2 小心重复释放 115
4.5.3 指针是个坏东西 117
4.5.4 超量写内存 118
4.6 使用Visual C++检查内存泄漏 120
4.7 本章小结 124
第5章 代码与指令系统 125
5.1 还原代码的本来面目 126
5.1.1 内存中的代码 126
5.1.2 指向函数的指针 131
5.1.3 CPU的存储器 136
5.1.4 寄存器变量 143
5.1.5 寄存器组举例 145
5.2 指令——简单or复杂 149
5.2.1 指令格式 149
5.2.2 操作类型 154
5.2.3 操作数类型 155
5.3 如何找到地址 156
5.3.1 下一步该做什么 156
5.3.2 计算机知道自己需要什么 165
5.4 本章小结 172
第6章 函数与函数调用 173
6.1 函数与参数 174
6.1.1 C/C++中的函数 174
6.1.2 参数传递 174
6.1.3 作用域 180
6.2 函数的递归调用 184
6.2.1 到处都是递归 184
6.2.2 小心使用递归 188
6.2.3 递归与非递归 194
6.2.4 内、外部变量分配原理 198
6.3 内存的使用 200
6.3.1 活动记录与栈 200
6.3.2 静态分配 203
6.3.3 有静就有动 205
6.4 程序在内存中的模样 217
6.5 本章小结 219
第7章 多级存储系统 221
7.1 存储系统及层级结构 222
7.1.1 存储器分类 222
7.1.2 存储器的层级结构 225
7.1.3 访问的局部性原理 227
7.1.4 再谈存储器的层级 231
7.2 高速缓存 235
7.2.1 缓存设计策略 235
7.2.2 多级缓存原理 245
7.2.3 实际编码指导 250
7.3 虚拟内存 258
7.3.1 何为虚拟内存 259
7.3.2 虚拟地址 262
7.3.3 页面请求与磁盘缓冲 269
7.3.4 工作集合与系统颠簸 274
7.3.5 虚拟内存与性能影响 276
7.4 本章小结 278
第8章 操作系统交互 279
8.1 多任务 280
8.1.1 串行与并行 280
8.1.2 多任务的实现 282
8.1.3 并发程序设计 283
8.2 进程 284
8.2.1 进程的概念 284
8.2.2 进程的状态 285
8.2.3 进程控制块 288
8.3 Win32进程编程 289
8.3.1 创建进程 289
8.3.2 环境变量 299
8.4 线程 301
8.4.1 线程的概念 301
8.4.2 多线程 302
8.4.3 超线程 303
8.4.4 线程池 304
8.5 调度 305
8.5.1 处理器的调度 305
8.5.2 调度算法准则 306
8.5.3 常见的调度算法 308
8.6 Win32线程编程 313
8.6.1 创建和退出线程 313
8.6.2 挂起和恢复线程 317
8.6.3 远程线程的注入 320
8.7 本章小结 329
第9章 瓶颈与优化 330
9.1 优化还是不优化 331
9.2 测量与分析的内容 333
9.3 测量与分析的方法 334
9.3.1 使用计时器 334
9.3.2 使用Profile 341
9.3.3 使用性能监视器 349
9.4 基本规律 350
9.4.1 二八法则 350
9.4.2 安达尔定律 351
9.5 程序优化路线 354
9.5.1 优化实践的经典案例 354
9.5.2 优化案例的启示 355
9.6 编译器不是万能的 357
9.7 实际优化建议 360
9.7.1 循环条件中的低效 361
9.7.2 注意字符串的操作 363
9.7.3 权衡函数调用需求 364
9.7.4 转换指针形式代码 366
9.7.5 检查存储器的访问 367
9.7.6 使用循环展开技术 372
9.7.7 查表替换复杂运算 375
9.7.8 耗时计算移出循环 377
9.8 本章小结 378
附录A 浅谈编程能力的培养与提高 379
附录B 程序人生 397
参考文献 414[1]
参考文献
- ↑ 代码揭秘--从CC 的角度探秘计算机系统(完整版)道客巴巴网,2021-04-01