描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787111689874丛书名: 华章程序员书库
许多程序员对使程序运行的底层技术并不熟悉。但是,如果希望程序运行良好,而不是充满了难以发现的bug,就要关心代码是如何正常运行的。谁都不希望自己因为代码安全问题而成为新闻的主角。网上有很多技术细节,但都没有整理或收集到一个方便的地方。在本书中,资深工程师Jonathan E. Steinhart深入探讨了计算机背后的基础概念,比如计算机硬件,软件在硬件上的行为,以及随着时间的推移,人们如何解决问题等主题。你将学到:- 现实世界是如何转换成计算机能理解的形式的,比如位、逻辑、数字、文本和颜色。- 组成计算机的基本构件,包括逻辑门、加法器、译码器、寄存器和存储器。- 为什么设计与计算机硬件(特别是内存)相匹配的程序可以提高性能。- 如何将程序转换为计算机能够理解的机器语言。- 软件构建块是如何结合起来创造Web浏览器等程序的。- 让程序更高效的巧妙技巧,如循环不变式、强度削弱和递归细分等。- 计算机安全和机器智能的基础知识。- 项目设计、文档编制、日程安排、可移植性、维护和其他实用的编程经验。了解代码在机器上运行时到底发生了什么将帮助你编写更好、更高效的代码。
本书深入探讨了计算机的基础概念,比如计算机硬件、软件在硬件上的行为,以及随着时间的推移,人们如何解决问题等主题;介绍了现实世界是如何转换成计算机能理解的形式的,组成计算机的基本构件,以及为什么设计与计算机硬件相匹配的程序可以提高性能;还将介绍如何将程序转换为计算机能够理解的机器语言,如何用软件构建块创造Web浏览器等程序,让程序更高效的循环不变式、强度削弱和递归细分等技巧,计算机安全和机器智能的基础知识,以及项目设计、文档编制、日程安排、可移植性、维护等内容。
。
译者序
前言
致谢
作者简介
审校者简介
引言1
第1章 计算机的内部语言12
1.1 什么是语言12
1.2 书面语言13
1.3 比特13
1.4 逻辑运算14
1.4.1 布尔代数14
1.4.2 德摩根定律15
1.5 用比特表示整数16
1.5.1 表示正数16
1.5.2 二进制加法18
1.5.3 表示负数20
1.6 表示实数23
1.6.1 定点表示法24
1.6.2 浮点表示法25
1.6.3 IEEE浮点标准26
1.7 二进制编码的十进制系统27
1.8 处理二进制数的简单方法27
1.8.1 八进制表示法27
1.8.2 十六进制表示法28
1.8.3 表示语境28
1.9 命名位组29
1.10 表示文本30
1.10.1 ASCII30
1.10.2 其他标准的演变32
1.10.3 UTF-832
1.11 用字符表示数字34
1.11.1 可打印字符引用编码34
1.11.2 Base64编码34
1.11.3 URL编码35
1.12 表示颜色35
1.12.1 增加透明度37
1.12.2 编码颜色38
1.13 本章小结39
第2章 组合逻辑40
2.1 数字计算机的案例40
2.1.1 模拟和数字之间的区别42
2.1.2 为什么尺寸对硬件很重要43
2.1.3 数字使设备更加稳定44
2.1.4 模拟世界中的数字44
2.1.5 为什么使用位而不是数字46
2.2 电学的简单入门47
2.2.1 用管道理解电47
2.2.2 电源开关50
2.3 为位构建硬件52
2.3.1 继电器52
2.3.2 真空管54
2.3.3 晶体管55
2.3.4 集成电路56
2.4 逻辑门57
2.4.1 利用迟滞现象提高抗噪声能力58
2.4.2 差分信号59
2.4.3 传播延迟60
2.4.4 输出的变化61
2.5 构建更复杂的电路63
2.5.1 制作加法器63
2.5.2 制作解码器65
2.5.3 制作多路输出选择器66
2.5.4 制作选择器66
2.6 本章小结68
第3章 时序逻辑69
3.1 表示时间69
3.1.1 振荡器70
3.1.2 时钟70
3.1.3 锁存器71
3.1.4 锁存器组成的门电路72
3.1.5 触发器73
3.1.6 计数器75
3.1.7 寄存器77
3.2 内存组织和寻址78
3.2.1 随机存取存储器80
3.2.2 只读存储器81
3.3 块设备83
3.4 闪存和固态磁盘驱动器85
3.5 检错和纠错86
3.6 硬件和软件87
3.7 本章小结88
第4章 计算机剖析89
4.1 内存89
4.2 输入输出91
4.3 中央处理器92
4.3.1 算术逻辑单元93
4.3.2 移位寄存器94
4.3.3 执行单元96
4.4 指令集97
4.4.1 指令97
4.4.2 寻址方式99
4.4.3 条件码指令99
4.4.4 分支100
4.4.5 终指令集100
4.5 终设计103
4.5.1 指令寄存器103
4.5.2 数据通路和控制信号103
4.5.3 流量控制104
4.6 RISC和CISC指令集107
4.7 图形处理单元108
4.8 本章小结108
第5章 计算机架构109
5.1 基本架构元素109
5.1.1 处理器核心110
5.1.2 微处理器和微型计算机110
5.2 过程、子程序和函数111
5.3 堆栈113
5.4 中断116
5.5 相对寻址118
5.6 内存管理单元119
5.7 虚拟内存121
5.8 系统和用户空间121
5.9 存储器层次和性能122
5.10 协处理器123
5.11 在内存中排列数据124
5.12 运行程序125
5.13 内存功耗126
5.14 本章小结126
第6章 通信故障127
6.1 低电平I/O127
6.1.1 I/O端口128
6.1.2 按下按钮129
6.1.3 让灯光亮起131
6.1.4 灯光,动作……132
6.1.5 奇思妙想133
6.1.6 2n种灰色134
6.1.7 正交134
6.1.8 并行通信135
6.1.9 串行通信136
6.1.10 捕捉一个波138
6.1.11 通用串行总线139
6.2 网络140
6.2.1 现代局域网141
6.2.2 因特网141
6.3 数字世界中的模拟143
6.3.1 数模转换143
6.3.2 模数转换145
6.3.3 数字音频148
6.3.4 数字图像154
6.3.5 视频156
6.4 人机界面设备157
6.4.1 终端157
6.4.2 图形终端158
6.4.3 矢量图159
6.4.4 光栅图160
6.4.5 键盘和鼠标161
6.5 本章小结161
第7章 组织数据162
7.1 原始数据类型162
7.2 数组164
7.3 位图165
7.4 字符串166
7.5 复合数据类型167
7.6 单链表168
7.7 动态内存分配173
7.8 更有效的内存分配174
7.9 垃圾收集175
7.10 双链表175
7.11 层次数据结构176
7.12 块存储179
7.13 数据库181
7.14 索引182
7.15 移动数据183
7.16 矢量I/O186
7.17 面向对象存在的问题187
7.18 排序188
7.19 哈希算法189
7.20 效率与性能191
7.21 本章小结192
第8章 语言处理193
8.1 汇编语言193
8.2 高级语言194
8.3 结构化程序设计195
8.4 词法分析196
8.4.1 状态机198
8.4.2 正则表达式199
8.5 从单词到句子201
8.6 每日语言俱乐部203
8.7 语法树203
8.8 解释器205
8.9 编译器207
8.10 优化209
8.11 小心硬件210
8.12 本章小结211
第9章 Web浏览器212
9.1 标记语言213
9.2 统一资源定位符214
9.3 HTML文档214
9.4 文档对象模型216
9.4.1 树结构解析216
9.4.2 文档对象模型解释217
9.5 串联样式表218
9.6 XML和它的朋友们221
9.7 JavaScript224
9.8 jQuery226
9.9 SVG228
9.10 HTML5228
9.11 JSON228
9.12 本章小结230
第10章 应用程序和系统程序设计231
10.1 猜动物程序版本1:HTML和JavaScript233
10.1.1 应用程序级框架234
10.1.2 Web页面主体235
10.1.3 JavaScript程序236
10.1.4 CSS238
10.2 猜动物程序版本2:C语言239
10.2.1 终端和命令行239
10.2.2 构建程序240
10.2.3 终端和设备驱动程序240
10.2.4 上下文切换240
10.2.5 标准I/O242
10.2.6 循环缓冲区243
10.2.7 通过合适的抽象实现更好的代码244
10.2.8 一些技术细节244
10.2.9 缓冲区溢出245
10.2.10 C语言程序246
10.2.11 训练251
10.3 本章小结252
第11章 捷径和近似法253
11.1 表格查找253
11.1.1 转换253
11.1.2 纹理映射254
11.1.3 字符分类256
11.2 整数方法258
11.2.1 直线261
11.2.2 曲线266
11.2.3 多项式268
11.3 递归细分269
11.3.1 螺旋线269
11.3.2 构造几何学272
11.3.3 移位和屏蔽278
11.4 更多地回避数学运算279
11.4.1 幂级数近似279
11.4.2 CORDIC算法280
11.5 随机事物284
11.5.1 空间填充曲线284
11.5.2 L系统286
11.5.3 随机287
11.5.4 量化288
11.6 本章小结297
第12章 死锁和竞态条件298
12.1 竞态条件是什么298
12.2 共享资源299
12.3 进程和线程299
12.4 锁301
12.4.1 事务和粒度302
12.4.2 等待锁302
12.4.3 死锁303
12.4.4 短期锁的实现303
12.4.5 长期锁的实现304
12.5 浏览器JavaScript304
12.6 异步函数和承诺307
12.7 本章小结311
第13章 安全性312
13.1 安全和隐私概述313
13.1.1 威胁模型313
13.1.2 信任314
13.1.3 物理安全315
13.1.4 通信安全316
13.1.5 现代社会317
13.1.6 元数据和监控318
13.1.7 社会背景319
13.1.8 身份验证与授权320
13.2 密码学321
13.2.1 隐写术321
13.2.2 替代密码322
13.2.3 换位密码324
13.2.4 更复杂的密码325
13.2.5 一次一密325
13.2.6 密钥交换问题326
13.2.7 公钥密码326
13.2.8 前向加密327
13.2.9 加密哈希函数327
13.2.10 数字签名328
13.2.11 公钥基础设施328
13.2.12 区块链328
13.2.13 密码管理329
13.3 软件卫生330
13.3.1 保护好正确的东西330
13.3.2 仔细检查你的逻辑330
13.3.3 检查错误331
13.3.4 小化攻击面331
13.3.5 待在界内331
13.3.6 生成合适的随机数是有难度的332
13.3.7 了解代码333
13.3.8 聪明是你的敌人335
13.3.9 明白什么是可见的335
13.3.10 不要过度收集335
13.3.11 不要一直存储335
13.3.12 动态内存分配不是你的朋友336
13.3.13 内存垃圾回收也不是你的朋友337
13.3.14 数据作为代码338
13.4 本章小结340
第14章 机器智能341
14.1 概述342
14.2 机器学习343
14.2.1 贝叶斯344
14.2.2 高斯345
14.2.3 索贝尔348
14.2.4 Canny351
14.2.5 特征提取352
14.2.6 神经网络354
14.2.7 使用机器学习数据358
14.3 人工智能359
14.4 大数据361
14.5 本章小结363
第15章 现实世界的考虑364
15.1 价值主张364
15.2 来龙去脉366
15.2.1 短暂的历史366
15.2.2 开源软件368
15.2.3 创意共享370
15.2.4 可移植性的兴起370
15.2.5 软件包管理371
15.2.6 容器371
15.2.7 Java371
15.2.8 Node.js373
15.2.9 云计算373
15.2.10 虚拟机373
15.2.11 便携式设备374
15.3 编程环境374
15.3.1 你有工作经验吗374
15.3.2 学会估计374
15.3.3 调度项目375
15.3.4 决策376
15.3.5 与不同个性的人一起工作376
15.3.6 了解职场文化377
15.3.7 做出明智的选择378
15.4 开发方法378
15.5 项目设计379
15.5.1 把想法写下来379
15.5.2 快速原型发展法380
15.5.3 接口设计380
15.5.4 重用代码或编写自己的代码383
15.6 项目开发383
15.6.1 谈话384
15.6.2 成年人与计算机的关系384
15.6.
我天生就是爱钻研的人。我父亲说,在荡秋千之前,我总会想象有一个开关打开秋千,荡完秋千之后又会关上它。机器仿佛跟我说了它的内部原理。我像C-3PO一样懂得“水分蒸发器的二进制语言”。我很幸运能成长在那个没有显微镜就能审视大多数事物的工作原理的年代。
现在回想起来,我在美国新泽西州的童年非常离奇而有趣。小时候,我对每个东西都要修一修补一补,这事让妈妈很头痛。爸爸妈妈给了我很多工具包,但是当我把它们合在一起做一些书上没有的项目时,他们就会感到不安。枕头防盗报警器的出现使这事达到了高潮,它抓住了“牙仙子”的行动—没有经济条件下的一种选择,但这个选择还是挺令人满足的。我收集坏了的电视机和一些被丢掉的家电,把这些东西拆了,了解它们是怎么运行的,再用那些零件做出些别的东西。我喜欢的玩具之一是我爸爸1929年的建造模型。那个年代的太空计划让我对科技产生了浓厚的兴趣。我至今还记得有一天晚上和爸爸站在我们家的前院里,看着Echo 1飞过头顶的场景。
大多数孩子都有一个送报纸的兼职,而我是做修电视机和收音机的兼职。我的父亲在IBM公司工作,有时我也会和他一起去上班,他单位里的大型计算机让年幼的我非常震撼。八岁那年,他带我去大西洋城的电子展,我记得当时我玩的是一台IBM 1620。我还记得我对泰克(Tektronix)展台上的设备很着迷。可能是受此影响,我后来选择进入该公司工作。一年后,我去了纽约的世界博览会,被贝尔系统的展品所震惊。后来一个偶然的机会,我得以与其中一位设计师一起工作。
我接受了很令人惊奇的公立学校教育,当然这样的教育在美国已经不存在了。我和同学在五年级的时候可以随意传看装水银的壶。上六年级时我炸毁了化学实验室,但并没有受到关禁闭的处罚,反而从这些经历中学到了很多知识。(现在我还记得制作三碘化氮的配方。)我记得我八年级的科学老师带着我们离开学校,去纽约市看电影《2001:太空漫游》,因为他认为这很重要。他做这件事的时候并没有征求学生父母的允许,如今这么做很有可能丢掉工作,或者受到更严重的处罚。我们在高中化学课上做火药,在物理课上到足球场互相射火箭玩,在生物课上划破自己的手指做血型测试。这与如今的情况很不一样,如今一点点危险都会让老师们焦虑不安。实验室里湿漉漉的地板都能让他们担心,觉得有点儿水就要发出警告。美国政府官员对科学不屑一顾,区分不出科学行为和恐怖主义行为。
学习以外,父母给我报名参加了我喜欢的童子军,以及我讨厌的少年棒球联合会。童子军教会了我很多关于物质世界的知识,从骑马到安全地玩火到户外生存。而少年棒球联合会只会让我觉得我不喜欢团体运动。
在那个年代,业余无线电是很重要的,因无线电设备经常需要修理。我自告奋勇加入当地民防应急广播通信集团,只是为了能捣鼓捣鼓设备。该集团有一个原始的无线电电传打字系统,我重新设计了这个系统,后将其用于其他市政设施。电传打字机是我很喜欢的三维立体装置。
上高中的时候,一个朋友给我介绍了一个探索者童子军的岗位,需要每周一晚上在默里山附近的贝尔实验室值班。我加入了,然后就开始接触计算机,当时的计算机有房子那么大。我被迷住了。没过多久,我就早早地离开了学校,搭车去实验室,说服别人让我进去工作。我参与了一连串令人惊叹的暑期工作,与不可思议的人一起工作,这改变了我的生活。我把头伸到别人的实验室里东张西望,好奇实验室里的仪器设备,顺便询问他们在做什么,就这样我学到了不少知识。虽然我打算学习电气工程,但是硬件项目是不可能在一个夏天完成的,后我给他们写了软件。
我觉得对我的童子军指导者们好的纪念方式是,一旦我有能力做到,就跟随他们的脚步,努力帮助新一代年轻技术员走上他们的道路。事实证明这很困难,因为美国研究的鼎盛时期已经过去,而是更加注重增加股东价值;产品本身的价值不及产品带来的利润重要,这使得很难证明研究的价值。公司出于责任的考虑,很少再让孩子们在场地上乱跑了。我原本以为自己会作为童子军一直工作,但因为童子军采用了一系列我不支持的政策而作罢。相反,我是志愿在当地的学校工作。
我开始写这本书是为了补充我志愿教的一门课。当时互联网还没有像今天这样发达。我住在一个相当贫穷的农业社区,考虑到学生们无法负担补充材料的开销,这本书的初稿试图包含所有的内容。但事实证明这是一个不可能完成的任务。
现在从网上可以找到很多不同的编程语言和概念的资料,而且大多数人在家里、学校或图书馆就可以上网。我重写了这些材料,希望读者可以更容易地在网上找到更多的信息。所以,如果有什么不清楚的地方,或者你想知道更多的信息,就去查一下。
近我认识的一些学生说,他们对编程教育的方式感到失望。虽然他们可以在网上找到信息,但也一直在问可以在哪里找到他们需要的一切。这本书就是为了提供那些资源而写的。
我很幸运,能与计算机一起成长。很难想象如果我在没有背景知识的情况下,跳到今天这个成熟的计算领域会是什么样子。写这本书时,挑战性的部分是考虑要从多大程度上追溯过去的例子,以及多大程度上选择现代技术的元素来讨论。我终选择了一种复古的方式,这样人们可以从更古老、更简单、更容易理解的技术中学习到大部分必要的东西。较新、较复杂的技术是用与旧技术相同的构件构造成的,了解这些构件可以使人们更容易理解新技术。
如今,时代不同了。小工具更难拆开、维修和更改。公司正在滥用法律,如数字千年版权法(DMCA),阻止人们修复自己的装备。幸运的是,这在一些地方促进了“修理权”法律的诞生。作为美国人,我们从政府那里得到形形色色的信息:一方面,我们被鼓励从事STEM职业;另一方面,我们看到科学被诋毁,STEM工作被外包。如果这种环境在半个世纪前就存在的话,不知道美国是否还会成为科技强国。
不过,也有亮点。创客空间如雨后春笋般涌现。孩子们可以建造东西,并且乐在其中。电子零件从来没有这么便宜过,只要你不想要带线的。将我小时候的所有计算机组合在一起也没有现在的智能手机处理功能强大。计算机的价格比人们想象的要便宜,像Raspberry Pi和Arduino这样的小型计算机,价格比一个比萨还便宜。
计算机的功能如此强大,我们很容易只热衷于高级功能。就像玩乐高一样,我早的乐高套装中几乎只有长方形的积木,但我的想象力很丰富,可以搭建出任何我想要的东西。如今,你可以买到《星球大战》乐高套装,搭建预制的尤达,但是要发明新的角色就难多了。花哨的部件阻碍了想象力的发挥。
1939年的经典电影《绿野仙踪》里有一个很好的场景,在那一幕里,魔法师暴露了,发出了“别注意幕后的那个人”的呐喊。本书就是写给那些不想听这些,只想知道幕后的东西的人的。我希望这本书可以让那些实现高级功能的基本构件清晰明了。这本书是为那些想象力并不止步于高级功能的人准备的,也是为那些希望创建新的高级功能的人准备的。如果你有兴趣成为魔法师,而不仅仅是一个魔法物品的持有者,那么这本书就是为你准备的。
评论
还没有评论。