早期的编程方式
程序如何进入计算机
打孔纸卡 Punched card
插线板 Plugboard
冯诺依曼架构 Von Neumann Architecture
面板编程 Panel programming
商业成功的计算机:Altair 8800
早期计算机如何编程?打孔纸卡 -> 插线板 -> 面板拔开关。
计算机的原理:
怎么从内存读写数据,执行操作。比如把两个数字加在一起。
简单描述了指令的执行,也就是计算机程序。
程序如何“进入”计算机: 程序需要加载进内存,是计算机科学。(打孔纸卡,插线板,面板拔开关)
打孔纸卡 Punched card
需求:给机器编程,早在计算机出现之前就有了,著名的就是纺织业。如果只想一块红色大桌布,可以直接放红线进织布机,但是如果想要图案怎么办?比如条纹或方格。需要没隔一会,调整一次织布机,因为非常消耗劳动力,所以图案纺织品很贵。
可编程纺织机:每一行的图案由可穿孔纸卡决定,特定位置有没有穿孔,决定了线是高是低。横线是从上 / 从下穿过,为了让每行图案不同,纸片连成长条,形成连续指令。
很多人认为雅卡尔织布机是最早的编程。
事实证明,穿孔纸卡便宜,可靠,也易懂。后面世代中,穿孔纸卡用于 1890 年美国人口普查。例如:一张卡存一个人的信息,比如种族,婚姻状况,子女数量,出生国家等等。针对每个问题,人口普查工作者会在对应位置打孔,当卡片插入汇总机,孔会让对应总和值 +1,可以插入整个国家入口的卡片,在结束后得到各个总值。但是,早期的汇总机不算计算机。因为它们只做一件事:汇总数据。操作是固定的,不能编程。穿孔 纸卡存的是数据,不是程序。之后,这些机器被加强,可以做减,乘,除。甚至可以做一些小决定,决定何时执行某指令。
插线板 Plugboard
为了正确执行不同计算,程序员需要某种控制面板,面板有很多小插孔,程序员可以插电线,让机器的不同部分,互相传数据和信号。因此也叫“插线板”。但是,这意味着,运行不同程序要重新接线。所以到了 1920 年代,控制面板变成了可拔插。让编程更方便,可以给机器插入不同程序。比如,一个插线板算销售税,另一个算工资单。但给插线板编程很复杂。用插线板编程,不只在机电计算机流行,世上第一台通用电子计算机,ENIAC,完成于 1946 年。用了一大堆插线板。
程序在纸上设计好之后,给 ENIAC 连线,最多可能花三个星期。因为早期计算机非常昂贵,停机几个星期只为了换程序,完全无法接受,急需要更快,更灵活的新方式来编程。
幸运的是,到 1940 年代晚期 1950 年代初。内存变得可行,价格下降,容量上升。与其把程序存在插线板,存在内存变得可行,这样易于修改,方便 CPU 快速读取。这类机器叫“存储程序计算机”。
冯诺依曼架构
如果内存足够,不仅可以存要运行的数据,还可以存程序需要的数据。包括程序运行时产生的新数据。程序和数据都存在一个地方,叫“冯诺依曼结构”。将指令和数据混合存放到内存,穿孔纸片和插线板,都是分开。
冯诺依曼曾过:我在思考比炸弹重要得多的东西计算机。
冯诺依曼计算机的标志是,一个处理器(有算术逻辑单元)+ 数据寄存器 + 指令寄存器 + 指令地址寄存器 + 内存(负责存数据和指令)。
第一台冯诺依曼架构的“存储程序计算机”,由曼彻斯特大学于 1948 年建造完成,绰号“宝宝”。
虽然有内存很棒,但程序和数据,依然需要某种方式输入计算机,所以用穿孔纸卡。
到 1980 年代,几乎所有的计算机都有穿孔纸卡读取器,可以吸入一张卡片,把卡片内容写进内存,如果放了一叠卡片,读取器会一个个写进内存。一旦程序和数据写入完毕,电脑会开始执行。即便简单程序也有几百条指令,要用一叠纸卡来存。
用纸卡的最大型程序是美国空军的 SAGE 防空系统,于 1955 年完成,据称顶峰时期,雇佣了世上 20% 程序员。
主控制程序用了 62500 张穿孔纸片,等同于大约 5MB 的数据。穿孔纸卡不仅可以往计算机放数据,还可以取出数据,程序运行到最后,结果可以输到纸卡上,方式是打孔。然后人可以分析结果,或者再次放进计算机,做进一步计算。
穿孔纸卡的亲戚是纸带,基本是一回事,只不过更连续,不是一张张卡。
现在存储的方式,硬盘,只读光盘,DVD,U 盘等等。
面板编程 Panel programming
与其插一堆线到插线板,可以用一大堆开关和按钮,做到一样的效果。面板上有指示灯,代表各种函数的状态和内存中的值。
50 和 60 年代的计算机,一般都有这样巨大的控制台。很少有人只用开关来输入一整个程序,但技术上是可行的,早期针对计算机爱好者的家用计算机,大量使用了开关。因为大多数家庭用户负担不起昂贵的外围设备,比如穿孔纸卡读取器。
第一款取得商业成功的家用计算机是 Altair 8800 有两种版本可以买:
预先装好的整机
需要组装的组件
为了给 8800 编程,要拨动面板上的开关。输入二进制操作码,然后按“存储键”把值存入内存。然后会到下一次内存位置,可以再次拨开关,写下一个指令,重复这样操作。(初代 plc 原型)
把整个程序都写入内存之后,可以推动开关,回到内存地址 0,然后按运行按钮,灯会闪烁。
不管是插线板,开关或穿孔纸卡。早期编程都是专家活,不管是全职还是技术控,都要非常了解底层硬件。比如 操作码,寄存器等,才能写程序。所以编程很难,很烦。哪怕工程师和科学家都无法完全发挥计算机的能力,需要一种更简单方式,告诉计算机要做什么。一种更简单的编程方式。
编程语言的发展史
编程:二进制 -> 助记符(汇编器) -> A-0(编译器) -> FORTRAIN
二进制写程序,先纸上写伪代码,手工转二进制。
用“助记符”写代码 (LOAD 14) 为了把助记符转二进制,汇编器诞生(Assembler)
哈佛 1 号计算机首批程序员,海军官员。(葛丽丝●霍普 Grace Hopper)
Grace 设计了编程语言 A -0
Grace 1952 年做了第一个编译器(Compiler), 实现 A -0
变量(Variables)
FORTRAIN
COBOL
新语言 1960 年代:ALGOL, LISP, BASIC1970 年代:Pascal C, Smalltalk1980 年代:C++, Object-C, Perl1990 年代:Python, Ruby, Java
组成计算机的物理组件:比如电,电路,寄存器,RAM, ALU, CPU。
在硬件层面编程非常麻烦,所以程序员想要一种更通用的方法编程。一种“更软的”媒介:软件。
第一条指令在内存地址 0: 0010 1110。前 4 位操作码,简称 OPCODE 对于这个假设 CPU,0010 代表 LOAD A 指令:把值从内存复制到寄存器 A。后 4 位是内存地址,1110 是十进制的 14。所以这 8 位表达的意思是:读内存地址 14,放到寄存器 A。
只是用了两种不同语言,可以想成是英语和摩尔斯码的区别。“hello”->“…. . .-.. .-.. —”是一个意思:“hello”
只是编码方式不同,英语和摩尔斯码的复杂度也不同,英语有 26 个字母以及各种发音。摩尔斯码只有“点”和“线”但它们可以传达相同的信息,计算机语言也类似。
计算机能处理二进制,二进制是处理器的“母语”。事实上,它们只能理解二进制。这叫“机器语言”或“机器码”。
二进制写程序
在计算机早期阶段,必须用机器码写程序。具体来讲,会先在纸上写一个“高层次版”的伪代码(PSEUDO-CODE)。例如:从内存取下一个销售额,然后加到天,周,年的总和,然后算税。
写好伪代码后,用“操作码表”把伪代码转成二进制机器码,翻译完成后,程序可以喂入计算机并运行。
助记符
在 1940~1950 年代,程序员开发出一种新语言,更可读,更高层次。每个操作码分配一个简单名字,叫“助记符”(MNEMONICS)。“助记符”后面紧跟数据,形成完整指令。与其用 1 和 0 写代码,程序员可以写“LOAD A 14”。