声明:本篇文章是根据bilibili上的一个计算机基础的英文小视频,jean的一层层抽象的方式来讲计算机原理。
机械继电器,继电器就是用电控制的机械机关,继电器里面有根'控制线路',控制电路是开还是关,'控制线路'连接一个线圈,当电流经过线圈,线圈产生磁场,磁场吸引金属臂,从而闭合电路。可以把继电器比喻成水龙头,继电器控制的是电子。继电器可以连接到其他电路,比如马达,马达让计数齿轮+1,就完成了计数计算。1940年的时候一个好的继电器可以1秒钟内翻转50次。机械继电器太慢容易磨损出现故障---就出现了电子管。二级电子管中一个级就是灯丝,它是负责发射电子的,第二个级通上正电就可以接受电子。三级电子管是有第三个控制级,向控制级施加正电荷,就是允许电子流动,施加负电荷就是阻止电子流动。所以也是通过控制线路来实现断开或者闭合电路,就和继电器实现的功能一样了。但是电子管每秒钟可以开关数千次。所以三级电子管,也叫三级真空管成了无线电、长途电话等电子设备的基础,并且持续了近半个世纪。
三级电子管时代的计算机是计算机从机械时代走向电子时代,此时就出现了可编程的计算机,其编程的方法是把几百根电线插入插板,有点像老电话交换机,是为了让计算机执行正确操作。虽然'可编程'但还是要配置它。世界上第一个真正的通用可编程计算机每秒可执行5000次十位数加减法,但经常工作半小时电子真空管就出现故障,于是晶体三极管出现了。
晶体三极管也有两个电极,电极之间有一种材料隔开它们,这种材料有时候导电有时候不导电,这就是半导体,控制线连接到一个'门'电极,通过改变'门'的电荷,我们可以控制半导体材料的导电性,来允许或者不允许电流流动。就实现了继电器一样的功能。晶体管是固态的,并且体型可以远远小于继电器和真空管。这就诞生了更小更便宜的计算机。第一个消费者也可以买得起的计算机是有3000个晶体管每秒可以执行4500次加法。
如今,计算机里的晶体管小于50纳米,而一张纸的厚度是10万纳米。所以晶体管不仅小还超级快,每秒可以切换上百万次,并且不易磨损能工作几十年。
而晶体管的主要材料就是半导体硅,硅谷的英特尔就是现在著名的计算机芯片制造商。
计算机从继电器到真空管到晶体管,我们是让电路开闭得非常非常快。那么电路开闭和计算有什么关系?我们没有马达和齿轮呀?答案是布尔逻辑和逻辑门。
在计算机的继电器时代,我们是用齿轮数来代表数字的,齿轮用10个齿,就是十进制。到了计算机的电子管时代,我们就只是用开/关两种状态代表信息,这叫二进制,就是用两种状态表示,只要true or false即可,电路闭合电流流过代表真,电路断开无电流就代表假,二进制就将真假写成10。晶体管虽然可以不只是开关,还可以让不同大小的电流通过,所以曾经也出现过三进制五进制甚至十进制,但是进制越高就代表状态越多,就越难区分信号。如果手机快没电了或者附近有电噪音,或者附近有人用微波炉,信号就有可能混在一起,加上每秒百万次变化的晶体管让问题变得更糟糕,所以我们需要尽可能地把每种信号分开,此时如果只用开关两种信号就不存在上述问题了。
此外,数学里面还专门有一门学科就叫布尔代数,这门数学就是专门处理真假问题的,它可以解决很多法则和运算。我们学的数学里面的代数,变量的值是数字,可以进行加减乘除等操作,但在布尔代数种,变量的值是true 和false,能进行逻辑操作。布尔代数中有三个基本操作:NOT, AND 和OR。还有1个高级操作叫异或XOR。
not操作就是把布尔值反转,把true进行not就变成false,反之亦然。晶体管是控制电流的开关,有3根线:2根电极和1根控制线。当控制线通电时,电流就可以从一个电极流到另一个电极,我们把控制线当作输入input,底部的输出电极当作输出output。所以,1个晶体管,有一个输入和一个输出。如果我们打开输入input on, 输出也会被打开output on,因为电流可以流过,如果我们关闭输入input off ,输出也会关闭output off, 因为电流无法通过。用布尔代数的术语来说就是输入为真输出为真,输入为假输出为假,我们把这个做成'真值表'。当我们将上面的电路稍作修改就可以实现NOT:我们还把控制线作为input,但在流入电极也就是正电级上再接入一个线,并把这条线作为output, 当input为on时,电流从负电极流出了,output就是off, 当input为off时,电流就从正电级接的那个线output线流出了,此时output线就是on,这样就实现了input on output off , input off output on。这就是一个最简单的非门电路。NOT门,之所以叫门是因为它能控制电流的路径。
AND操作有2个输入1个输出。2个输入都是true,输出才是true。就是:true+true=true, true+false=false,false+true=false, false+false=false。and门需要2个晶体管串联在一起,因为要两个输入,两个晶体管的控制线作为input1和input2,只有input1和input2都通电,output才有电。这样就实现了与门。
OR操作也是有2个输入1个输出。只要2个输入里有一个是true,输出就是true。就是:true+true=true, true+false=true, false+true=true, false+false=false。or门需要2个晶体管并联在一起。其中两个输入input1和input2分别是两个晶体管的控制线,output是电路输出线,就是负电极线。这样就实现只要有一个input是true,输出就是true。就是一个或门电路。
小结:至此三个基本电路:非门,与门、或门我们都知道了。
非门的画法是一个三角形加一个圆圈。与门是一个大D。或门是一个小鱼的样子。
通过非门与门或门我们就可以搭建更大的组件,比如异或门XOR, 异或门是:true+true=false, true+false=true, false+true=true, false+false=false。XOR门我们可以先放一个or门再加一个and门,并且在and门上再加一个not门,然后把两个输出串联到一个and门上,就变成了XOR门了。XOR门的画法是一个小鱼加个笑脸。
当我们把上面的这些门都包装起来,我们根本不需要知道每个门都具体用了几个门?这几个门又是用几个晶体管怎么拼接起来的?电子是怎么流过半导体的?芯片设计师在设计处理器时,很少在晶体管的层面上思考,而是在更大的组件比如逻辑门,或者是由逻辑门组成的更大组件的基础上思考的。而程序员也更是不用考虑逻辑是怎样在物理层面实现的。
从电信号到表示数据用的true and false, 下面就开始"计算"了。
我们仅仅用上面讲的这些逻辑门就可以判断复杂的语句了,比如:if A and B or C and D, 那么E=true。
前面说的是我们用晶体管做逻辑门,通过逻辑门我们可以判断布尔语句。
#计算机如何存储和表示数字?
布尔代数只有两个值:true 和 false。我们规定一个二进制值可以代表1个数。我们可以把真和假当作1和0。如果我们想表示更多的数,加位数就好了呀,和十进制一模一样。二进制的加法和十进制的加法也是一样,按位置加,满2进1。
二进制中一个1或者一个0就叫一位bit, 8位为一个字节tyte,8位可以表示的最小的数是0,最大的数是255。我们经常说8位机,8位图像,8位音乐,意思就是计算机里面的大部分操作都是8位8位这样处理的。但是8位只有256个值,也就意味着8位图像只有256种颜色。如果有10个字节tyte,就意味着有80位。千字节kb,兆字节mb,千兆字节gb。所以MB是百万字节,GB是十亿字节。而TB是一万亿字节,也就是8万亿个0和1。
我们经常说的32位或者64位计算机,意思就是一块块处理数据,每块是32位或者是64位,32位能表示的最大数是43亿左右,也就是32个1能表示为4,294,967,295。所以现在我们的照片是非常清晰的,因为我们现在都用至少32位颜色,它有上百万种颜色,所以色彩非常丰富。
正负数的表示:一般情况下大部分的计算机都用第一位表示正负,1表示负,0表示正,用剩下的31位表示数字。能表示的数字是正负20亿左右。但有时这个数字还是不够用的,比如全球有70亿人口,银行存款有万万亿,所以此时64位计算机就出场了。
此外,每个数字除了数值大小,正负号,还必须有一个内存地址作为它的标记,这个标记是为了方便存取数据。
计算机如何处理非整数?就是小数点可以在数字间浮动,有好多种方法表示浮点数,最常见的就是IEEE754标准。
计算机如何处理字符?计算机用数字表示字母,最直接的方法就是给字母编号,ASCII编码。ASCII码再演变到Unicode。
计算机如何处理图像、声音、视频数据?用格式,比如mp3,GIF, 像ASCII码用二进制来表示字母一样,用二进制编码声音/颜色,表示照片、电影、音乐。
这些标准归根到底都是一长串位。短信、视频、网页,甚至操作系统,都不过是一长串1和0。而这些标准和编码让不同公司制作的计算机能够互相交换数据。
#计算机如何计算和处理数字?
数字的加减乘除由计算机的'算术逻辑单元'处理,arithmetic & logic unit,简称ALU。 ALU是计算机的数学大脑,是理解现代计算机的基石。ALU就是计算机里负责运算的组件,基本其他所有部件都用到了它。其中最著名的ALU就是intel 74181 , 1970年它发布时,是第一个封装在单个芯片内的完整ALU。74181用了大概70个逻辑门,但也只是一个4位ALU, 不能执行乘除,但它向小型化买进了一大步,让计算机更强大更便宜。一个8位的ALU会需要数百个逻辑门。8位的ALU有两个输入,A和B,都是8位bits, 形状用一个大V表示。
现在我们用前面的逻辑门制作一个简单的ALU电路,功能和74181一样。再后面我们就用这个ALU从头做出一台电脑。
ALU有2个单元,1个算术单元和1个逻辑单元。
算术单元,它负责计算机里所有的数字操作,比如加减法,比如给某个数字+1,这叫增量运算。
如果我们想把两个数字相加,我们就会用到and, or , not, xor逻辑门。按位加,每个位上有四种情况:1+1, 1+0, 0+1, 0+0,如果用异或门电路1+1=0,1+0=1,0+1=1,0+0=0,符合二进制的加法逻辑,所以我们就把xor用作1位的加法器adder, 但是只要一个异或门是不够的,因为1+1=10是要进位的,所以我们额外一根线代表进位。只有输入是1和1时才需输出是true,也就是进位。所以我们在异或门电路里面再并联一个and门,这个and门叫'半加器'。当我们把xor门和and门封装在一起,就是两个输入,两个输出。只有当两个输入是1和1时,就输出总和0和进位1。
如果我们要处理超过1+1的运算,就要'全加器'。当'半加器'输出了进位,就意味着我们计算下一列的时候,都得加3个数在一起而非2个数。所以'加全器'有三个输入,就是8种情况,就是8种输入。我们先用'半加器'将第一输入和第二输入相加,然后再把第三输入和前两个输出一起送到第二个'半加器',再连接一个or门检查进位是不是true,就成功计算出1+1+1的结果了。这就是'全加器'了。我们把全加器封装,就会实现三个0或1的输入,输出是三个输入的总和和进位。
如果我们我们想相加2个8位数字A和B呢?先用一个半加器把A0和B0相加输出sum0, 再并联一个全加器,输入全加器的是A0B0的进位和A1B1,输出sum1,再并联一个全加器,输入是A1B1的进位和A2B2,输出sum2,......如此并且7个全加器,就可以计算2个8位数字的加法了。这个就叫'8位行波进位加法器'。注意如果第9位有进位,就代表这2个8位数字太大,相加超过了8位,这就出现了溢出overflow,也就是计算出现了错误,少了一位。如果要避免溢出,我们就需要并联更多的加全器,比如多到可以操作32位数字、64位数字等,就不容易出现溢出了。但代价是需要更多的门电路,计算次数要增加,计算时间也要增加,但是我们现在计算机的运算都是每秒几十亿次的量级,并且现代计算机用的加法电路和上面我们模拟的电路还有点不同,是把上面的电路给优化了,叫'超前进位加法器',它更快,也是把二进制数相加。
ALU的算术单元除了做加法,还可以减法,乘法除法,比如乘法就用多次加法来实现,比如12*5就用4次相加完成。简单的加法器就是这么做的,比如恒温器、电视遥控器、微波炉。这样慢是慢但是可以算出来,而我们现在用的笔记本和手机用的就是更好的处理器,有专门做乘法的算术单元。乘法电路比加法电路复杂的多,有更多的逻辑门。这就是算术单元。
逻辑单元:logic unit, 逻辑单元执行逻辑操作,也是把上面学的那些门各种花式排列组合来执行逻辑操作,比如执行最简单的数值测试,比如测试一个数字是不是负数,比如检查ALU输出是否为0的电路,就是用7个或门组成。通过这个门的数据只有全部为0才输出为0,否则为1。
除此之外,我们还需要告诉ALU去执行什么操作,是执行加法还是减法?所以我们还需用4位的操作代码operation code(4 bits),比如1000表示add, 1100表示subtract, 操作代码告诉ALU执行什么操作。我们现在做的ALU是8位的,就是输入inputA和inputB都是8位,输出output也是8位。但是ALU还要输出一堆标志flag,这些flag是一位的,代表特定状态。
比如相减两个数字,结果为0,我们的零测试电路会将零标志zero flag设为True,也就是1,如果想知道两个数字是否相等,这样就可以知道了。如果想知道A是否小于B,可以用ALU来算A-B,看负标志是否为True,如果是true就是A小于B,这就是negtive flag
。此外,我们还有一条线连到加法器的进位,如果有溢出overflow flag,我们就知道要进位,这就是溢出标志。
高级的ALU有更多的标志,但是zero flag, negtive flag, overflow flag是最基本的标志。
至此,我们就知道现代计算机是如何在没有齿轮和杠杆的情况下进行运算了。
#用ALU做CPU
上面我们用ALU算出来结果如果扔掉就没什么意义了,我们的找个方式存储起来。这就要用到计算机内存了。
我们计算中的数据丢失是因为我们的计算结果都放在'随机存取存储器'ram, random access memory,这种存储器只能在有电的情况下存储东西,比如游戏状态。另一种存储memory叫持久存储,电源关闭时数据也不会丢失,它是用来存储结果变量、程序、代码等数据。
现在我们来做一个只能存储1位数据的电路,然后再扩大,进而做出我们的内存模块。然后再和ALU结合起来就做出了cpu!
#寄存器和内存
比如,我们现在有一个或门or电路,inputA,input B,output, 如果我们把output的线路上连一条电线到inputB上,就是or电路的输出又瞬间送到了inputB了。这个电路,不管我们输入的inputA是0还是1,它的输出都是1了,所以不管是input A通电还是不通电,它都永久输出了一个1,也就是永久存了一个1。
同理,如果我们现在又一个与门and门电路,也是上面的操作,这个电路始终都输出0。
现在我们就有了一个能存0和1的电路,我们把这两个电路连接起来就是'and-or latch'也叫'and-or 锁存器'。这个锁存器有两个输入:set input and reset input,即'设置'输入和'复位'输入,设置输入把输出变成1,复位输入把输出变为0,如果设置和复位都是0,电路就会输出最后放入的内容。也就是说它存住了一位的信息。这叫'锁存',因为它锁定了一个值。
放入数据的动作叫'写入', 拿出数据的动作叫'读取'。
寄存器的输入有:数据输入data in, 允许写入线write enable,
寄存器的输出有:数据输出data out
当写允许线=0表示写操作关闭,此时数据输入线不管是输入0还是1,数据输出都是0不会改变,所以内容不会变化。
当写允许线=1,表示可以写操作,此时数据输入线输入1就输出1。现在如果关闭写允许线,输出会保持1,就是此时不管数据输入线是输入1还是0,输出都是1。这样就把1这个值保持起来了。
这样就是保持了1位bit的数据。如果我们并排放8个锁存器,就可以保持8位信息。比如一个8bit数字。现在的电脑一般都是64位宽的寄存器。我们用一根线连接所有写允许线,把它设为1,然后用64条数据线发数据,然后将写允许线设回0,这样64位的值就存起来了,用64根线连接到输出端,就是可以输入之前存入的数据了。所以64位宽的寄存器要129条线,256位宽要513条线。这样的电路线路太多,所以比如256位宽的寄存器,我们就将这256个寄存器拍成16*16的矩阵形状,要启用某个寄存器,就打开相应的行线和列线,此时我们在行线和列线上再加一个and门,也就是只有行列线都输入为1时,and门输出才是1,这个1就传入寄存器的写允许线。这样我们就可以只用一根数据线连接所有锁存器来传递数据了。
我们可以用类似的技巧来做'允许读取线'来读取数据,即从一个特定的存锁器读取数据。这就是256位的存储。这样256位的存储器就只需要1条数据线,1条'写允许线',1条'允许读取线',还有16行16列的线用于选择锁存器。16+16+1+1+1=35条线即可。
比如我们存了一个数据的地址是'12行8列',由于我们最多就是16个行列,所以用4位就够了,12的二进制是1100,8的二进制是1000,所以12行8列就是11001000。我们要将这个地址值转化为行和列,就要用到'多路复用器',multiplexer, 一个多路复用器处理行,另一个多路复用器处理列。
太复杂了,我们就把它当成一个256位的存储器吧。这存储器的第一个输入是一个8位的地址线,4位代表行4位代表列。第二个输入是'允许写入线'。第三个输入是'允许读取线'。第四个输入是数据线,用于读/写数据。
然后我们将上面的256位存储器复制多个并排放到一起,就是寄存器组了。我们把寄存器组也看成一个整体,就是一个可寻址内存。这个内存有256个地址,每个地址能读或写一个8位值。
内存的一个重要特性是:可以随时访问任何位置,所以叫'随机存取存储器',简称ram,ram就像人类的短期记忆,记录当前在做什么。
一条真的内存条,上面焊接了8个内存模块,其中一个内存模块放大可以看到有32个内存方块,放大其中一个方块可以看到有4个小块,放大一个小块可以看到存一个'位'的矩阵,这个矩阵是128位*64位,共8192位,8192*4=32768*32,就是一个芯片大约存100万位,ram有8个芯片,所以总共有800万位。
现在我们用锁存器做一块SRAM静态随机存取存储器。还有其他类型的ram,比如dram, 闪存Flash memory和NVRAM,它们在功能上和SRAM相似,但是是用不同的电路存单个位,比如用不同的逻辑门,电容器,电荷捕获或忆阻器。但根本上,这些技术都是矩阵层层嵌套来存储大量信息。
#CPU
我们已经做了一个算术逻辑单元ALU,输入二进制,它回执行计算。
我们还做了2种内存:寄存器--很小的一块内存,能存一个值,之后我们增大存储容量,做出了RAM。ram是一大块内存,能在不同地址存大量数字。
现在我们把上面的两个东西组装在一起就构成了计算机的心脏了。计算机的心脏就是'中央处理单元',简称cpu。
cpu负责执行程序,程序由一个个操作组成,操作又叫'指令'instruction, 指令是指示计算机要做什么的。如果是数学指令,比如加减指令,cpu会让ALU进行数学运算。如果是内存指令,cpu会和内存通信,然后读/写值。
cpu组建:首先,要一些内存,上面我们做的ram即可。假设ram只有16个位置,每个位置存8位。
其次,再来四个8位寄存器,叫ABCD,寄存器用来临时存数据和操作数据。
数据是以二进制值存在内存里,程序也是存在内存里。我们给cpu支持的所有指令分配一个ID。比如,我们用前4位存'操作代码'operation code, 简称操作码opcode, 后4位代表数据来自哪里,可以是寄存器或内存地址。
再次,我们还需要2个寄存器,一个用于追踪程序运行到哪里了,我们叫它'指令地址寄存器', 就是存当前指令的内存地址。另一个寄存器存当前指令,叫'指令寄存器'。这样我们就完成
当启动计算机时,所有寄存器从0开始。此处的例子,假如我们在ram里放了一个程序,cpu的第一个阶段叫'取指令阶段',负责拿到指令,首先将'指令地址寄存器'连接到ram,寄存器的值初始化为0,因此ram返回地址0的值。假如ram地址0上的值为0010 1110,这个值就会复制到'指令寄存器'里,现在指令就拿到了,现在开始要弄清是什么指令才能执行execute,而不是杀死kill它,这就是'解码阶段'decode phase. 前4位0010是load A指令。意思就是把ram的值放入寄存器A。后4位1110是ram的地址,转成十进制是14。
说明我们要首先有一个指令表instruction table, 这个表列出指令是load A , 描述是read ram location into register A,四位操作码是0010, 地址或寄存器是4-bit ram address....等等指令列表。
接下来由'控制单元'进行解码,'控制单元'也是由逻辑门构成。为了识别load A指令,我们需要一个电路,检查操作码是不是0010。现在知道了,我们就可以执行了,开始'执行阶段',用'检查是否load A指令的电路'可以打开ram的'允许读取线',把地址14传过去,ram拿到值0000 0011,十进制的3。因为load A指令只是想把这个值放到寄存器A,其他寄存器不受影响,所以需要一根线,把ram连到4个寄存器,用'检查是否load A指令的电路'启用寄存器A的'允许写入线',这样就成功了。成功把ram地址14的值放到了寄存器A。指令完成,我们就关掉所有线路。去拿下一条指令,我们把'指令地址寄存器'+1, '执行阶段'就此结束。
。。。。。。
前面我们将的例子的最开始是假设程序已经在内存里了,也就是已经在ram里面了,cpu如何先从ram里面一条条拿到指令(通过指令地址寄存器把数据从ram复制到指令寄存器),然后指令寄存器开始解码,然后执行指令。如此顺序执行内存的程序。
那么,最开始程序是如何"进入"计算机的,也就是程序是如何加载到内存的?
#早期的编程方式:
用可穿孔纸卡,纸卡的特定位置有没有孔决定了线是高还是低。一连串的纸卡就形成一连串的连续指令。穿孔纸卡便宜、可靠、易懂。比如人口普查,一个人生成一个纸卡,这个纸卡比如有种族、性别、年龄、姓名、学历等信息,每个字段都有几种选择,那么一个人如果是男,则在性别的那一行男的那一列打一个孔。这样人口普查时,只要把普查到的人口的卡纸一张张放入计算机,计算机根据这些孔就计算出有多少男人多少女人,多少汉族多少其他民族。这种编程方式,卡纸传入计算机的不是指令而是数据。一摞穿孔卡纸输入,穿孔卡纸携带的信息就被加载到内存了,一旦程序和数据加载完毕,电脑就开始执行了。
后来演变成一个控制面板,就是把几百根电线插入插板,有点像以前的电话交换机,目的是让计算机不同的部分互相传递数据和信号。这种编程方式传入计算机的信号不仅有数据还有简单的指令,就是这些指令我们还要配置它。就是说允许不同的指令或者说运行不同的程序要重新接线。
再后来演变成一个面板上用一大堆的开关和按钮,这样也可以做到切换电路的效果。但是这个面板上有各种指示灯,就代表了各种函数的状态和内存中的值,所以它的面板是一个巨大的控制台。有点像我们现在的游戏机。也有点像科幻片里的宇宙飞船的控制台。
直到我们的硬件——内存逐渐成熟,我们才把存在面板上的程序转向存在内存中变得可行。这种程序修改方便,cpu读取快速。此时我们的电脑才叫作'存储程序计算机'。后来随着内存不断地扩容,内存不仅可以存储要运行地程序还可以存储程序运行需要的数据,也包括程序运行时产生的临时数据。这种程序和数据都存在一个地方叫'冯诺伊曼结构'。冯诺依曼计算机的标志是:一个处理器(有算术逻辑单元)+数据寄存器+指令寄存器+指令地址寄存器+内存(复制存数据和指令)。
比如我们用python编程,我们要算两个数字相加会这样写:
a=3, b=9, c=a+b
这三行pyhon语言会被传入python编译器,编译成汇编语言:
load a 14
load b 15
add b a
store a 13
HALT
意思就是我们在写pyhon语言的时候已经忽略了计算机底层的运行逻辑。我们不需要去管寄存器或内存的位置,编译器都帮我们搞定了。作为程序员我们只需要创建代表内存地址的'变量',给变量取名字即可,我们就可以把两个数存在变量里面了。然后把两个数相加把相加的结果存在变量c里面。计算机底层操作时,编译器可能把变量a存在寄存器a,但我们是不需要知道这些的。汇编语言再被操作系统的编译器把汇编代码转化为机器码。所以我们现在的编程语言编程是不需要再接触cpu特有的汇编码和机器码,使得编程难度大大降低。
#编程语言都具备的元素:
规定句子结构的一系列规则叫语法。
比如'语句':a = 5就表示创建一个叫a的变量,把数字5放在这个变量里面。这就是'赋值语句',就是把一个值赋给一个变量。
程序由一个个指令组成,从第一条语句开始,一句一句运行到结尾。
例子,假如我们写一款游戏,拍虫子,关卡越高,虫子越多,游戏者要在虫子损坏继电器之前把虫子全部抓住。游戏者有几个备用继电器。开始编写时,我们需要一些值来保存游戏数据,比如当前关卡数、分数、剩余虫子数,游戏者还剩几个备用继电器。所以我们要初始化变量,初始化就是设置最开始的值:关卡=1, 分数=0, 虫子数=5, 备用继电器=4,玩家名=andre,为了做成交互式游戏,程序的执行顺序要更灵活,不只是从上往下执行,因此我们还要用'控制流语句'。控制流语句有好几种,最常见的有if 语句,可以想象成是'如果x为真,那么执行y'
。。。。
只要有足够的规则,状态和纸带,就可以创造出任何东西,这就是图灵机。图灵机回答了可判定行问题。图灵机可以实现任何计算,但是'停机问题'图灵机证明了是无法实现的,所以不是所有问题都能用计算解决的。也就是计算是有极限的,也就是计算机的能力是有限的。
图灵完备:现在计算机系统,比如笔记本电脑,智能手机,甚至微波炉和恒温器内部的小电脑,都是图灵完备的。