购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.1 背景介绍

一炮一旗山海路,一炮二旗石门冲。一炮三旗台头警,一炮四旗燕河攻。

——戚继光

交流是人类永恒的需求。人们通过交流了解同类的所思所想,学习同类的所作所为。

除了与身边的人进行日常交流,人们渴望快速了解远方发生的事情,以便于拓宽自己的视野,提升自己的认知。

这便是信息传递,简称 通信

最早的通信用于传递军情。古希腊的长跑健将斐迪庇第斯(Pheidippides)为了传递战争胜利消息,从马拉松跑了40多千米到达雅典,促成了马拉松运动项目的诞生。

《史记·周本纪》中记载了“烽火戏诸侯”的故事,说明早在我国西周时期(公元前1046—前771年),就有了借助烽火台传递军情的制度。

火和烟是最初采用的手段。白天点狼粪放烟,夜里点柴草放火。假设烽火台与烽火台之间的距离为5000米,每个烽火台从发现上一个烽火台的烟到自身完成点火生烟需要5分钟,则信息的传递速率为1000米/分钟,即60千米/小时、1440千米/天。

到了宋代(公元960—1279年),火药已得到广泛应用。由于火药生烟迅速,人们通过炮火加举旗的方式,提升了信息传递的效率。

明清时期(公元1368—1912年),烽火台地点的设置更加合理,还会根据敌情的规模采用不同的点灯放炮形式。戚继光《练兵纪实》卷六中记载了《传烽歌》,守台官兵背诵熟记,提升了传递效率。这样每天可传递4000千米以上,边疆的敌情传到北京最多只需几个时辰

不过,以上速率已是烽火台通信的极限。同一时期,世界范围内的电磁革命正在同步上演。

1.1.1 电报与无线电

磁现象与静电

人们很早就观察到了磁与静电的现象。

据F.Cajori的 A history of physics 记载,古希腊的泰勒斯(Thales of Miletus),早在公元前5世纪,就发现了琥珀摩擦能产生静电的现象。

约成书于公元前4世纪的《鬼谷子》中有记载:故郑人之取玉也,必载司南之车,为其不惑也。司南是可以指南的磁石,人们带着它去寻找矿石,就不会迷失方向了。

西晋张华(232—300)写的《博物志·杂说上》中有记载:今人梳头著髻时,有随梳解结有光者,亦有咤声。这便是我们熟悉的毛发摩擦生电的现象。

1600年,物理学家威廉·吉尔伯特(William Gilbert,英国,1544—1603)出版了著作 De Magnete (《论磁》),这是第一本系统性阐述静电与磁现象的书。该书记录了大量材料摩擦生电的实验结果,伽利略(Galileo,意大利,1564—1642)对此书颇为赞赏 。吉尔伯特还研制了第一台验电器。如果把摩擦生电想象成发送端,把验电器想象成接收端,这正是最早的电荷载体的RTC雏形,如图1-1所示。

图1-1 电荷RTC

到18世纪初,大量更好的电荷源被开发出来。人们还发现存在两种性质的电:正、负电荷。同性相斥,异性相吸。然而,摩擦产生的电不易存储,这限制了人类对电的深入研究。

电池的发明

1745年,莱顿大学的马森布罗克教授(Musschenbroek,荷兰,1692—1761)制造了第一个可以存储电荷的装置—— 莱顿瓶 (Leyden Jar)。

1746年,在伦敦的物理学家彼得·柯林森(Peter Collinson,英国,1694—1768)给远在费城的本杰明·富兰克林(Benjamin Franklin,美国,1706—1790)邮寄了一支莱顿瓶,并在信中向他介绍了使用方法。

同一年,富兰克林提出正负电的概念,以及电荷守恒定律。1752年,富兰克林利用风筝实验将闪电存储于莱顿瓶中,证实了闪电也是一种电。人们对电的认知逐步统一。

1786年,动物学家伽尔瓦尼(Luigi Galvani,意大利,1737—1798)在解剖青蛙时,意外发现刀尖碰触蛙腿外露的神经时,会发生痉挛,并同时产生火花。他意识到这也是一种电。1791年,他发表了 De viribus electricitatis in motu musculari commentarius (《论肌肉运动中的电力》),阐述了这一研究成果,他称这种动物体表面本来的电为“动物电”。这让当时的科学界非常震惊。

