普林斯顿计算机公开课(原书第2版)(310506)

0评论量

11阅读量

内容简介作者简介编辑推荐精彩书摘目录
从1999年开始,Brian W. Kernighan 在普林斯顿大学开设一门名为“我们世界中的计算机”的课程(COS 109: Computers in Our World),这门课向非计算机专业的学生介绍计算机的基本常识,多年来大受学生追捧。本书就是基于这门课程的讲义编写而成的,书中不仅解释了计算机和通信系统的工作原理,还分析了新技术带来的隐私和安全问题。第二版的新增章节讨论了Python编程、人工智能、机器学习以及大数据等内容。 本书适合所有希望了解数字世界的读者阅读,通过了解技术的工作原理、起源和未来发展趋势,更好地理解并改变我们身处的世界。
Brian W. Kernighan 世界顶尖计算机科学家,曾为贝尔实验室计算科学研究中心高级研究人员,现为普林斯顿大学教授。他是AWK语言和AMPL语言的发明人,还参与过UNIX和许多其他系统的开发,同时出版了《The C Programming Language》《The Practice of Programming》《The Elements of Programming Style》等在计算机领域影响深远的著作。 Kernighan主张所有人都应该了解计算机,在他心目中,此书相当于“写给未来总统的计算机读物”,是新一代公民必读之作。本书中讲解的内容甚至会影响我们在微博和社区上的活动,以及使用智能手机的方式。
前言 从1999年起,几乎每个秋天我都在普林斯顿大学教授一门名为“我们世界中的计算机”的课程。课程名称有点含糊,但这是我不得不在5分钟内想出来的,结果现在想要改名就难了。不过,教这门课倒是给了我极大的乐趣,让我的工作几乎完全成了一种享受。 这门课的开设是基于这样一种观察,即计算机和计算已经无处不在。有些计算是显而易见的:每个学生都拥有一台笔记本电脑,其性能远比一台IBM 7094计算机强大得多。1964年,当我作为一名研究生进入普林斯顿大学时,IBM 7094计算机要耗资几百万美元,并占据一个很大的空调房间,可以为整个校园提供服务。现在每个学生还拥有一部计算能力远超过那台古老计算机的手机。与这个世界上的大部分人一样,每位学生都可以高速上网。每个人都在线进行搜索、购物,并通过电子邮件、短信和社交网络与亲友保持联系。 然而这些只是计算的冰山一角,其中大部分隐藏在表面之下。我们没有看到,通常也很少会想到那些潜藏在家电、汽车、飞机中的计算机,以及那些司空见惯的数码产品中的计算机,如智能电视、恒温器、门铃、语音识别器、健身追踪器、耳机、玩具和游戏机。我们更不会想到像电话网络、有线电视、空中交通管制、电网、银行和金融服务这些基础设施对计算的依赖程度如此之高。 大多数人不会直接参与创建这样的系统,但每个人都受到它们的巨大影响,有些人还需要做出与这些系统相关的重要决定。一个受过良好教育的人至少应该知道关于计算机的基本知识:计算机能做什么以及如何做到,计算机技术的局限性以及目前来说哪些难以做到,计算机之间如何沟通,沟通时发生了什么,计算机和通信如何影响我们周围的世界等。 计算的普及性以意想不到的方式影响着我们。尽管我们时常被提醒,监视系统变得无处不在,隐私可能被侵犯,身份可能被盗窃,但我们可能没有意识到它们在多大程度上被计算机和通信所赋能。 2013年6月,爱德华·斯诺登(Edward Snowden)——美国国家安全局(NSA)的一位承包商,向记者提供了5万份文件,其中揭露了美国国家安全局曾定期监测和收集世界上几乎每一个人的电子通信,包括电话、短信、电子邮件和互联网的使用,尤其是那些居住在美国并且对国家安全没有任何威胁的美国公民。也许最令人惊讶的是,在最初引起公愤之后,一切又恢复了常态,并且随着政府的监控和监视越来越多,公民也无可奈何或漠然接受。 公司也会追踪和监控我们在网上和现实世界中的行为。许多公司的商业模式基于广泛的数据收集以及预测和影响我们行为的能力。大量数据的可用性使语音理解、计算机视觉和语言翻译方面取得了巨大进展,但这是以我们的隐私为代价的,并且使任何人都很难匿名。 形形色色的黑客在攻击数据存储方面变得越来越老练。几乎每天都发生着对企业和政府机构的电子入侵,大量客户和员工的信息被窃取,并通常用于欺诈和身份盗窃。不仅如此,对个人的攻击也很常见。过去,人们可以通过忽略来自所谓的“尼日利亚王子”或他们的亲戚的邮件来免受网络诈骗,但现在有针对性的攻击变得微妙得多,并已经成为攻破企业计算机的最常见方式之一。 Facebook、Instagram、Twitter、Reddit等社交媒体改变了人们相互联系的方式——与朋友和家人保持联系,看新闻,各种娱乐。这有时会带来积极的影响,例如,在2020年年中,警察暴力的视频引起了人们对非洲裔美国人生活问题的关注。 但社交媒体也造成了大量的负面影响。种族主义者、仇恨团体、阴谋论者和其他疯狂的人,无论他们的信仰或政治立场如何,都可以很容易地在互联网上找到彼此,协同合作并放大影响。言论自由相关的棘手问题,以及内容审核方面的技术挑战,都让人们很难彻底阻断仇恨和无稽之谈的传播。 在一个完全由互联网连接起来的世界里,司法管辖权问题也很难处理。2018年,欧盟实施了《通用数据保护条例》(GDPR),允许欧盟居民控制个人数据的收集和使用,并阻止公司向欧盟以外发送或存储此类数据。GDPR在改善个人隐私方面的效果如何,目前还没有定论,当然,这些规则只适用于欧盟,世界其他地区的规则可能有所不同。 云计算的快速应用增加了另一层复杂性。通过云计算,个人和公司在亚马逊、谷歌和微软等公司的服务器中存储数据并进行计算。数据不再由它们的所有者直接持有,而是被第三方直接掌握,这些第三方有着不同的规程、责任和漏洞,而且可能面临着相互冲突的司法规定。 将各种设备与互联网相连的“物联网”正在迅速发展。当然,手机是一个明显的例子,但汽车、安全摄像头、家用电器和控制器、医疗设备,以及大量的基础设施,如空中交通管制和电网之类也都是应用实例。将一切都连接到互联网的趋势将会持续,因为相互连接的好处有目共睹。然而不幸的是,这其中存在着很大的风险,因为有些设备不仅控制着我们的娱乐,还控制着生死攸关的系统,而且它们的安全性通常比更成熟的系统要弱得多。 密码技术是为数不多的有效防御措施之一,因为它提供了保持通信和数据存储的私密及安全的方法。然而强大的密码技术正不断受到攻击。政府不希望个人、公司或恐怖分子可以拥有真正的私有通信。因此,时常会有议案要求在加密算法中提供后门,允许政府机构破解加密。当然,这些仅在有着适当的保护措施以及为了国家安全利益的前提下才是有效的。然而,无论初衷多么好,这都是一个糟糕的主意——即使你相信政府的行为总是体面的,相信私密信息永远不会泄露(斯诺登除外)。实际上,你的朋友和敌人都可能利用弱加密技术,而坏人无论如何也不会使用这种技术。 这些问题和议题是每个普通人——比如我这门课的学生,或者大街上受过良好教育的人,无论他们的背景如何,受过什么训练——都必须担心的。 听我讲课的学生大多没有技术背景——他们学的专业不是工程、物理或数学。相反,他们可能主修英文、政治、历史、古典文学、经济、音乐和艺术,很大一部分都和人文与社会科学相关。在这门课程结束之后,这些聪明的人应该能够阅读和理解报纸上关于计算机的文章,从中学到更多,或许还能指出其中不那么准确的地方。更广泛地说,我希望我的学生和读者可以对技术持有一种理性的怀疑态度,知道技术虽然通常是个好东西,但绝非万灵药。相反,虽然科技有时候会有不好的影响,但也并非十恶不赦。 理查德·穆勒(Richard Muller)写过一本很好的书——《未来总统的物理课》(Physics for Future Presidents),试图解释作为领导人在应对核威胁、恐怖分子、能源、全球变暖等重大问题时所需要了解的科学和技术背景。即使没有当总统的抱负,见多识广的公民也应该对这些话题有所了解。穆勒的做法为我写这本书的意图做了一个很好的隐喻——未来总统的计算机课。 关于计算机,一个作为未来总统的人应该了解什么?一个见多识广的人应该了解什么?你又应该了解什么? 我认为有四个核心技术领域:硬件、软件、通信和数据。 硬件是计算机中我们可以看见和触碰的部分,这些计算机放在我们的家里和办公室里,也包括我们随身携带的手机。计算机里有什么?它是如何工作的?它是如何构建的?它如何存储和处理信息?什么是比特或字节?我们如何通过它们来表示音乐、电影以及其他内容? 软件是告诉计算机做什么的指令,与硬件相反,软件几乎无法触碰。我们可以计算什么?能以多快的速度计算?我们如何告诉计算机去做些什么?为什么让计算机正确工作这么难?为什么计算机通常很难使用? 通信意味着计算机、电话以及其他设备根据我们的需求互相对话,这样我们可以利用这些设备进行通话,例如通过互联网、万维网、电子邮件以及社交网络。这些是如何工作的?通信带来的便捷是显而易见的,但是这些技术有何风险,尤其是隐私和安全方面的风险?以及如何减轻这些风险? 数据是硬件和软件采集、存储、处理的信息,以及通信系统向全球发送的所有信息。其中一些数据是我们自愿贡献的,无论谨慎与否,比如我们上传的文字、图片和视频。其中大部分是关于个人的信息,通常在不知情且未经允许的情况下被收集和共享。 不管你是不是总统,你都应该了解计算机世界,因为它会对你个人产生影响。即使你认为自己的生活和工作与技术关系不大,但你总会和技术或者技术人员打交道。了解设备和系统是如何工作的会对你有很大帮助,哪怕是在一些简单的事情上,比如意识到销售人员、帮助热线或政客对你隐藏了一些事实。 事实上,无知可能直接带来伤害。如果不了解病毒、网络钓鱼和类似的危险,你就很容易被它们伤害。如果不知道社交网络如何泄露甚至传播你认为是隐私的信息,那么你泄露的隐私可能会超乎想象。如果没有意识到那些令人眼花的推送其实是商业利益集团不择手段地从你的个人信息中挖掘出来的,你就可能会为了蝇头小利而放弃隐私。如果不了解在咖啡店或机场操作个人银行业务有什么风险,你便会面临着钱财和身份被盗用的隐患。如果你不知道操纵数据有多容易,你更有可能掉入假新闻、虚假图片和阴谋论的陷阱。 我建议你按照从头到尾的顺序阅读本书,不过你也可以先跳至感兴趣的章节,然后再回来阅读前面的章节。例如,你可以先从第8章开始阅读,了解网络、手机、互联网、万维网和隐私问题。你可能需要回顾之前的章节来理解其中的一些部分,但大部分内容都是可以理解的。你可以跳过任何定量的内容,比如第2章关于二进制数的讨论,或者忽略一些章节中的编程语言细节。 本书结尾的注解中列出了一些我喜欢的书,并给出了来源和有益的补充阅读材料的链接。术语表给出了关键技术术语和缩略词的简要定义与说明。 任何有关计算机的书都可能很快过时,这本书也不例外。早在我们了解到敌对行为者能在多大程度上影响美国和其他国家的公众舆论和选举之前,上一版就出版了。我在本书中加入了一些重要的新故事,其中许多都与个人隐私和安全有关,因为这个问题在过去几年里变得更加紧迫。本书还增加了新的一章,探讨人工智能、机器学习以及大数据为何如此有效,以及在某些情况下又为何如此危险。我也尝试澄清一些模棱两可的说明,并删除或替换过时的材料。不过,当你读到本书时,有些细节可能是错误的或过时的,尽管我已经努力凸显具有持久价值的内容。 本书的目的是希望你能对一些令人惊叹的技术产生一些欣赏,并真正理解它是如何工作的,理解它的起源以及未来发展趋势。在这个过程中,也许你能学会以一种有益的视角来了解这个世界。我希望能达到这个效果。 致谢 再一次对帮助我改善本书的朋友和同事深表感谢。一如往常,Jon Bentley非常仔细地阅读了每份草稿,给出了极具价值的关于篇章结构的建议,仔细核查了事实,并给出了新的例子。感谢Al Aho、Swati Bhatt、Giovanni De Ferrari、Paul Kernighan、John Linderman、Madeleine Planeix-Crocker、Arnold Robbins、Yang Song、Howard Trickey以及John Wait,他们对书稿提出了非常具体的意见。我还要感谢Fabrizio d’Amore、Peter Grabowski、Abigail Gupta、Maia Hamin、Gerard Holzmann、Ken Lambert、Daniel Lopresti、Theodor Marcu、Joann Ordille、Ayushi Sinha、William Ughetta、Peter Weinberger以及Francisca Weirich-Freiberg给出的宝贵建议。Sungchang Ha将之前的版本翻译成韩语,使英文版也得到了很大的改善。Harry Lewis、John MacCormick、Bryan Respass和Eric Schmidt都对上一版大加赞赏。和往常一样,与普林斯顿大学出版社制作团队的Mark Bellis、Lorraine Doneker、Kristen Hop、Dimitri Karetnikov和Hallie Stebbins合作是一件非常愉快的事情。Maryellen Oliver的校对和事实核查工作非常细致。 二十年过去了,我班上的学生已经开始管理这个世界,或者至少帮助它保持正常运转。他们成为记者、医生、律师、教师、政府官员、公司创始人、艺术家、表演者,以及参与其中的公民。我为他们深感骄傲。 我们都要感谢在这次新冠肺炎疫情危机中付出辛勤劳动和做出牺牲的人,他们使我们可以在相对舒适的家里工作,并且能够依赖保持运转的基本服务和医疗系统。我甚至无法用语言来表达对他们的感激之情。 第1版致谢 再一次对朋友和同事的无私帮助和建议深表感谢。Jon Bentley非常仔细地阅读了每份草稿,并在每页上进行了细致的批注,他的付出让本书变得更好。同时感谢Swati Bhatt、Giovanni De Ferrari、Peter Grabowski、Gerard Holzmann、Vickie Kearn、Paul Kernighan、Eren Kursun、David Malan、David Mauskop、Deepa Muralidhar、Madeleine Planeix-Crocker、Arnold Robbins、Howard Trickey、Janet Vertesi和John Wait等人,他们针对全书提供了宝贵的建议、批评和勘误。我还受益于David Dobkin、Alan Donovan、Andrew Judkis、Mark Kernighan、Elizabeth Linder、Jacqueline Mislow、Arvind Narayanan、Jonah Sinowitz、Peter Weinberger和Tony Wirth等人提供的宝贵建议。与普林斯顿大学出版社制作团队的Mark Bellis、Lorraine Doneker、Dimitri Karetnikov和Vickie Kearn的合作也十分愉快,在此感谢他们所有人。 我还要感谢普林斯顿大学信息技术政策中心提供的友好合作和对话,以及每周的免费午餐。同时,感谢选修COS 109课程的学生,他们的天才和热情一直让我惊叹并为我提供灵感。 《世界是数字的》致谢 我要对朋友和同事给予我无私的帮助和建议深表谢意。特别感谢Jon Bentley,他给每一页草稿都做了细致的批注。感谢Clay Bavor、Dan Bentley、Hildo Biersma、Stu Feldman、Gerard Holzmann、Joshua Katz、Mark Kernighan、Meg Kernighan、Paul Kernighan、David Malan、Tali Moreshet、Jon Riecke、Mike Shih、Bjarne Stroustrup、Howard Trickey和John Wait等人,他们极其认真地审读全书,提出很多有益的建议,让我避免了一些重大失误。还要感谢Jennifer Chen、Doug Clark、Steve Elgersma、Avi Flamholz、Henry Leitner、Michael Li、Hugh Lynch、Patrick McCormick、Jacqueline Mislow、Jonathan Rochelle、Corey Thompson以及Chris Van Wyk给出的宝贵评注。但愿他们一眼就看出我在哪里遵从了他们的建议,而不会留意那几处我没听劝的地方。 David Brailsford根据自己难得的经验给了我很多有用的建议,有出版方面的,也有文字排版方面的。Greg Doench和Greg Wilson也毫无保留地给了我一些出版建议。感谢Gerard Holzmann和John Wait提供照片。 Harry Lewis是2010~2011学年我在哈佛大学时负责接待我的人,本书的前几稿就是在那里写的。Harry的建议,还有他讲授类似课程的经验,以及他对我的几份草稿写的评注,对我帮助很大。哈佛大学的工程和应用科学学院以及伯克曼互联网与社会研究中心为我提供了办公的地点和设施,还有融洽友好、催人奋进的环境,以及免费的午餐(世上真有免费午餐!)。 最后,特别感谢选修“我们世界中的计算机”(COS 109)这门课的几百位学生。他们的兴趣、热情和友谊一直是激励我的源头。我希望他们几年后开始管理世界时,将以某种方式从这门课程中获益。
中文版序 译者序 前言 引言 第一部分 硬件 第1章 什么是计算机 1.1 逻辑结构 1.1.1 处理器 1.1.2 主存储器 1.1.3 二级存储器 1.1.4 其他 1.2 物理结构 1.3 摩尔定律 1.4 小结 第2章 比特、字节和信息的表示 2.1 模拟和数字 2.2 模数转换 2.2.1 图像的数字化 2.2.2 声音的数字化 2.2.3 电影的数字化 2.2.4 文本的数字化 2.3 比特、字节和二进制 2.3.1 比特 2.3.2 2的幂和10的幂 2.3.3 二进制数值 2.3.4 字节 2.4 小结 第3章 深入了解处理器 3.1 玩具计算机 3.1.1 第一个玩具程序 3.1.2 第二个玩具程序 3.1.3 分支指令 3.1.4 内存中的表示 3.2 真实的处理器 3.3 缓存 3.4 其他类型的计算机 3.5 小结 硬件部分小结 第二部分 软件 第4章 算法 4.1 线性算法 4.2 二分查找 4.3 排序 4.4 难题和复杂性 4.5 小结 第5章 编程与编程语言 5.1 汇编语言 5.2 高级语言 5.3 软件开发 5.3.1 库、接口和开发工具包 5.3.2 bug 5.4 知识产权 5.4.1 商业秘密 5.4.2 商标 5.4.3 版权 5.4.4 专利 5.4.5 许可 5.5 标准 5.6 开源软件 5.7 小结 第6章 软件系统 6.1 操作系统 6.2 操作系统是如何工作的 6.2.1 系统调用 6.2.2 设备驱动程序 6.3 其他操作系统 6.4 文件系统 6.4.1 二级存储文件系统 6.4.2 删除文件 6.4.3 其他文件系统 6.5 应用程序 6.6 软件层次 6.7 小结 第7章 学习编程 7.1 编程语言的基本概念 7.2 第一个JavaScript程序 7.3 第二个JavaScript程序 7.4 循环和条件 7.5 JavaScript库和接口 7.6 JavaScript是如何工作的 7.7 第一个Python程序 7.8 第二个Python程序 7.9 Python库和接口 7.10 Python是如何工作的 7.11 小结 软件部分小结 第三部分 通信 第8章 网络 8.1 电话与调制解调器 8.2 有线电视和DSL 8.3 局域网和以太网 8.4 无线网络 8.5 手机 8.6 带宽 8.7 压缩 8.8 错误检测与纠正 8.9 小结 第9章 互联网 9.1 互联网概述 9.2 域名和地址 9.2.1 域名系统 9.2.2 IP地址 9.2.3 根服务器 9.2.4 注册你自己的域名 9.3 路由 9.4 TCP/IP 9.4.1 互联网协议 9.4.2 传输控制协议 9.5 高层协议 9.5.1 Telnet和SSH协议:远程登录 9.5.2 SMTP:简单邮件传输协议 9.5.3 文件共享和点对点协议 9.6 互联网上的版权问题 9.7 物联网 9.8 小结 第10章 万维网 10.1 万维网是如何工作的 10.2 HTML 10.3 cookie 10.4 动态网页 10.5 网页之外的动态内容 10.6 病毒、蠕虫和木马 10.7 Web安全 10.7.1 对客户端的攻击 10.7.2 对服务器的攻击 10.7.3 对传输中信息的攻击 10.8 自我防御 10.9 小结 第四部分 数据 第11章 数据和信息 11.1 搜索 11.2 跟踪 11.3 社交网络 11.4 数据挖掘和聚合 11.5 云计算 11.6 小结 第12章 人工智能和机器学习 12.1 历史背景 12.2 经典机器学习 12.3 神经网络和深度学习 12.4 自然语言处理 12.5 小结 第13章 隐私和安全 13.1 密码学 13.1.1 密钥加密 13.1.2 公钥加密 13.2 匿名 13.2.1 Tor以及Tor浏览器 13.2.2 比特币 13.3 小结 第14章 接下来会发生什么 注解 术语表