前言
你是否好奇计算机是如何工作的?获得对计算机的广泛理解通常是一个漫长而曲折的过程。问题不在于缺乏相关文档,在网络上快速地搜索一下就能找到很多致力于解释计算机工作原理的书籍和网站。编程、计算机科学、电子学、操作系统……那里有大量的信息。这是件好事,却会让人望而生畏。那么,你应该从哪里开始呢?一个主题是如何联系到另一个主题的?本书的目的是为大家提供一个切入点,方便大家学习计算机的关键概念,并了解这些概念是如何结合在一起的。
在我担任工程经理时,我面试了很多软件开发方面的求职者。通过与他们的交谈,我了解到他们知道如何编写代码,但是相当一部分人似乎并不了解计算机实际上是如何工作的。他们知道如何让计算机执行命令,但并不理解幕后的情况。对这些采访结果的反思,以及我自己努力学习计算机的经历,促使我撰写了这本书。
我的目标是用一种易于理解、可动手操作的方式呈现计算机的基础知识,让抽象概念更加真实。本书并没有深入介绍每个主题,而是主要介绍计算机的基础概念,并将这些概念联系起来。我希望大家能在脑海中勾勒出计算机是如何工作的,这样就能深入挖掘感兴趣的主题了。
计算机无处不在,随着我们的社会越来越依赖于技术,我们需要广泛理解计算机的人才。我希望本书能帮助大家获得广阔的视野。
本书读者
本书适合想要了解计算机工作原理的任何人。读者不必具备与所述主题相关的预备知识,因为本书是从零开始介绍的。如果你已经有编程或电子学方面的背景,那么本书可以帮助你扩展其他领域的知识。本书是为以下这些自学者编写的,他们熟悉基础数学和科学,且熟练使用计算机和智能手机,但仍然对它们的工作原理存有疑问。本书的内容对教师也有用,我相信书中的内容设计非常适合课堂讲解。
本书内容
本书把计算机看作一个技术栈。现代计算设备(如智能手机)就是由技术层组成的。这个栈的底层是硬件,顶层是应用程序,顶层与底层之间是多个技术层。层次模型的优点在于,每一层都受益于较低层的全部功能,但任意给定层都只需要建立在其下面一层上就可以了。在介绍了一些基础概念后,我们将自下而上地逐层讲解该技术栈,从电子电路开始,一直推进到驱动网络和应用程序运行的技术。以下是各章所包含的内容。
第1章涵盖计算机的基础概念,比如模拟和数字、二进制数字系统和SI(国际单位制)前缀。
第2章探索如何用二进制表示数据和逻辑状态,介绍逻辑运算符。
第3章解释电学和电路的基本概念,包括电压、电流和电阻。
第4章介绍晶体管和逻辑门,并总结第2章和第3章的概念。
第5章展示如何用数字电路执行加法运算,进一步揭示数字是如何在计算机中表示的。
第6章介绍存储器设备和时序电路,演示如何用时钟信号进行同步。
第7章介绍计算机的主要组成部分:处理器、存储器和输入/输出。
第8章展示处理器执行的低级机器码,介绍汇编语言——一种人类可读形式的机器码。
第9章介绍不依赖于特定处理器的编程语言,包含C语言和Python语言的代码示例。
第10章介绍操作系统系列以及操作系统的核心功能。
第11章讲解互联网的工作原理及常用网络协议套件。
第12章解释网络的工作原理及核心技术:HTTP、HTML、CSS和JavaScript。
第13章概述一些现代计算机主题,如app、虚拟化和云计算。
阅读本书时,你将会看到用于解释概念的电路图和源代码。这些都是教学工具,主要是为了直白地讲解内容,而不是为了说明工程师在设计硬件和软件时需要考虑的性能、安全性等因素。换句话说,本书中的电路和代码虽然能帮助你领会计算机是如何工作的,但它们不见得是最好的例子。同样,书中的技术示例也偏向于简单,不够完整。有时,我会省去某些细节,以免介绍得太复杂。
关于练习和设计任务
本书几乎每章都配有练习和实践设计任务。这些练习是让你动脑或用纸笔来解决的问题。实践设计任务不仅是脑力练习,还经常涉及电路搭建或计算机编程。
做这些设计任务需要购买一些硬件(附录B给出了所需组件的列表)。之所以要加这些设计任务,是因为我相信最好的学习方法就是自己去尝试。如果想从本书获得最大收益,那么一定要去完成这些实践设计任务。尽管如此,即使你一个电路都不搭建,一行代码都不输入,也可以继续跟进书中所呈现的内容。
附录A中给出了练习的答案,相应章末给出了每个设计任务的详细资料。附录B包含了启动这些设计的信息,在需要时,设计文本可以为你指明方向。
各设计任务所用源代码可以从https://www.howcomputersreallywork.com/code/获得。你还可以在https://nostarch.com/how-computers-really-work/上访问本书,了解相关更新内容。
我的计算机之旅
我对计算机的痴迷可能是从小时候玩电子游戏开始的。每当我去拜访祖父母时,我都会连着几小时玩我阿姨的Atari 2600游戏机上的Frogger、Pac-Man和Donkey Kong。后来,当我上五年级的时候,我的父母在圣诞节把任天堂娱乐系统当作礼物送给我,我好激动!虽然我喜欢玩《超级马里欧兄弟》和《双截龙》游戏,但随着时间的推移,我开始好奇电子游戏和计算机是如何工作的。可惜的是,我的任天堂游戏机并没有为我提供许多关于其内部情况的线索。
大约是在同一时期,我家购买了第一台“真正的”计算机——苹果IIGS,它为我打开了一扇新的大门,让我去探索这些机器究竟是如何工作的。幸运的是,我的初中开设了一门关于苹果II计算机的BASIC编程课程,我很快就发现我对探索编程的需求是无止境的!我会在学校写好代码,把它复制到软盘带回家,然后在家里继续编程。在整个初中和高中阶段,我学到了更多关于编程的知识,我确认自己非常喜欢它。我还开始意识到,尽管BASIC和其他类似的编程语言能相对容易地告诉计算机做什么,但它们还是隐藏了很多关于计算机工作原理的细节,我希望在这方面能更加深入。
我在大学学习的是电气工程,我开始了解电子电路和数字电路。我学习了C语言和汇编语言课程,终于了解了计算机是如何执行指令的。计算机工作原理的底层细节也开始变得有意义起来。在大学,我还开始学习被称为“万维网”(World Wide Web)的新事物,我甚至还制作了自己的网页(这在当时似乎很了不起)!我开始编写Windows应用程序,并开始接触UNIX和Linux。这些内容有时似乎与数字电路和汇编语言的硬件具体细节相去甚远,我很想知道它们是如何结合在一起的。
大学毕业后,我很幸运地在Microsoft公司找到一份工作。在那里的17年中,从调试Windows内核到开发Web应用程序,我从事过各种软件工程工作。这些经历使我对计算机有了更广、更深的理解。我和许多非常聪明且知识渊博的人一起共事,我认识到,关于计算机总是有学不完的知识。理解计算机是如何工作的,已经成为我一生的追求,我希望能通过本书把我学到的一些东西传递给大家。