1800年,物理学家伏特(Volt,意大利,1745—1827)受伽尔瓦尼的启发,研究了不同金属与液体的接触电势差。他发表了 On Electricity Excited by the Mere Contact of Conducting Subsubstances of Different Kinds (《论不同导电物质接触产生的电》),并发明了伏特电堆,也就是 电池 。人们对电的认知,一下子跳出了静电的领域。

电磁效应与电报

电池的发明,使人们更方便地进行研究与实验,也让人们收获了一些意外的惊喜。

1820年,物理化学家奥斯特(H.C.Oersted,丹麦,1777—1851)在一次演讲中使用了伏特电堆,他偶然间发现在接通电源的瞬间,磁针跳动了一下。同年7月21日,他写成论文 Experiments on the Effect of a Current of Electricity on the Magnetic Needle (《论磁针的电流撞击实验》)。这篇只有4页的论文标志着电流磁效应的发现,进而他发明了 电磁铁

1832年,画家莫尔斯(Morse,美国,1791—1872)在从法国返乡的轮船上观看了一个魔术。表演者杰克逊使用了电磁铁,与之一番畅谈后,41岁的莫尔斯决定转行搞发明。

1837年,莫尔斯制造出一台 电报机 ,其有效工作距离仅为500米。历经改进,1844年,他用 莫尔斯码 成功发送了第一份长途电报

1866年,首条大西洋海底光缆成功投入使用。至此,人类已经可以借助电线来传递消息。由于传递速度接近于光速,这使得RTC第一次称得上“实时”。

虽然有线电报解决了远距离传输的问题,但人类在利用和探索自然的路上仍没有停下脚步,无线电的发明也在黎明前夜。

无线电的发明

自从1820年奥斯特碰巧发现电能生磁的现象后,科学家们一直都在探索磁能否生电。

1825年,科学家科拉顿(J.D.Colladon,瑞士,1802—1892)将磁铁插入导线绕成的铁圈中,他认为这样就能产生电流。但由于电流计被放在另一个房间中,等他跑过去时,并没有看到电流计的偏转。这一失误让发电机的诞生推迟了好些年。

1831年,科学家迈克尔·法拉第(Michael Faraday,英国,1791—1867)通过10年实验终于发现了磁也能生电,并造出第一台 发电机 。人们尊称他为“电学之父”。

1865年,麦克斯韦(J.C.Maxwell,英国,1831—1847)秉承了法拉第的物理直觉,发挥自身的数学优势,建立了电磁学理论基础,并预言了 电磁波 的存在。1873年,麦克斯韦出版了 A Treatise on Electricity and Magnetism (《论电和磁》),这是继牛顿(Isaac Newton,英国,1642—1727)的 Mathematical Principles of Natural Philosophy (《自然哲学的数学原理》)后最重要的物理学经典。

1888年,物理学家赫兹(H.R.Hertz,德国,1857—1894)在大庭广众之下做了电磁波的演示实验,首次证实了麦克斯韦所说的电磁波的存在。

1895年,21岁的大学生马可尼(G.Marconi,意大利,1874—1937)在杂志上看到了赫兹的实验。在博洛尼亚大学学习期间,他用电磁波进行了约2千米距离的无线电通信实验,获得了成功。1897年,他在伦敦成立马可尼无线电报公司,并于1909年获得诺贝尔物理学奖。马可尼被称为“无线电之父”。

无线电 的发明,标志着通信行业的诞生。

至此,人们可以使用有线与无线方式,将一个跳变信号瞬时传递到远方。通过对信号的编码,我们就能向远方传递“信息”。

1926年,发明家尼古拉·特斯拉(Nikola Tesla,塞尔维亚裔美籍,1856—1943)有过如下一段预言:

When wireless is perfectly applied the whole earth will be converted into a huge brain,which in fact it is,all things being particles of a real and rhythmic whole,we shall be able to communicate with one another instantly,irrespective of distance.

Not only this,but through television and telephony we shall see and hear one another as perfectly as though we were face to face,despite intervening distances of thousands of miles;and the instruments through which we shall be able to do this will fit in our pockets.

