《目录》
- 打个头阵
- 机器的兴起
- 巴贝奇的机器
- The Stored-Program Computer
- 计算机思维与机器
- 用信号和二进制代码表示的形式
- 布尔代数与电路设计
- 基于 “步” 的 CPU 时钟的周期
- 分支结构
- 循环:小程序进行大计算
- The Address-Contents Distinction
- Subprograms
- 通用计算机
- Fault Tolerance and Data Protection
- Beyond the von Neumann Architecture
喂,本篇博客翻译的是《Computation Thinking》第三章 --- 自动的机器 。
第一章主要是聊 “计算机系”;第二章主要是讲 “图灵机”;第三章主要是看 “通用计算机”。
如果直接写英文的句子,就是我看不懂的;第三章有十几句话,我的确没懂。
要是觉得【译者补充】会打断思路可以直接跳过,但内容就很少很少了。
现在,我们来看看 自动机器 的发展过程,以及设计和理解 TA 们所需的计算思维的维度。
制造计算机主要是为了加速计算,消除人类计算中固有的误差。
人们总是对建立自动化的人类行为或人类思维方面的设备的想法感兴趣。
几千年来,工匠们为艺术和娱乐而建造自动机,例如动画动物形象、音乐盒、钢琴演奏者和模仿人们行为的类似悍马的雕像。
在 1770 年的欧洲,有一个 “土耳其傀儡”,是一个会下国际象棋的机器人,引起了轰动,因为 TA 似乎把下棋机械化了,而后被认为是一种高级的智力技能。
后来发现这是一场精心策划的骗局。
但这也激起了发明家们的好奇心,他们想知道他们是否真的能造出一台下棋机器。
译者补充:
下面这个机器人在国际象棋上击败过拿破仑和富兰克林。
这个机器人,纵横欧洲十几年呢。
因此,当时很多人怀疑棋盘下面的那个柜子里藏了个人,可打开柜子一看,只有一些齿轮罢了。
一直到了 1857 年,才发现。真的藏了一个人,但因为其设计的巧妙愣是没看出来。
现在的计算机基本都是基于图灵机,制造计算机的主要原因有俩点:
- 在机械加密时代,手工的解密实在吃不消。而那时恰逢二战,自然而然的就把图灵机这个数学模型发展成高性能的计算机了。
- 开发新武器,要判断是否可行。别到时候砸了一年的 GDP 进去,结果造不出来,那怎么向全国人民交代呀!很多新武器的计算量都很大,如原子弹、氢弹,还有冲击波杀伤力、飞机的空气动力学等,如果连材料都不知道是按 “斤” 算,还是按 “吨” 算,那还造什么!!
当专家能够将他们所知道的计算和推理编纂成程序步骤时,他们的知识对许多非专家来说是有用的,这些非专家只需遵循指示就可以毫无错误地获得结果。
但无论程序多么精确,操作人员都可能因为个人的原因出错。
他们健忘,他们不完全理解每一个计算操作,他们很容易分心,他们很快厌倦了一个长期的例行计算。
无论步骤多么简单明了,很多人都会出错。
对 40 卷旧数学表格的研究发现了 3700 个错误,还有一次只在一页上就发现了 40 个错误。
出于这个原因,发明家们自古以来都在寻找计算机和计算辅助工具,使人类能够以更少的误差完成更多的计算。
这是一个缓慢的过程。
对数尺 发明于 1620 年左右,是通过滑动标对刻度的木棒,实现了对数求和的乘法运算。
译者补充:
计算尺+对数表,就可以把复杂的运算变成简单的运算
举个例子, 使用计算尺和对数表后,公式就变成了 , 和 对数表上有,直接相加即可。
帕斯卡在 1642 年设计了一台计算器,TA 可以加减,但不会乘、除法。
其他人试图扩展 帕斯卡 的设计以允许多重操作,但都失败了。
The slide rule found its home among engineers and the arithmetic calculator among mathematicians and accountants.
在随后的几个世纪里,这些机器逐渐得到改进。
到了 20 世纪 30 年代,Keuffel 和 Esser 公司才是完成四种基本算术运算的机械计算器的主要供应商。
许多计算尺和机械计算器公司都被 20 世纪 50 年代电子计算机革命引发的雪崩式变化所冲走,就是挂掉了。
惠普 和 德州仪器 等新公司开始生产全电子桌面计算器,可以执行对数的运算规则和基本的算术功能。
1972年,格雷斯推出了 HP-35 可编程手持计算器,取代了工程师腰带上的滑动尺。
尽管 TA 们都很受欢迎,但是计算尺和计算器有两个严重的局限。
首先,TA 们只能完成简单的计算;但现实是需要复杂的计算,算式会很长很长。
其次,这些工具只能用于一个目的,只能计算。
电子数字计算机用一个激进的想法克服了这些局限:软件存储在机器内存中。
软件可以执行长时间的计算,并且可以很容易地调整以更改底层机器的操作。
软件思想的 “照见” 早在电子计算时代之前就已经出现了。
译者补充:“照见” 是佛学用语,对佛学感兴趣可以参见博客:《大航海时代的海贼王》的缘起性空。
在 18 世纪初,法国纺织工人试验了可以用自动织机的机器来编织复杂图案。
这些机器中最著名的一台是提花织机,由一长串的打孔卡片控制;卡片上的一个孔让钩子穿过,提起了一根线,这根线成为了织物的一条线的一部分。
提花织机使纺织业发生了革命性的变化。
提花织机的卡片是一种外部的,可变的软件,能控制织机的操作。
译者补充:
译者补充:
提花织机能从一个长长的打孔卡上读取信息,织出特定式样的花纹。打孔卡上的孔可以让钩子穿过去,钩子控制织线。织机是同一个织机,打孔卡可以随便更换,换张卡就是不一样花纹。
打孔卡,可以说是机械化自动机器的软件。打孔卡这个技术思想在此后有广泛的应用,IBM 公司最早就是靠这东西起家的……
借用威尔逊在《生命视角》中的一个说法,这是 “严格的灵活性” :操作步骤是严格固定的,但可以接受灵活的输入,产生不同的输出。
对于计算机和 C 指针的来源及提花织机的工作原理,记录在博客: 《指针》
打孔卡技术,距离可编程计算,还有根本性的一步,这一步被一个叫 “分析机” 的机器实现了。
用打孔卡控制机器的想法吸引了 赫尔曼,他设计了一台机器,将1890年美国人口普查的数据制成表格。
他将每个人的数据记录为一张卡片上打孔的图案,分别为表示性别、地址和种族等特征。
The tabulating machine selected out cards meeting given characteristics and tallied statistics for the selected group of citizens.
有了这个机器,人口普查局在一年内完成了对 6,300 万份记录的分析,比以往任何一次普查都要快得多,而且成本少得多。
在随后的几年里,同样的技术被应用于各种数据处理任务:跟踪数万名士兵的健康状况、农业普查、铁路货运单等。
在看制表机发展方向之前,我们想回顾 50 年来 巴贝奇 和 埃达 的重大发展:通用计算机。
译者补充:
埃达,是第一位程序员,大诗人拜伦的女儿。
您可能不知道,第一台可编程的通用计算机,并不是电子的,而是机械的。
因为十八世纪是蒸汽朋克式的美好时代,那时人类还没有发明电力,我们看到的就都是自动的机器。
巴贝奇在他漫长的职业生涯中设计了两台重要的计算机。
他的差分机(约 1820 年)可以自动计算数学表格,如对数表或正弦表。
他的分析机(约 1840 年)是一台通用计算机,能够进行任何可计算的功能。
在巴贝奇的时代,专家们编制了一系列重要函数表,如所有六位数的对数。
这些表通常用于数学计算;例如,通过查找和添加两个数字的对数,就可以将两个数字相乘(大大缩减了计算量,对于天文学家来说,是在提高寿命,因为当时的天文学家每天要进行海量数字的计算)。
这些表虽然是用手工计算的,但使用的差分公式计算表的每一行与前一行的差,用加减代替乘除就可以快速得到答案。
但巴贝奇知道因为人的粗心,这些手工计算的书会包含错误,而这些错误有时会导致严重的后果。
譬如,他认为英国海军使用的导航表中的有误差的数据,导致了沉船事故。
他希望用不会感到疲倦、无聊或分心的机器取代人类,从而消除这些错误。
因此,他设想了一种叫做差分机的机器来计算和打印数字表。
出于好奇,英国政府给了巴贝奇资金来开发差分机。
译者补充:资金是 1.7 万英镑,在当时能造 22 辆蒸汽机车,这笔资金可不小。
在接下来的 20 年里,巴贝奇花了大部分时间试图制造他的机器。
这是一个比他想象的要大得多的挑战:当时的机械加工无法生产误差不超过千分之一的零件,而精度是避免跳跃或卡住所需的。
译者补充:当工程需要很多年后才能实现某个人的想法时,历史学家会说,这个人的想法超越了时代。
19 世纪 30 年代,他提出了一种名为 “分析机” 的新设计,TA 需要的部件少了很多,而且功能更强大--->能够计算任何数学函数。
但在那个时候,政府对他表示不信任,因为之前的差分机并未实现,也因此拒绝支持他的分析机项目。
译者补充:
所有人都觉得巴贝奇是骗子:皇家学会的同事、政府。
其实巴贝奇不仅花光了政府给的 1.7 万英镑,自己还倒贴了 1.3 万英镑;这时忽然有一个人,却相信 TA,并资助巴贝奇,也加入了研究,还从根本性的改进了分析机。
这个人就是埃达,当时著名的大诗人拜伦的女儿,埃达的研究热情成就了计算机。❤️
第一位程序员及第一计算机 的来源,请见博客:《指针》 。
在 1871 年他去世之前,他一直用自己的钱来从事这个项目,但从未完成。
他的远见卓识在接下来的 80 年里销声匿迹。
分析机从打孔卡片中得到指令,这是提花织机的想法。
打孔卡片包含一个程序,该程序指示机器自动计算一个数学函数。
TA 能够根据先前的结果(程序的选择结构)决定要做什么,并重复其程序的部分(程序的循环结构)。
TA 有独立的单元用于机器的不同功能:输入、处理、内存和输出。
译者补充:
这个机器理论上可以进行多种复杂的计算,比如像 1/(e^x-1) 这样的数值都可以。
巴贝奇希望这台机器的输入是一些打了孔的纸卡片,称作变量卡;在机器中间,加入另外一些打了孔了卡片,来规定机器传递变量卡的规则;最后输出卡片上打的孔,就是另外一番景象了。
而这所谓的另外一番景象,就是分析机的计算结果。
整套思路涉及到运算、中间结果的存储、中间结果的再提取,涉及到条件语言、循环指令等细节,简直和现代计算机思想极为接近。
It composed machine instructions from microprograms.
巴贝奇与一位数学造诣极高的天才 埃达 合作,后者为分析机设计了算法。
她的一个示例程序是计算了一个名为伯努利数的有理数序列。
因此,埃达被视为第一位程序员。
更重要的是,埃达认为巴贝奇的机器不仅仅是一个数字计算器;对她来说,分析机是一个可以用符号编码的任何信息的处理器。
她把对这些项目的研究称为 “the science of operations”。
她认为计算机不仅可以计算数字,而且可以计算世界上任何事物的符号,这是现代计算机时代的一个关键原则。
巴贝奇和埃达的想法都是开创性的。
他们的设计,在今天被引入的区分计算思维和其他思维的特征的想法。
分析机除了在多变的外部介质中表示程序外,还体现了现代计算机的许多方面:数据的数字表示、编程、机器可执行算法、用于选择和循环的控制结构、算术逻辑单元以及将机器指令分解为低级的逻辑门操作。
具有讽刺意味的是,计算机时代的一些核心观点诞生于蒸汽时代。
译者补充:
我觉得俩位作者最后一句话(具有讽刺意味的是...),并不是说对此不满,而是表达对 巴贝奇和埃达 的敬意。
因为那个年代的电磁学还没先进到让计算机出现,所以巴贝奇是唯一一个用蒸汽、齿轮、曲轴、弹簧制造通用计算机的人。
虽然没有成功,但 TA 们绝对是 通用计算机 领域上,伟大的先行者。
分析机的神来之笔在于 ta 把操作步骤也写进了打孔卡之中,这样计算步骤就是不固定的了,就是可编程的了。
不但如此,分析机还可以根据中间的计算结果,决定下一步的计算操作 —— 也就是说,允许程序里有 “If… then… ” 这种条件语句,甚至还包括循环语句!
分析机有输入部分、有计算部分、有存储中间计算结果的部分,还有输出打印的部分……分析机,是真正的计算机。
埃达甚至还想到,分析机不仅能用来做数值计算,还能作符号计算 —— 不仅仅是个 “计算” 机,还是个能处理任何信息的机器。
巴贝奇的计算机,逻辑设计无法在那个时代的技术上实现,但是几十年后,电子时代的到来开启了新的可能性。
从 20 世纪 30 年代末开始的这段时期,是制造计算机的很激烈的实验时期之一。
楚泽于 1938 年在德国制造了一台计算机,但德国政府没有认真对待,所以影响甚微。
译者补充:
26 岁的楚泽(1936 年),完全是凭着一股热情,加上良好的数学基础,独自一人在家研制能够计算的机器。
巴贝奇试图用复杂的机械实现复杂的运算,而楚泽是让所有的计算都变成一俩个最基本的运算后,再把所有的运算通过最基本的运算组合而成,就如搭积木,搭一个整体,先搭好各种形状。
俩年后,造出了一台叫 "Z1" 的可编程的计算机,不过 Z1 并不能实现图灵机的全部功能,如不能比较两个数值的大小。
此外,这台计算机是由电机带动庞大的机械装置,因此计算速度很慢,每秒钟只能计算一次。
很快他将机械的计算机改成了继电器的,取名 "Z2",速度达到每秒钟五次计算。
之后又进一步改进,制造出了 "Z3"。
Z3,使用了 2000 个继电器,真正实现了图灵机的功能,这是人类历史上的第一次。
但楚泽并不知道大洋彼岸图灵、香农等人提出来的理论,也没有借鉴 巴贝奇 的做法,完全是凭着高超的动手能力和发明逻辑愣是把计算机搞出来了,其实我觉得 巴贝奇 的路本身就有问题,用复杂的机械实现复杂的运算这对零件的要求很高,但当时的工业水平满足不了,如果 巴贝奇 想到用简单的模块实现基本运算 也许是能造成计算机的。
通过把简单的事物组合起来解决复杂的事情,这个就是 “模块化原则” --- 计算机思维之一。
霍华德·艾肯与 IBM 合作,由美国海军赞助,于 1944 年在哈佛大学建立了马克一号。
这是一台电子计算机,ta 把由牛顿运动定律控制的机械世界和由麦克斯韦电磁学定律控制的光速世界连接在一起,其程序和输入数据存储在打孔纸带上。
译者补充:这里只是提一下,为对比后面的计算机做铺垫,凸显冯·诺依曼架构。
在宾西法尼亚大学摩尔电气工程学院,约翰·莫奇利和普雷斯帕·埃克尔在美国军方的支持下,设计了可能是世界上最著名的第一台电子计算机 (ENIAC)。
埃尼亚克(ENIAC,英文全称 Electronic Numerical Integrator and computer),于 1945 年投入使用,用于计算炮弹轨迹,并探索热核武器的可行性。
译者补充:
1945年,因 电子真空管 技术条件成熟和美国军方资助,世界第一台能用的通用计算机终于被做出来了,这就是书上的 ENIAC 。
ENIAC 是基于图灵机实现的,不过,这不是今天的重点。
ENIAC 是现代计算机的鼻祖,因为奠定了 “冯·诺依曼架构”。
当然,ENIAC 的设计完全基于 图灵机,是用电子来代替纸带的。
冯·诺依曼架构比起之前的计算机多了一个存储的想法:
- 程序像数据一样混合存储到计算机内部存储器中
- 把程序和数据送入计算机处理并输出结果
简单来说,就是指令和数据可以一起放在内存储器里(内存条)。
这样 CPU 可以取数据,也可以取指令,接着一条一条的执行即可完成程序。
因为指令和数据放在一起,因此结构简单、工程实现简单,才应用十分广泛。
如果指令和数据分开放的话,就需要俩个存储器来保存了。
其实在埃尼亚克编程是,即繁琐又无趣的。
埃尼亚克 作为全电子计算机概念的证明非常有影响力:埃尼亚克工作得很快,并在不久之后启发了更好的机器。
译者补充:每秒运算 5000 次。
埃尼亚克 的工程师创建了 Univac,这是第一家提供电子计算机的商业公司。
1945年,约翰·冯·诺依曼(John von neumann)加入 ENIAC 的团队,根据他们的经验设计了一种更好的机器。
ENAIC 除了很难编程之外,ta 的存储也是有限的,ta 使用了成千上万的电子管(1.8万根)逐渐被磨损。
译者补充:
每个电子管相当于一个小灯泡?,耗电量大概是 15 万瓦。
只有一启动,周围居民家的灯都会变暗。
埃尼亚克消耗一度电大概能完成 2.5 万次运算。
到 2018 年,世界上最快的橡树岭超级计算机一秒钟最多能完成 20 亿亿次浮点运算,耗电2.7度,相当于一度电完成了 7.5 亿亿次的运算。
自1946 年以来,计算机 70 多年的发展,从本质上讲就是提高能量利用率的过程。
这 70 多年里有三个里程碑是我们必须知道的:
- 晶体管的诞生,ta 将计算的能耗降低了两个数量级。这是上个世纪 50 年代的事情。
- 集成电路的发明,ta 将计算的能耗又降低了大约两个数量级。这是60年代初的事情。那时消耗一度电量可以完成 1 亿次的运算了。
- 1965年摩尔提出摩尔定律:即集成电路的性能每 12 个月翻一番;1975 年摩尔对摩尔定律有所修正,认为 1980 年起集成电路的性能每两年就会翻一番。
在随后的半个多世纪里,全世界半导体产业还真按照摩尔当年预见的速度在发展。
摩尔和同事预见到了,因此离开了当时著名的 仙童公司,创办了今天的英特尔。
从英特尔在 1971 年推出第一款处理器 4004 到 2005 年 --- 摩尔定律 40 周年之际,集成电路的性能还真提高了 1000 万倍,完全符合摩尔定律的要求。
在 2005 年之后的十多年里,虽然集成电路的进步速度有所放缓,但是基本上还能做到每两年翻一番,这样累积下来又提高了百倍。这样翻番进步叠加的结果是惊人的,以至于我们今天最差劲的智能手机,性能都比当年控制阿波罗登月的巨型计算机系统强很多。
今天的计算机不是万能的,因为被三条线给限死了,这三条线分别是:
- 图灵的可计算性理论,也就是图灵机的理论,
- 冯·诺依曼的计算机系统结构,
- 还有就是半导体的物理极限。
对于他们的新设计,该团队将机器分为三个主要子系统:
- 用于执行算术和逻辑操作的中央处理器(CPU),
- 用于存储的内存,
- 以及用于与外部世界通信的输入输出(I/O)单元。
为了提高计算机的速度,他们设计了一个 CPU,ta 从内存中获取指令,而不是外部的打孔卡,从而启动了 “stored program computer” 的办法。
由于历史的奇特之处,这种组织机器的方式被称为 “冯·诺依曼架构”,而冯·诺依曼说这完全不是 TA 的功劳,TA 只是记录下他们的会议并分发了会议记录而已。
冯·诺依曼声称只是记笔记,而不是设计师。
译者补充:冯·诺依曼说这个设计是一帮人讨论的结果,他只不过负责做笔记而已......
冯·诺依曼架构成为一个共识,从那时到现在,几乎所有的商业电脑都使用这个架构。
The notion that a CPU traces out an instruction sequence among instructions stored in memory has become a central tenet of computational thinking.
译者补充:
相对于巴贝奇的设计,冯·诺依曼架构的关键改进在于有了 “内存” 这个概念。
负责计算的 CPU 速度很快,而从打孔卡读取计算步骤的速度非常慢,因此现在的设计是先一次性地把打孔卡的程序信息读进来,存到内存里,而后在计算过程中让 CPU 直接和内存交换信息,这就能大大加快计算速度。
我们现在研究这些早期机器及其操作系统给我们的生活影响。
译者补充:
每个时代的技术,都会主导这个时代的人的思维。
老一辈的人爱说 “压力很大”、“动力十足”、“把压力化为动力”,这其实是一种暗喻 —— 是把人给当成了蒸汽时代的机车。
而今天的年轻人则善于用计算机做暗喻,会说……“我的大脑死机了”。
现在基于大数据和机器学习的 AI 技术兴起,很多人还爱说一句话,叫“相关就够了”。
计算机思维已经深入到了现代生活的方方面面。
当然,哲学家总是领先于时代;而百姓总是被时代的浪潮左右。
为了便于处理,数据必须表示为机器中的信号或存储结构中的介质。
There is no information without representation.
形式化操作,如加减,必须表示为信号变化的规则。
早期表示 10 进制的方法是一个由 10 个双三极管真空管组成的圆环,ta 模拟一个 10 个位置的轮子。
This scheme was much more expensive than a 4-tube binary representation of the same digit.
由于电路的复杂性,用 10 个不同电压表示十进制数字的提议被驳回。
工程师们很快决定使用二进制代码来表示数字,因为二进制编码的算法,以及因为区分两个电压值的电路比区分两个以上值的电路更可靠。
译者补充:
要在硬件上实现信息的数字化,人们发现应该用二进制。
因为从编码的角度来说,二进制能表示的相信等同于十进制。
十进制很直观,但是要用硬件实现十进制,电子管就得用十个级别的电压代表 0~9 这10个数字,这不但不容易实现,而且很容易出错。
二进制只需要电子管和存储点有 开 和 关 两个状态就行,这就大大增加了可靠性。
Moreover, storage could easily be built from available two-state technology such as acoustic delay lines, magnetic cores, flip-flop circuits, or phosphor patches on a cathode-ray screen.
译者补充:
冯·诺依曼架的内存储器就是现在的内存条。
内存条是一个非常精密的部件,包含了上亿个电子元器件,ta 们很小,达到了纳米级别。
这些元器件,实际上就是电路;电路的电压会变化,要么是 0V,要么是 5V,只有这两种电压。
5V 是通电,用 1 来表示,0V 是断电,用 0 来表示。因此,一个元器件有 2 种状态,0 或者 1。
5V 是计算机逻辑电路的工作电压吧(不确定---我物理没学好),也是可以调成 1V、2V、1.5V 等等但这只会增加电路的复杂性。
通过电路来控制这些元器件的通断电,会得到很多 0、1 的组合。
The decision to abandon decimal arithmetic and use binary codes for everything in the computer led to very simple, much more reliable circuits and storage media.
The tern "bit" came into standard use as shorthand for "binary digit" Today no one can think about contemporary computers with thinking about binary representations.
注意哦,计算机内部不处理二进制以外的数字和符号。
译者补充:要想学习编程,就必须了解二进制,ta 是计算机处理数据的基础。
计算机电路只处理电压、电流、开关和 malleable materials。
The patterns of zeroes and ones are abstractions invented by the designers to describe what their circuits do.
Because not every binary code is a valid description of a circuit, symbol, or number, the designers invented syntax rules that distinguished valid codes from invalid ones.
Although the machine cannot understand what patterns mean, it can distinguish allowable patterns from others by applying the syntax rules.
We cannot overemphasize the importance of physical forms in computers -such as signals in circuits or magnetic patches on disks-for without these physical effects we could not build a computer.
译者补充:存储信息和操作过程中可能会有各种小错误,而这就有一个自动纠错的过程,是一个工程问题。
虽然计算机程序似乎是抽象的,但如果没有机器利用物理现象来表示和处理二进制数,ta们就不能工作。
因此,可以说,每个数据集、每个程序和每个逻辑电路布局都是一种 “战略性的安排”。
译者补充:
科学研究需要找到基本的颗粒。
物理学找到了原子,生物学找到了细胞和基因,信息学找到了比特和晶体管。
探求世界奥秘和改变世界的过程,其实就是搞清楚 ta 们的基本单元和构建 ta 们之间关系的过程。
想巴贝齐的分析机,不就是没找到基本的颗粒吗,为了实现复杂的功能发明的复杂度也随之提高;而想香农的开关网络和图灵的图灵机都是先搞清楚问题的本质,而后用简单的方法 KO ~
由于 香农 的见解,即 布尔 的逻辑精确地描述了电子开关电路,今天我们在思考计算机时,不能不考虑布尔代数。
布尔代数可以帮助我们理解硬件是如何实现编译器生成机器指令的。
但是布尔代数是抽象的。
有时 TA 隐藏了由多个信号沿着不同的路径到达相同输出而引起的物理竞争条件;竞态条件会使电路偏离布尔公式而产生误差。
这让那些只知道抽象而不知道电路的程序员感到困惑,因为这个原因,他们无法通过研究自己的程序来发现错误。
译者补充:
香农的开关网络,简单理解就是,所有的加减乘除运算都可以变成布尔的二进制的逻辑运算。
p.s. 二进制逻辑运算是英国数学家布尔在19世纪发明的。
接下来,那些二进制的逻辑运算,可以通过简单的电路实现。
也就是说,香农将加、减、乘、除运算和简单的电路之间搭起了一座桥梁。
香农 TA 做硕士论文的时候。因此,他的那篇硕士论文后来被誉为了20世纪最重要的硕士论文。
原理即:用简单的东西解决复杂的问题,如果对其感兴趣请见博客:《爬虫导论》的 组成CPU的开关网络 的 第四个问题。
The physical structure of computers consists of registers, which store bit patterns, and logic circuits, which compute functions of the data in the registers.
It takes time for these logic circuits to propagate signals from their input registers to their output registers.
If new inputs are provided before the circuits settle, the outputs are likely to be misinterpreted by subsequent circuits.
工程师通过向计算机添加时钟解决了这个问题。
At each clock tick the output of a logic circuit is stored in its registers.
The interval between ticks is long enough to guarantee that the circuit is completely settled before its output is stored.
如果没有时钟,冯·诺依曼架构的计算机就无法运行。
今天的计算机按其时钟频率进行评级 - 例如,“3.8 GHz处理器” 的时钟频率为每秒 38 亿次。
译者补充:1 GHz = 10 亿次。
时钟的存在,为数字领域的 “算法步骤” 提供了精确的物理解释。
Every algorithmic step must be completed before the next step is attempted.
机器通过保证在下一条指令尝试之前正确完成每条指令来支持这一点。(有几种类型的计算机不使用时钟,但这里不再讨论 ta 们。)
时钟对于支持我们的计算步骤概念,并确保计算机可靠地执行这些步骤是至关重要的。
译者补充:
如果没有 “步” 这个概念,各方面的计算没有协调,可能会导致两组电信号同时出现,系统就会出错,使用 "步" 的概念后也解决了 CPU 时钟的同步。
因此,时钟说是 CPU 的 心脏 也不为过 ~
从巴贝奇和埃达的时代起,程序员就意识到机器必须能够决定下一个指令是什么。
程序并不总是遵循线性序列。
在冯·诺依曼架构中,下一条指令的地址存储在称为程序计数器(PC)的CPU寄存器中,该寄存器在每条指令后更新。
默认设置是按顺序执行下一条指令(PC设置为PC + 1)。
One common deviation from linearity is to branch to another instruction at a different memory location, say X.
The decision to branch is governed by a condition C(such as "is A equal to B?") and the jump from one part of the program to another part is implemented by an instruction that says "if C then set PC to X."
这种控制程序计数器以便程序执行跳转到代码的不同部分,在计算机思维中表现为编程语言中的 if-then-else 结构。
如果我们所有的程序只不过是 if-then-else 选择的指令序列的决策树,那么 TA们永远不会产生比程序中指令数更长的计算。
而循环允许我们设计比程序大小更长的计算。
循环是一系列指令,一遍又一遍地重复,直到满足停止条件。
循环可以使用if-then-else实现,当停止条件为false时,该循环分支回循环的开始。
图灵证明,没有用于检查程序以确定其任何循环是否无限的算法。
这使得调试成为一个无法自动化的具有挑战性的问题。
因此,程序员会花费大量时间寻找程序中的错误。
有些程序是为了永久循环而构建的。
这在 Web 上的服务进程中非常常见。
译者补充:因此抓股票、抓小说,实时更新的爬虫,一般都会挂在 Web 服务器上,请见博客:《定时发邮件》。
The service process waits at a homing position for an incoming request; it then executes code to fulfill the request and returns to its homing position.
While this facilitates designing service processes, it does not remove the challenge of proving that the service process always returns to its homing position.
计算机的内存地址引入了编号,编号是计算机科学中的本质之一,请见博客《32位、64位、128位系统是什么晷 ?》。
简单的说一下就是, x = 3
这个语句,在数学上的意思无非是变量 x 的值是 3,是一个事实陈述。
但是对编程来说,这不是一个陈述,而是一个动作:是把用 x 标记的那一段内存位置,赋值为 3。
这种区别是我们计算机思维的一部分。
Novice programmers who do not make this distinction often draft programs that do not work.
到了 20 世纪 40 年代末,计算机设计者意识到 “模块化原则”,程序员的一个普遍做法是为标准函数编写代码,这些代码可以在程序中的任何地方调用。
译者补充:模块化原则是计算机思维之一,如同搭积木,标准函数就如搭积木中预先搭好各种形状。
例如,专家程序员编写了排序函数的代码,其他人都可以使用ta,调用排序函数。
为了有效地调用这些子程序,设计人员在他们的机器中包含了一种新的分支指令。
指令 “CALLX” 将记住程序计数器(PC)的当前值,而后将 PC 设置为 X,从而将控制权转移到存储在位置 X 的内存中的子程序。
完成后,子程序将执行一条 “RETURN” 指令,恢复所记住的 PC 值,使原始程序能够从调用点恢复操作。
子程序的思想已成为计算思维的一个重要原则。
硬件设计人员为我们提供了高效的实现。
子程序在编程语言中以“子程序”、“函数”和“过程”的形式出现。今天,程序被划分为作为子程序实现的模块是理所当然的。
1936年,艾伦·图灵提出了一种通用计算机的概念-一种能够模拟任何其他计算机的计算机,而这是另一台计算机的程序。
通用计算机本身并不复杂。
这一想法在巴贝奇的分析机的设计中是隐含的:一台可以运行许多程序的基础机器。
基础机器是通用计算机的一个例子。
今天,这被认为是理所当然的:软件设计者假定编译器和操作系统将使他们的软件在一台基本的底层通用计算机上工作。
有时人们将通用计算机的概念与存储的程序计算机等同起来。
其实他们不一样。
巴贝奇的分析机是一种通用计算机,ta 的程序是外部打孔卡片。
ENIAC 是一种通用计算机,ta 的程序是外部接线板。
1945年以后,计算机成为通用计算机,将程序存储在内部存储器中。
The stored program computer makes it possible to switch the interpretation of a set of bits in memory between data and instruction.
计算机内存中的相同模式可以是表示事物的位(数据),也可以是执行任务的位(指令)。
例如,编译器生成机器码作为输出数据;CPU可以立即将这些数据解释为可执行指令。
一些早期的机器允许程序修改自己的代码以达到更高的效率。
但是大多数操作系统通过使机器代码只读来禁止这样做:这允许共享,但不允许更改代码。
自我修改程序的旧观念还远未消亡:今天的恶意软件不断修改自己的代码以逃避反病毒软件的检测。
译者补充:
现在计算机病毒没有以前那么猖獗了,而这的确是因为软件公司更加注重安全了。
软件公司为操作系统和浏览器现在都内置了安全功能。
如 Chrome 浏览器,ta 自己就能判断哪些站点是不安全的。如果有什么来历不明的东西想要安装,浏览器自己就能探测到。如果有一个网站被发现有恶意程序,Chrome 会自动对所有的用户屏蔽这个网站,这种情况下想要传播病毒就很难了。
以前的杀毒软件本质上是黑名单制度,是先知道有哪些病毒,列入黑名单,而后排杀。而现在则具有一定的自动探测能力,凡是说不清楚的操作一律禁止。
像苹果应用商店,是白名单制度,只有被认可安全可靠的应用才能上架。
由此可见,互联网的野蛮时代已经结束了。如果要做一个公共网站,给很多人提供服务,就得让人知道创建人是谁(在中国建站是需要提供照片和身份证的)。
现在我们日常访问使用的都是一些成熟的网站和应用,连盗版和色情内容网站都是几家独大,谁想弄个独立网站传播病毒没啥机会。
不过,计算机病毒并没有消失的迹象,反而说 ta 的传播越来越隐蔽了,隐蔽到安全软件无法量身定制病毒库,因为成本太高。
游戏行业对于 黑帽黑客 而言是一个极具吸引力的目标,这是因为犯罪分子可以轻而易举地交易游戏道具来获利。
这些攻击的一个案例就是犯罪分子以热门游戏为目标,寻找有效账号和特殊皮肤。
玩家账号一旦成功遭到黑客入侵,即被交易或出售。
主要是通过 SQL 注入攻击和游戏撞库,有兴趣可以看一下:《SQL 注入》。
又比如,游戏盗号木马,尤其是国内游戏玩家特别熟悉的特洛伊木马病毒依旧非常流行。
逻辑电路经常因为物理原因引起错误。
例如,如果冲突的信号同时到达,或者时钟太快,无法让某些组件进入新的状态,或者组件随着时间的推移而恶化和失败,那么组件的状态可能是不可预测的。
电路工程师在容错方面花了很多时间。
ta 们通常做得很好,因为硬件足够可靠,用户不必担心硬件中的错误。
In the 1950s design engineers began to think about multiple-access computers that would be shared within a user community.
Multi-user systems had to guarantee that no user could access another's data without explicit permission.
This setup would provide the significant benefit of allowing users to share programs and data and would reduce the cost peruser by spreading costs across many users.
译者补充:支持多用户多任务。
Linux系统做的很好,可以同时支持多个用户,每个用户对自己的文件设备有特殊的权利,能够保证各用户之间互不干扰,当硬件配置非常高时,每个用户还可以同时执行多个任务、多个线程同时工作、提高效率,简直是完美的一塌糊涂。
这是 Linux系统设计哲学:
- 对不同的操作赋予不同的执行等级
- 内核态可访问任意系统资源,用户态程序访问权受限(Linux 操作系统的权限分为用户态和内核态)
Windows 服务器长时间运行而突然宕机,但应该不会听到 Linux 系统服务器因为长时间不关机会卡死,在 Linux 上几乎是不会出现这种情况的。Linux服务器可以无休止的运行下去不宕机,因为 ta 继承了Unix卓越的稳定性和高效性。
Designers of the first operating systems achieved this by isolating each executing program in a private region of memory. defined by a base address and length.
The base-length numbers were placed in a CPU register so that all memory accesses from the CPU were confined to the defined region of memory.
This idea of partitioning memory and setting up the hardware so that it was impossible for a CPU to access outside its private memory was crucial for data protection.
It not only protected user programs from each other; it could be used to protect users from untrusted software, which could be confined into its own memory region.
Users of machines and networks today are aware they are sharing their machines and networks with many others.
They assume that the operating systems and networks are enforcing the isolation principle by keeping the executing programs in private memory regions.
When they download new software they do not trust, they expect their operating system to isolate the new software in a memory region called a "sandbox".
Although it has been in our computational thinking for a long time that operating systems isolate programs, many computer chips designed in the 1980s dropped out the memory bound checks in order to achieve greater speed.
Many security specialists are now regretting this omission.
New generations of hardware may once again enforce the security checks that computational thinking experience leads users to believe are present.
One of the popular modern definitions of computational thinking is "formulating problems so that their solutions can be expressed as computational steps carried out by a machine."
This definition is closely tied to the framework of the von Neumann architecture,
In effect, the definition is a generalization of the operation of the CPU in a von Neumann machine.
After half a century, the von Neumann architecture has been approaching its limits.
There are two main reasons.
One is that the underlying chip technology, which has been doubling its component count every two years according to Moore's law, can no longer absorb the continuous reductions in component size.
Soon components will be so small they cannot comprise enough atoms to allow them to function properly.
The impending end of Moore's law has motivated extensive research into alternative architectures.
The other reason is that the separation of processor and memory in von Neumann architecture creates massive data traffic between processor and memory.
One technology invented to lessen the processor-memory bottleneck is the cache, which retains data in the CPU rather than returning it to memory.
Another technology intersperses processor and memory in a cellular array to spread the data load among many smaller processor-memory channels.
A third technology is special purpose chips---ones that do a particular job exceptionally well but are not general-purpose computers themselves.
An example is the graphics processing units(GPUs) now permeating every computer with a graphics display.
Special purpose processors are themselves the subject of extensive research.
Two new categories of computer architecture have been getting special attention.
Both are potential disruptors of today's computational thinking.
One is the neural network, which has been the powerhouse behind recent advances in artificial intelligence.
A neural network maps large bit patterns (for example, the bits of a photograph) into other bit patterns(for example, labeled faces in the photograph).
The input signals travel through multiple layers where they are combined according to assigned weights.
An external algorithm trains the network by presenting it with a large number of input-output pairs and assigning the internal weights so that the network properly maps each input to its corresponding output.
Training a network is computationally intensive, taking anywhere from many hours to several days.
译者补充:
脑是由神经元组成的。
我们大脑里有数百亿个神经元,大脑计算不是基于明确规则的计算,而是基于神经元的计算。
人的识别能力,就是来自于许许多多的神经元的计算。
人工智能的神经网络也是如此。
从左到右分为三层:
- 粉色层即 输入的数据,蓝色和绿色的每一个圆点代表一个神经元。
- 蓝色层叫 “隐藏层”。
- 绿色层是 “输出层”。
数据输入进来,经过隐藏层各个神经元(即蓝色层)的一番处理,再把信号传递给输出层,输出层神经元再处理一番,最后作出判断。
举个例子,判断是狗还是猫:
不过,这只是最基本的神经网络,刚刚说了,我们大脑里有数百亿个神经元,我们的能力来自神经元的计算。
如果想让机器有有人一样的识别能力或超越人的识别能力,就得调用大量的神经元。
左边是简单神经网络,右边是深度学习神经网络。
深度学习:“深度” 的字面意思就是层次比较“深” ,即中间有不止一层隐藏层神经元的神经网络计算。
可以看出深度学习神经网络的神经元排列是 “分层” 的,分层可以让我们用简单的东西解决复杂的问题,具体请看博客:《爬虫导论》的 组成CPU的开关网络 的 第四个问题。
2019 年 3 月 26 日,美国计算机协会(ACM)公布了去年(2018年)图灵奖评选的结果,对深度学习做出开创性贡献的三名美国和加拿大科学家本杰欧(Yoshua Bengio)、辛顿(Geoffrey Hinton)和莱昆(Yann LeCun)荣获该奖。
因为本杰欧、辛顿和莱昆三个人完善了这种机器学习的方法,特别是通过实现深度的神经网络,奠定了今天深度机器学习的基础,并通过实验验证了 TA 们在工程上的应用前景。
这几年人类在计算机视觉(比如人脸识别)、语音识别、自然语言处理(包括机器翻译)和机器人等领域取得突破性进步,都和他们的工作相关。
他们通过将概率模型和其 ta 机器学习的算法引入人工神经网络,改进了这项历史悠久的机器学习技术,并且拓宽了 TA 的应用范围。
随着当时云计算的兴起,他们有可能实现非常大规模,也就是网络层次非常深的人工神经网络。
由于过去人工神经网络在美国政府科研机构的名声不太好,这次他们换了一个说法,叫做深度学习。
那么为什么他们从事大家都看不上的研究,却能如此成功呢 ?
人工神经网络的历史甚至可以追溯到计算机诞生之前。
而人类第一次设计出计算机能够运行的简单的神经网络算法,是在上个世纪50年代的事情。
1956 年,罗切斯特等人在 IBM 704 计算机上实现了神经网络,他也是当年 10 个提出人工智能概念的科学家之一。
但是早期的人工神经网络虽然给予人们很多遐想的空间,却解决不了什么实际问题,以至于从60年代后期到70年代初期,这项研究就被美国政府的经费管理部门打入了冷宫,因为花掉了很多钱没有成果。
到了 80 年代,由于摩尔定律使得计算机成本大幅度下降,英特尔等公司的微处理器性能的提升使得廉价的分布式并行处理成为可能,人工神经网络经过改进后又流行起来,当时计算机科学家们在教科书里甚至发明了一个新词——联结主义,来形容这种改进后的模型。
当然,科学家们第二次拿到了美国政府的资助。
不过,由于人工神经网络的一些根本性问题没有解决,对于复杂的人工智能问题依然束手无策,随后不多久这个领域的研究又“凉”了下来,政府的科研基金管理部门也认定这是旧酒装新瓶骗取科研经费。
在上个世纪 90 年代到本世纪初的十年,是全世界人工智能的低谷,那个时期人工智能的博士生在找工作时都不好意思讲自己研究的课题是人工智能,因为没有人要。
在学术界,据今天微软杰出的研究员,著名的深度学习专家邓力博士讲,当时他参加人工神经网络的国际会议,听众比作报告的人还少。
本杰欧、辛顿和莱昆三人就在这样的背景一直坚持研究,发现世界上很多看似人工智能的问题都可以变为分类问题,比如各种图像识别、语音识别、博弈、计算机辅助决策、计算机翻译等等,因此人工神经网络这种工具近年来越来越普及,利用TA们解决了很多过去的难题。
虽然今天在计算机科学领域,大家已经不再质疑人工神经网络的作用,但是 AI 里面依然有很多问题大家没有搞清楚。
- 如 Google 负责深度学习的 杰夫·迪恩 就说,为什么当这种神经网络的深度加深后,机器学习的效果就好 ?
- 如 在这种深度学习的模式中,就算是这程序的设计者,也不知道到底这个程序是如何产生最终结论的,只知道数据放进去就会得到结论。
无人能解释得清楚。
这是一个最基本的问题,但是至今没有答案,因此在机器学习领域,人类还有很长的路要走。
A trained networks is very fast, giving its output almost instantly after the input is presented.
Graphics-processing chips have been successful in achieving fast response of a trained neural network.
Although machines capable of only pattern matching and recognition are not general-purpose(universal) computers, they are have produced amazing advances in automating some human cognitive tasks, such as recognizing faces.
However, there is no mechanism for verifying that a neural network will give the proper output when presented with an input not in its training set.
It is very jarring to our computational thinking to be unable to "explain" how a computational network generated its conclusion.
The other computer architecture getting special attention uses quantum mechanical effects to process data.
These quantum machines represent bits with electron spins and connections with quantum effects such as entanglement.
Quantum computers can perform some computations much faster than von Neumann computers.
译者补充:量子计算机的具体内容,可以到博客:《密码学》的量子加密。
One such computation is factoring a large composite number into its two constituent primes.
The intractability of factoring on von Neumann architectures has been the principle behind the security of the RSA crypto system, which is currently the most secure crypto system in wide use.
Quantum computers threaten to break its security.
Because their operation is nothing at all like that of the von Neumann computers, most people trained in computer science rather than physics find it very difficult to understand the operation of these machines or how to program them.
These two examples illustrate how each kind of machine has an associated style of computational thinking and is quite good at particular kinds of problems.
A person with advanced knowledge in computational thinking would be familiar with these architectures and, as part of the design process, would select the best architecture for solving the problem.
At the same time, particular machine types can also induce a kind of "blindness" --- for example, designers schooled in the basic von Neumann architecture think in terms of instructions and have trouble understanding how a quantum computer works.
Until the 1940s, computing was seen largely as an intellectual task of humans and a branch of mathematics and logic.
The invention of the very concept of computing, and it created a fresh world of computational concepts that had few counterparts or precursors.
The concepts, practices, and skills for designing programs and computers quickly diverged from mathematics and logic.
It was a profound change.
And until the 1940s, computational thinking was embedded in the tacit knowledge and state-of-the-artpractices of many different fields, including mathematics, logic, engineering, and natural sciences.
After the 1940s, computational thinking started to become the centerpiece of the new profession that designed information machines to do jobs humans never thought were possible.
译者补充:
- 计算机的发明过程:请参见博客 《指针》。
- 计算机运行原理篇:请参见博客《三日连珠》。
计算机的优化方向,大概是以 传递的信息量更多 和 能耗更低 的方面发展。
- 打算盘进行一次计算可能只需要一粒芝麻的能量,
- 摆弄帕斯卡和莱布尼茨的计算机就需要一颗绿豆的能量了,
- 而巴贝奇的计算机需要一粒花生米的能量,
- 楚泽的可能要一个橙子的能量,
- 埃尼亚克大概是一个西瓜的能量。
在埃尼亚克之前的计算机,都是无法实现大量的数据计算的。
如果能用电子设备取代继电器,那么计算的速度可以大幅度提升,这就是美国研制电子计算机的初衷。
电子计算机快的原因:
楚泽的计算机是建立在继电器上的,而机械运动有惯性,齿轮不可能正着转完了马上反着转。
继电器虽然也有惯性,但是接触和断开的时间间隔可以非常短。如果我们把机械计算机看成是纽卡门蒸汽机,每次工作一下都要等气缸冷却,那么继电器的计算机就如同瓦特改进后的蒸汽机,不再需要冷却这个过程,可以连续工作。
但是继电器开关的频率毕竟有限,如果能用电子设备取代继电器,速度就再次提高了。
物理黑客必备:《开锁大全》。