这是一段有关RTC的非常确切与准确的预言。

无线电可以让信息高速传输。然而,机械装置非常笨重,有限的编码类型限制了传递信息的容量。人们需要一种高效计算与海量存储信息的自动化的机器。这就是 电子计算机

1.1.2 计算机与互联网

人工与机械计算

古人最早使用手指进行计算,但计算的结果不易存储。《周易·系辞》中记载了“上古 结绳而治 ”,在《左传》中,人们用绳子打结的大小和数量来记录各种结果。

战国时期,筹棍逐渐成为计数工具,筹算成了主要的计算方法。“运筹帷幄”中的筹,便是 算筹 。秦始皇、张良都使用过算筹。而祖冲之用算筹算出了π的7位小数的近似值。

到元代中叶后,珠算逐渐取代了筹算。然而,这样的计算终归需要手工进行。

作为纺织的重要工具,中国的提花机在六七世纪通过“丝绸之路”传到了西方。虽然主要用于纺织,但也可以看作一种自动编排和自动运行的机器。

1642年,19岁的帕斯卡(Blaise Pascal,法国,1623—1662)为了帮助父亲减轻繁重的计算工作,设计了一台能够进行加减法的计算器。

1673年,莱布尼茨(G.W.Leibniz,德国,1646—1716)发明了一台可以直接进行机械乘法的计算器,其中使用了“莱布尼茨轮”,这个原理直到20世纪仍在广泛使用。

1804年,雅卡尔(Joseph Marie Jacquard,法国,1752—1834)发明了 雅卡尔提花机 ,速度比手工快25倍。

1836年,著名的数学家查尔斯·巴比奇(Charles Babbage,英国,1791—1871)制造了一台木齿铁轮计算机,并利用雅卡尔打孔卡片的原理为这台计算机编程。

1843年,英国诗人拜伦的女儿阿达·洛芙莱斯(Ada Lovelace,英国,1788—1824)设计了用上述机器计算伯努利数的运算方式。她被认为是世界上第一个程序员。

如今,我们也许会发现,所谓计算机只是一台高级的织布机,计算的本质是机械运动。

计算的理论基础

为了将自动计算变为实际可行的技术,需要建立一套完备的理论体系。

莱布尼茨在1672—1676年研究了二进制算术,他受《易经》中八卦图的启发,于1679年写了题为 De I'arthmetique binaire (《二进制算术》)的论文。

莱布尼茨一直希望发明一种普适的人工数学语言和演算规则,能够对人类各行各业的问题进行百科全书式的解法编纂,从而帮助人类减轻精神负担。以下是他关于通用计算的描述。

具有善良意志的人们围坐在桌子旁,来解决某个棘手的问题,他们用“通用语言”写下这个问题,然后说:“让我们算一下!”于是人们拿出笔来找到一个答案,其对错必然可以被所有人接受。

17世纪,笛卡儿(René Descartes,法国,1596—1650)和费马(Pierre de Fermat,法国,1601—1665)分别建立了几何图形坐标化的计算理论——解析几何。

1847年,布尔(George Boole,英国,1815—1864)出版了 The Mathematical Analysis of Logic ,建立了逻辑学的计算理论——数理逻辑。

1879年,弗雷格(Frege,德国,1848—1925)设计了形式语言与概念文字,为所有数学概念找到了纯逻辑术语。

19世纪末,康托尔(Cantor,德国,1845—1918)建立了集合的一般计算理论——集合论,并将无限纳入了形式系统中。关于数学无穷的革命,几乎是由他一个人独立完成的。

1899年,希尔伯特(David Hilbert,德国,1862—1943)出版了《几何基础》,成为近代公理化方法的代表作。他发表的23个数学问题,成为那个时代一面鲜明的旗帜。

1931年,哥德尔(Kurt Gödel,美籍奥地利,1906—1978)证明了哥德尔不完全性定理,即在任何一个形式逻辑系统中,总是存在某种命题,你无法证明其真,也无法证明其假。若要证明这类命题,需要引入更高阶的符号系统来描述。这就像海森堡测不准原理之于物理一样,为数学打下了基础。

1936年5月,图灵(Alan M.Turing,英国,1912—1954)在 On Computable Numbers,with an Application to the Entscheidungsproblem 中描述了“ 图灵机 ”。从此,数学符号与实体世界第一次建立了联系。

1948年10月,香农(Claude E.Shannon,美国,1916—2001)于《贝尔系统技术学报》上发表了论文 A Mathematical Theory of Communication ,标志着现代信息论研究的开端。

同年,诺伯特·维纳(Norbert Wiener,美国,1894—1964)的《控制论》出版。

以上事件,为电子计算机的诞生做好了理论铺垫。

IBM和Intel

二战后期,出于军事目的,人们开始尝试电子计算机的研发。

1945年底,第一台通用电子计算机——ENIAC(Electronic Numerical Integrator and Computer)正式诞生。它最初用于弹道计算,后经改造,能够进行各种科学计算。

1951年10月,冯·诺依曼(John von Neumann,美国,1903—1957)担任IBM公司的顾问。1952年新上任的总经理小沃森,通过敏锐的观察力,决定进入电子计算机领域。

1952年底,IBM 701正式完成,被用于商业计算领域。

此后近20年,各种大型计算机陆续被研制出来。到20世纪50年代末,IBM公司已经能年产上千台。

20世纪60年代,IBM 1401面世,使用了晶体管线路,并配有汇编和COBOL语言。

这期间,IBM 360的创始人布鲁克斯(Frederick P.Brooks,美国,1931—2022)撰写了著名的《人月神话》。

1969年,Intel的年轻工程师霍夫(Marcian Hoff,美国,1937—)受日本公司委托设计一款台式计算机。他大胆地采用了可编程通用计算机的思想,将电路精简为CPU、RAM、ROM、寄存器(Register)电路片这4个部件。另一位工程师费金(Federico Fagin,意大利,1941—)对这一电路进行了设计,在4.2mm×3.2mm的硅片上集成了2250个晶体管,用单个芯片实现了中央处理器的功能,这就是4位微处理器——Intel 4004。

1972年,8位处理器——Intel 8008诞生,在13.8 mm的芯片上可以执行45种指令。

此后近30年,芯片集成电路的发展遵循着著名的 摩尔定律 ,即处理器的性能大约每两年翻一倍,同时价格下降为之前的一半。

如今,微型计算机已经普及到千家万户。

互联网的诞生

当人们有了各自的微型计算机后,自然希望能将彼此连通起来,进行更高效的通信与协作。

这些任务被交给了受美国ARPA 资助的各单位的研究生,这就是最早的互联网的雏形——ARPANET。

1969年4月7日深夜,美国加州大学的斯蒂芬·克罗克(Steve Crocker,美国,1944—)为了不打扰其他室友睡觉,在厕所里写下了第一份RFC(Request for Comments),这是用来制定互联网协议的一种方式:发布者提出协议请求,请大家评论并给予建议。这样一种谦卑的协议制定方式,为后续互联网的平等发展,奠定了环境上的开放式基调。

之后,大量的网络与协议在不断创新中诞生,各种骨干网络通过网络协议彼此连接。最终TCP/IP成为互联网中使用最广泛的传输协议。其之上的各种应用层协议(如SSH、HTTP、FTP、SMTP等)也逐渐成为标配。

为了使计算机与工具更加易用,人们在硬件之上搭载了一个最基本的软件——操作系统,将在下一节进行介绍。

1.1.3 主流平台简介

UNIX和Linux

在微型计算机诞生后,越来越多的人开始使用这个跨时代的工具。由于CPU只能执行二进制指令,这增加了人们使用它的难度。

1972年,贝尔实验室的丹尼斯·里奇(Dennis M.Ritchie,1941—2011)和肯·托马森(Kenneth Lane Thompson,1943—)设计发明了C语言。C语言不仅定义了一套标准易用的编程符号,还使用了栈结构来实现基于函数的计算,使计算机的编程过程化、结构化。他们用C语言重写了UNIX操作系统。

借助操作系统和编程语言,人们使用计算机的便利性大大增强。

1991年,在芬兰赫尔辛基大学就读的李纳斯·托瓦兹(Linus B.Torvalds,1969—),基于x86架构的CPU开发了一个可移植的操作系统——Linux。这个系统完全免费并且开源。后来,又有相当多的开源工具集成其中。

Linux使用C语言与汇编语言进行开发,提供的API也是纯C语言接口,有着“一切皆文件”的设计理念。

UNIX和Linux都基于命令行的操作界面,有一定的学习门槛。但是这些系统的资源利用率往往极高,程序运行也十分高效。掌握使用命令行的方法,是计算机专业人士必备的技术。

Linux并没有官方的编程套件,人们通常会使用Vim/Emacs进行代码编辑,使用GCC(GNU Compiler Collection)进行编译,使用GDB(GNU Debugger)进行调试,一切都是基于命令行的。本书推荐使用VSCode+RemoteSSH插件进行可视化开发。

DOS和Windows

1980年8月,24岁的程序员蒂姆·帕特森(Tim Paterson,美国,1956—)基于Intel的16位芯片8086,开发了操作系统QDOS(Quick and Dirty Operating System)。

1981年7月,微软的CEO比尔·盖茨(Bill Gates)意识到未来个人电脑将有巨大的市场规模,他将QDOS收购,并将其改名为MS-DOS(Microsoft Disk Operating System)。

随后,DOS系统一直持续更新,直到Windows XP中的8.0版本。

1985年11月,微软发布了视窗操作系统Windows 1.0。

Windows系统的诞生,在计算机发展史上具有里程碑式的意义。图形化的操作界面,让计算机的使用更加便利。大量的软件工具在其上蓬勃发展。其中一类应用便是实时通信(Instant Messaging,IM)。

20世纪90年代,中国各城市中建起了大小规模的网吧。人们通过当时最著名的IM软件——QQ结交网友,通过各种聊天室互相问候,通过局域网联机玩游戏并进行语音协作。

Windows与实时通信的普及,提高了一代人的打字速度。

Windows系统提供C/C++接口的API,供开发者进行软件开发。

微软提供开发者文档MSDN,以及编程IDE(Integrated Development Environment)—Visual Studio,其社区版本可以免费安装使用。

用户使用Windows API时,需要记得3 件事。

(1)包含头文件(.h)。

(2)链接库文件(.lib)。

(3)动态链接时,在运行时目录 放置dll文件。

微软基于Win32 API封装了C++的基础库MFC(Microsoft Foundation Classes),用于简化开发任务。

微软还提供了ATL(Active Template Library),用于简化COM组件的开发。

微软同时维护着WTL(Windows Template Library),这是一套轻量高效的窗口模板类,本书的大部分Windows Demo都是用WTL开发的。

iPhone和macOS

2007年1月9日,Apple公司的CEO史蒂夫·乔布斯(Steve Jobs,1955—2011)发布了第一款iPhone——iPhone 2G。这标志着智能手机时代的正式到来。

之后几乎每一年,Apple公司都会发布一款全新的iPhone手机,代表着业内手机的最高水准。

iPhone手机内置摄像头和麦克风,这极大地降低了人们进行实时通信的门槛。

iPhone采用更加友好的全触屏操作界面,这对于消费者非常友好,再次彻底改变了人们使用计算机的习惯。iPhone的操作系统iOS,其底层XNU由UNIX的某个分支发展而来。每个iOS App都是一个独立的沙盒进程,彼此隔离。

同时,Apple公司也推出了自己的桌面操作系统——macOS。与微软不同的是,Apple官方提供的API是基于Objective-C(OC)和Swift的。Apple开发者的官网提供IDE——Xcode,以及在线开发文档。成为正式应用的开发者需要向Apple公司支付一定的费用。

使用OC接口的方式与Windows类似。

(1)包含头文件(.h)。

(2)引入库文件(.framework文件)。

(3)链接非系统库时,需要配置rpath选项。

本书介绍的示例都使用OC代码,因为其和C/C++的混合编译比较方便。

Android和Chrome

2008年9月,Google紧随Apple其后,发布了Android 1.0系统。

与Apple公司的选择不同,Android系统使用的是开源许可,各大手机制造厂商都可以基于Android系统的代码,定制自己的移动操作系统。国内如华为、小米、OPPO、vivo,大都采用Android的基线进行定制。Android的底层内核是Linux,其上有各种Java的Framework,供应用程序使用。Android应用开发使用Java和Kotlin语言。Google开发者的官网提供Android Studio和官方文档。

本书介绍的示例都使用Java的代码,在其和C/C++进行交互时,需要借助JNI。

根据Statcounter 2023年9月的统计,Android、Windows、iOS、macOS的使用占比分别为37.59%、30.85%、16.59%、9.08%,如图1-2所示。

图1-2 各操作系统的市场占有率(2022年9月—2023年9月)

因此,目前的主流计算机系统,实际上由3大桌面系统(Windows、macOS、Linux)和两大移动终端系统(iOS和Android)组成。要进行跨平台的RTC通信,就必须将RTC构建于多种操作系统之上。

Web浏览器具备天然的跨平台性,可以用来隔离平台之间的差异。

基于这样的思路,Google公司借助其Chrome浏览器的优势,于2020年10月推出了WebRTC标准,意在借助浏览器的便利性,统一RTC领域的技术标准。

WebRTC的标准指W3C的JavaScript的API标准,包含1000多个API。WebRTC的实现涉及IETF 100多个RFC协议,本书会陆续介绍一些。下节我们将介绍如何利用最少的代码屏蔽各个平台之间的差异。

1.1.4 跨平台开发

主流开发平台

在上一节,我们介绍了目前的主流操作系统由3大桌面系统(Windows、macOS、Linux),以及两大移动终端系统(iOS和Android)组成。RTC的设计目标应该要能兼容这5大系统的不同之处。

对程序员而言,不同的操作系统对应着不同的首选IDE、编译器和SDK(Software Development Kit,软件开发包),如表1-1所示。

表1-1 不同操作系统的首选IDE、编译器和SDK

我们希望使用一份C++代码,就能适应不同环境下的基本编译环境。

跨平台编译

如何自动识别当前代码是在哪个平台编译的呢?

我们知道,每个平台的编译器都有一些独一无二的 预定义宏 (Predefined Marcos)。借助这些预定义宏,并假设我们在各个平台都使用官方推荐的开发环境,就可以识别当前的平台。

例如,微软的MSVC编译器会定义_MSC_VER宏;Android的Clang编译器会定义__ANDROID__宏。

所以,我们自动区分5个平台的示例代码如下:

img
img

我们可以在各个平台的差异文件中,配置各个编译器的特有属性及平台特有属性。

例如,在Windows平台上:

img

在iOS平台上:

img

基本类型

由于历史原因,在各种编译器下,C语言的基本类型的长度会有少量不一致。尤其注意wchar_t和long类型在不同系统中的长度。

我们使用DTypes.h来定义自己的基本类型,屏蔽类型长度的不一致。

img

借助DConfig.h和DType.h,我们可以屏蔽C++代码在平台与编译器上的差别。

Hello World

作为本书的第一个代码示例,我们将实现一个跨平台的Hello程序,它会在不同的平台上显示不同的Hello提示。

我们设计一个跨平台隔离的C++类DXP ,并为其封装两个static方法。

img

主程序如下:

img

上述代码在Windows上会输出Hello Windows\r\n。而在macOS上则会输出Hello macOS\n。

在下一节,我们将在此基础上实现一个跨平台的缓存管理类。

总结

在本节,我们简要地回顾了从古至今人类传递信息的各种方式。借助电与电磁波,人们有了高速传递信息的载体。借助计算机与互联网,人们有了操作信息的设备与传播信息的渠道。操作系统与智能手机的普及,让每个人都能随时随地参与信息的生产与消费。为了能屏蔽各个编程平台的差异,我们使用了预定义宏,并定义了一个通用类型系统。

活在信息时代的我们,一出生就被各种信息围绕。人的一生会接触各种各样的信息,我们需要了解信息、辨别信息、善用信息。这些是我们做决策赖以依据的根基。

在计算机中,信息都是用二进制数的0和1存储的。我们将在下一节具体介绍。

要点回顾

·计算机诞生前的通信技术。

·计算机的诞生与互联网的兴起。

·各种操作系统的特点。

·使用预定义宏识别编译平台。

·使用类型定义统一基本类型。

·实现跨平台的print函数。

参考阅读

1.《计算机发展简史》(1985年),陈厚云等编著。该书有非常多的史料细节。

2. Media Technology and Society (1998年),Brian Winston著。该书记录了从电报到互联网的各种历史发展与参考。其中提到,1665年,英国的罗伯特·胡克(Robert Hooke,1635—1703)提出了借助一根特制的电线瞬间传递一个声音的想法,这应该是最早的关于电话的设想。

3.《逻辑的引擎》(2005年),马丁·戴维斯著,张卜天译。该书描述多个数学家为计算机诞生所做的贡献。

4.《穿越计算机的迷雾》(2011年),李忠。该书用通俗易懂的语言讲述了计算机诞生前夜的故事。2018年出版了第二版。

5.F.P.Brooks另一本著作《设计原本》( The Design of Design ),也是软件工程领域的经典。

6.《观止·Windows NT》讲述了Windows NT系统诞生的过程。

7.《离心力:互联网历史与数字化未来》( A History of the Internet and the Digital Future )(2018年),Johnny Ryan著,段铁铮译。该书提供了互联网诞生的许多背景材料。

8.有关CPU的指令介绍,可以在线下载Intel的编程手册

9.Windows平台上的开发资料

(1)《Windows核心编程》,Jeffery Richter著,是学习kernel32.dll主要函数的首选图书。

(2)《Windows程序设计》,Charles Petzold著,是学习user32.dll主要函数的首选图书。

(3)《Windows图形编程》,Feng Yuan著,是学习gdi32.dll主要函数的首选图书。

10.Linux下的开发资料

(1)《鸟哥的Linux私房菜》基础学习篇,是学习Linux命令行不错的入门材料。

(2) The UNIX Programming Environment (1983年),Brian W.Kernighan,Rob Pike著。

(3) Advanced Programming in the UNIX Environment 3rd(2013年),W.Richard Stevens,Stephen A.Rago著。

11.iOS的开发资料

(1) iOS Programming:The Big Nerd Ranch Guide (2020年),Christian Keur,Aaron Hillegass著。

(2) Programming iOS 14 (2021年),Matt Neuburg著。

12.macOS的开发资料

(1) OS X and iOS Kernel Programming (2011年),Ole Henry Halvorsen,Douglas Clarke著。

(2) *OS Internals ,Volume I(2017年);Volume II(2019年),Jonathan Levin著。

13.Android的开发资料

(1) Android Programming:The Big Nerd Ranch Guide (2019年),Bill Phillips,Chris Stewart,Kristin Marsicano著。

练习题

1.[5分钟](通信概念)什么是通信?人们为什么要通信?古人为了通信都使用了哪些方法?

2.[10分钟](信鸽速率)古代人通过信鸽传递消息,调查一下其传输速率。

3.[10分钟](首份电报内容)上网查阅一下第一份电报的内容是什么。

4.[2小时](计算机发明史)计算机是如何发明的?有哪些关键事件?

5.[2小时](Wi-Fi发明人)Wi-Fi中的跳频技术是谁发明的?有何用途?

6.[10分钟](桌面系统版本)查看自己的Windows/macOS桌面系统使用的是什么版本?

7.[10分钟](手机系统版本)查看自己的手机使用的是什么系统?什么版本?

8.[30分钟](RFC查询与阅读)使用Web浏览器查阅第一份RFC的协议内容,并学习如何检索其他RFC文档。

9.[3人天](Linux命令)学习使用Linux命令,并编写一个Shell脚本,用于打印系统的版本号、CPU、内存、硬盘等信息。

10.[5人天](iOS编程)编写一个iOS App,尽可能多地显示当前系统的信息与用户设置。

11.[5人天](Android编程)编写一个Android App,尽可能多地显示当前系统的信息与用户设置。

12.[2人天](类型单元测试)为DTypes.h文件编写一个UT(Unit Test)文件,测试各个平台下基本类型的长度是否符合预期。 dwF2n5c5FzICGh9w1bLs1T90+vlBLSAetAUuvi5NuDU6aaueIO0aPAHssV4Jc/7H

点击中间区域
呼出菜单
上一章
目录
下一章
×