命令行界面
计算机早期同时输入程序和数据(用纸卡/纸带),运行开始直到结束,中间没有人类进行操作,原因是计算机很贵,不能等人类慢慢输入,执行完结果打印到纸上。
到1950年代,计算机足够便宜+快,人类和计算机交互式操作变得可行,为了让人类输入到计算机,改造之前就有的打字机,变成电传打字机。
到1970年代末,屏幕成本足够低,屏幕代替电传打字机,屏幕成为标配。
- 人机交互 Human-Computer Interaction。
- 早期输出数据是打印到纸上,而输入是用纸卡/纸带一次性把程序和数据都输入进去。
- QWERTY 打字机的发展,肖尔斯发明于1868年。
- 电传打字机 Teletype machine。
- 命令行界面 Command line interface
- ls命令
- 早期文字游戏 Zork(1977年)
- cd 命令
输入输出,都是计算机组件互相输入输出。比如RAM输出数据,或输指令进CPU。
计算机接收人类的输入,怎么从电脑中拿出信息,除了用打孔纸卡。
有很多种“输入输出设备”,让人类和计算机交互,它们在人类和机器间提供了界面。如今有整个学科专门研究,叫“人机交互”。
界面对用户体验非常重要。
纸带/纸卡
早期机械设备,用齿轮,旋转和开关等机械结构来输入输出。这些就是交互界面。
甚至早期电子计算机,比如Colossus和ENIAC,也是用一大堆机械面板和线来操作。输入一个程序可能要几个星期,还没提运行时间。运行完毕后想拿出数据,一般是打印到纸上。打印机超有用,甚至,查尔斯●巴贝奇(由于提出差分机和分析机的设计概念,被视为计算机先驱) 给差分机专门设计了一个。
然而,到1950年代,机械输入完全消失,因为出现了打孔纸带和磁带,但输出仍然是打印到纸上。还有大量的指示灯,在运行中提供实时反馈。
那个时代的特点是 尽可能迁就机器,对人类好不好用是其次。打孔纸带,就是为了方便计算机读取,纸带是连续的,方便机器处理,纸孔可以方便的,用机械或光学手段识别,纸孔可以编码程序和数据,当然,人类不是以纸孔方式思考的,所以负担放到了程序员身上。要花额外时间和精力转成计算机能理解的格式,一般需要额外人员和设备帮忙,基本上1950年前的早期计算机“输入”的概念很原始。
人类负责输入程序和数据但计算机不会交互式回应。程序开始运行后会一直运行,直到结束。因为机器太贵了,不能等人类慢慢敲命令和给数据。要同时放入程序和数据。
一方面,小型计算机变得足够便宜,让人类来回计算机交互,变得可以接受。交互式就是人和计算机来回沟通。另一方面,大型计算机变得更快,能同时支持多个程序和多个用户,这叫“多任务”和“分时系统”,但交互式操作时,计算机需要某种方法来获得用户输入。所以借用了当时已经存在的数据录入机制:键盘。
当时,打字机已经存在了几个世纪了,但现代打字机是肖尔斯 在1868年发明的,虽然到1874年才完成设计和制造,但之后取得了商业成功,肖尔斯的打字机用了不同寻常的布局,QWERTY
,名字来自键盘左上角按键。
为什么这么设计,最流行的理论是,这样设计是为了,把常见字母放得远一些,避免按键卡住。这个解释虽然省事,但可能是错误的,或至少不够全面。事实上,QWERTY
把很多常见字母放一起,比如TH
和ER
。有很多键盘版本出现,但是人们不想再去学习新的布局,这是经济学家所说的,转换成本。QWERTY
不是通用的,有很多变体,比如法国AZERTY
布局,以及中欧常见的QWERTZ
布局。
法国AZERTY
:
中欧QWERTZ
:
电传打字机
有趣的是,肖尔斯根本没想到打字会比手写快,手写速度大约是每分钟20个,打字机主要为了易读性和标准化,而不是速度。然而随着打字机成为办公室标配,对速度打字的渴望越来越大。
有两个重大进步,解放了打字潜力,1880年左右,伊丽莎白●郎利 老师,开始推广 十指打字,比一个手指打字要移动的距离短得多,所以速度更快。几年后,弗兰克●爱德华●麦克格林,学会了盲打,打字时不用看键盘,之后“十指盲打”就开始流行。
虽然,人类擅长用打字机,但没办法把打字机塞到计算机前面,让它打字,所以早期计算机用了一种特殊的打字机,是专门用来发电报的,叫“电传打字机”。
这些打字机是强化过的,可以用电报线发送和接收文本,按一个字母,信号会通过电报线,发到另一端。另一端的电传打字机会打出来。使得两个人可以长距离沟通。
因为电传打字机有电子接口,稍作修改就能用于计算机,电传交互界面在1960~1970年很常见。
用起来很简单,输入一个命令,按回车,然后计算机会输回来。用户和计算机来回“对话”。这叫“命令行界面”,它是最主要的人机交互方式,一直到1980年代。
用电传打字机的命令行交互 类似这样:
用户可以输入各种命令,先看当前目录有什么文件,输入命令ls
,名字来自list
的缩写,然后计算机会列出 当前目录里所有文件。
如果想看secretStarTrekDiscoveryCast.txt
有什么,要用另外一个命令, 显示文件内容。unix用cat
命令显示文件内容,cat
是连接(concatenate)的缩写,然后指定文件名,指定的方法是写在cat
命令后面传给命令的值叫 参数。
如果同一个网络里有其他人,可以用finger
命令找朋友,就像是一个很原始的“找朋友”App,电传打字机,直到1970年代左右都是主流交互方式。尽管屏幕最早出现在1950年代,但对日常使用太贵,而且分辨率低,然而因为针对普通消费者的电视机开始量产,同时处理器与内存也在发展,到1970年代,屏幕代替电传打字机,变得可行。
但与其为屏幕专门做全新的标准,工程师直接用现有的,电传打字机协议,屏幕就像无限长度的纸,除了输入和输出字,没有其它东西。协议是一样的,所以计算机分不出来是纸还是屏幕。
这些“虚拟电传打字机”或“玻璃电传打字机”叫终端。
到1971年,美国大约有7万台终电传打字机,以及7万个终端。屏幕又快又好又灵活,如果删一个错别字,会立刻消失,所以到1970年代末,屏幕成了标配。
早期的著名交互式文字游戏 Zork,出现于1977年,早期游戏玩家需要丰富的想象力,想象自己身在虚构世界,比如“四周漆黑一片,附近可能有怪物会吃掉你”。但它被广泛认为是最早的互动式小说。
游戏后来从纯文字进化成多人游戏,坚持“MUD”,或多人地牢游戏。
cd
命令,进入某个文件夹,意思是,“改变文件夹”。
命令行界面虽然简单,但十分强大,编程大部分依然是打字活,所以用命令行比较自然。因此,即使是现在,大多数程序员工作中依然用命令行界面。
而且用命令行访问远程计算机是最常见的方式,比如服务器在另外一个国家。
- 早期,机械面板和线,输入;纸上,输出。
- 1950年代,打孔纸带和磁带,输入;纸上,输出。
- 键盘,十指盲打,输入。
- 电传打字机,电传交互界面。
- 电传打字机的命令行交互。
- 屏幕,输出。
屏幕与2D图形显示
- PDP-1计算机,键盘和显示器分开,屏幕显示临时值。
- 阴极射线管 Cathode Ray Tube(CRT)。
- CRT有二种绘图方式:
矢量扫描 Vector Scanning
光栅扫描 Raster Scanning - 液晶显示器 Liquid Crystal Displays (LCD),像素(Pixel)。
- 字符生成器 Character generator。
- 屏幕缓冲区 Screen buffer。
- 矢量命令画图。
- Sketchpad, 光笔(Light pen)。
- 函数画线,矩形。
PDP-1计算机:
这台1960年的计算机,是一个早期图形计算机的好例子,柜子大小的电脑,电传打印机,圆形屏幕,它们是分开的。因为当时文本任务和图形任务是分开的。
事实上,早期的屏幕无法显示清晰的文字,而打印到纸上,有更高的对比度和分辨率。
早期屏幕的典型用途:跟踪程序的运行情况。比如寄存器的值。
如果用打印机,一遍又一遍打印出来没有意义,不仅浪费纸而且慢。另一方面,屏幕更新很快,对临界值简直完美,但屏幕很少用于输出计算结果,结果一般都打印到纸上,或其它更永久的东西上。
但屏幕超有用,到1960年代,开始用屏幕做很多酷炫的事情。
出现很多显示技术,但最早最有影响力的是:阴极射线管(CRT)。
原理是:把电子发射到有磷光体涂层的屏幕上,当电子撞击涂层时,会发光几分之一秒,由于电子是带电粒子,路径可以用磁场控制,屏幕内用板子或线圈,把电子引导到想要的位置,上下左右都行。
既然可以这样控制,有2种方法绘制图形。
- 引导电子束描绘出形状,这叫“矢量扫描”,因为发光只持续一小会儿,如果重复得足够快,可以得到清晰的图像。
- 按固定路径,一行行来,从上向下,从左到右,不断重复。只在特定的点打开电子束,以此绘制图形。这叫“光栅扫描”,用这种方法,可以用很多小线段绘制形状,甚至文字。
光栅扫描
因为显示技术的发展,终于可以在屏幕上显示清晰的点,叫“像素”。
液晶显示器,简称LCD,和以前的技术相当不同,但LCD也用光栅扫描,每秒更新多次,像素里红绿蓝的颜色。
很多早期计算机不用像素:不是技术做不到,而是因为像素占太多内存。
200像素 * 200像素的图像,有40000个像素,会占40000bit内存,比PDP-1全部内存的一半还多,所以计算机科学家和工程师,得到一些技巧来渲染图形等到内存发展到足够用。
所以早期计算机不存大量像素值,而是存符号,80*25个符号最典型,总共2000个字符,如果每个字符用8位表示,比如用ASCII,总共才16000位,这种大小更合理。
为此,计算机需要额外硬件,来从内存读取字符,转换成光栅图形,这样才能显示到屏幕上。这个硬件叫“字符生成器”,基本算是第一代显卡。它内部有一小块只读存储器,简称ROM
。存着每个字符的图形,叫“点阵图案”。
如果图形卡看到一个8位二进制,发现字母是K(1001011),那么会把字母K的点阵图案,光栅扫描显示到屏幕的适当位置。
为了显示,“字符生成器”会访问内存中一块特殊区域,这块区域专为图形保留,叫“屏幕缓冲区”。程序想显示文字时,修改这块区域里的值就行。
这个方案用的内存少得多,但也意味着,只能画字符到屏幕上。但字符集实在太小了,做不了什么复杂的事,因此对ASCII进行了各种扩展,加新字符,比如IBM CP437字符集,用于DOS。
某些系统上,可以用额外的bit定义字体颜色和背景颜色,做出好看的DOS界面。
字符生成器是一种省内存的技巧,但没办法绘制任意形状,绘制任意形状很重要,因为电路设计,建筑平面图,地图,好多东西都不是文字。
为了绘制任意形状,同时不吃掉所有内存,计算机科学家用CRT上的“矢量模式”
阴极射线管的矢量模式
概念非常简单:所有东西都由线组成。没有文字这回事,如果要显示文字,就用线条画出来,只有线条,没有别的。
假设一个视频,笛卡尔平面 200个单位宽,100个单位高。原点(0, 0)在左上角。可以画形状,用矢量命令。
这些命令来自Vectrex
,一个早期矢量显示系统,首先,reset
, 这个命令会清空屏幕。
- 把电子枪的绘图点移动到坐标(0, 0),并把线的亮度设为0,
-
MOVE_TO 50 50
把绘图点移动到坐标(50, 50),INTENSITY 100
,把强度设为100, - 现在亮度提高了,移动到(100, 50) 然后(60, 75) 然后 (50, 50)
- 最后把强度设回0。这些命令占160bit,比存一个庞大的像素矩阵更好。
SCREEN
BUFFER:
RESET
MOVE_TO 50 50
INTENSITY 100
MOVE_TO 100 50
MOVE_TO 60 75
MOVE_TO 50 50
INTENSITY 0
就想之前的“字符生成器”把内存里的字符转成图形一样。这些矢量指令也存在内存中,通过矢量图形卡画到屏幕上,数百个命令可以按顺序存在屏幕缓冲区,画出复杂的图形,全是线段组成的。
由于这些矢量都在内存中,程序可以更新这些值,让图形随时间变化:动画。
最早的电子游戏之一,Spacewar
,是1962年在PDP-1上用矢量图形制作的,它启发许多后来的游戏,比如 爆破彗星(Asteroids), 甚至第一个商业街机游戏:太空大战,1962年是一个大里程碑,Sketchpad
诞生,一个交互式图形界面,用途是计算机辅助设计 (CAD)。它被广泛认为是第一个完整的图形程序。为了与图形界面交互Sketchpad
用了当时发明不久的输入设备,光笔。
就是一个有线连着的电脑的触控笔。笔尖用光线传感器,可以检测到显示器刷新。通过判断时间刷新,电脑可以知道笔的位置,有了光笔和各种按钮用户可以画线和其它简单的形状。Spacewar
可以让线条完美平行,长度相同,完美垂直90度,甚至动态缩放。用户还可以保存设计结果,方便分享和再次使用。
光笔这些代表了人机交互方式的关键转折点。电脑不再是关在门后,负责算数的机器了。
最早用于真正像素的计算机和显示器出现于1960年代末,内存中的位(Bit)对应屏幕上的像素,这叫位图显示。
可以把图形想成一个巨大像素值矩阵,计算机把像素数据存在内存中一个特殊区域,叫“帧缓冲区”。
早期时,这些数据存在内存里,后来存在高速视频内存里,简称 VRAM。VRAM在显卡上,这样访问更快。
在8位灰度屏幕上,可用的颜色值范围是0强度(黑色)到255强度(白色),其实更想绿色或橙色,因为许多早期显示器不能显示白色。
在低分辨率的位图屏幕上,分辨率60*35像素,
如果想把(10, 10)的像素设为白色,可以这样操作:f[10][10] = 255
。
如果想画一条线, 假设从(30, 0)到 (30, 35)可以用这样一个循环:
FOR y = 0 TO 35
f[30][y] = 255
NEXT
把整列像素变成白色,如果想画更复杂的图形,比如矩形,那么需要四个值。
- 起始点坐标X。
- 起始点坐标Y。
- 宽度。
- 高度。
计算机绘图时,会用指定的颜色127,而不是(255/2 = 127.5)。
程序可以操纵“帧缓冲区”中的像素数据,实现交互式图形,当然,程序不会浪费时间从零开始写绘制函数,而是用预先写好的函数来做,画直线,曲线,图形,文字等。
位图的灵活性,为交互式开启了全新的可能,但它高昂成本持续了十几年。1971年整个美国也只有大约7万个电传打字机和7万个终端。大约有1000台电脑有交互式图形屏幕。
Spacewar
和太空大战这样的先驱,推动了图形界面发展,帮助普及了计算机显示器。
冷战和消费主义
冷战导致美国往计算机领域投入大量资源。
- 范内瓦●布什 预见了计算机的潜力,提出假想机器
Memex
。 - 1950年代消费者开始买晶体管设备,收音机大卖,日本取得晶体管授权后,索尼做了晶体管收音机,为日本半导体行业崛起做了铺垫。
- 苏联1961年把宇航员加加林送上太空,导致美国提出登月,NASA预算大大增加,用集成电路来制作登月计算机。
- 集成电路的发展实际上是由军事应用大大推进的,阿波罗登月毕竟只有17次,美国造超级计算机进一步推进集成电路。
- 美国半导体行业一开始靠政府高利润合同,忽略消费者市场,1970年代冷战渐渐消失,行业开始衰败,很多公司倒闭,英特尔转型处理器。
- 政府和消费者推动了计算机的发展,早期靠政府资金,让技术发展到足够商用,然后消费者购买商用产品发展。
1940年代中期,电子计算机诞生。
编程语言和编译器,算法和集成电路。
软盘和操作系统,电报机和屏幕。
基本都在1940~1970年代,大概三十年时间里出现的。
冷战,太空竞赛,全球化,消费主义的兴起。
1945年二战结束后不久,冷战开始了,因此政府往科学和工程学,投入大量资金。
计算机在战时已经证明自身的价值,比如曼哈顿计划和破解通讯加密。ENIAC
, EDVAC
, Atlas
, Whirlwind
。
高速的发展,仅靠商业运作根本无法做到,要依靠销售收回开发成本。
1950年代出现变化,特别是Univac1,它是第一台取得商业成功的电脑型号,开发40多台,大部分在政府或大公司,成为美国日益增长的军事工业综合体的一部分,因此政府承担高额开发费用。
例如一台给美国原子能委员会,生产的是Univac1,被CBS用来预测1952年美国总统大选的结果,当然最后结果预测准确,只用了百分之一的选票数据。这次事件把计算机推到公众前面。
计算机和以前机器不一样,以前的机器,增强人类的物理能力,比如卡车能带更多东西,自动织布机更快,机床更精确等等,这些东西代表了工业革命,而计算机增强的是人类的智力。
范内瓦●布什在1945年看见计算机潜力,描述了一种假想计算设备叫Memex,可以用这个设备,存自己所有的书,其它资料,以及和别人沟通。而且数据是按照格式存储的,所有可以快速查询,有很大的灵活性。可以辅助人类的记忆。
还预测了会出现新的百科全书形式,信息之间相互链接,Memex启发了,之后的几个重要里程碑。
1950年代,消费者开始购买晶体管设备,其中收音机,它又小又耐用,用电池就够了,而且便携。不像1940年之前的收音机,用的是真空管。
日本政府振兴战后经济,很快从贝尔实验室,取得晶体管的授权,帮助日本的半导体和电子行业。
1955年,索尼的第一款产品面世,TR-55晶体管收音机,把重心放在质量和价格。因此日本公司在五年左右,占有美国便携式收音机市场的一半。
1953年,整个地球大概有100台计算机,苏联这时候的科技,比西方落后几年,苏联在1950年,完成了第一个可编程电子计算机。但苏联在太空竞赛远远领先。
苏联在1957年,把第一个卫星送上轨道,史波尼克1号,不久,在1961年,苏联宇航员, 尤里●加加林 第一个进入太空。使得肯尼迪总统,在加加林太空任务一个月后,提出要登陆月球。NASA的预算增加了几乎十倍。在1966年到达顶峰,占了政府预算的4.5%。
NASA用这笔钱资助各种科学研究,阿波罗计算花的最多,雇了40万人左右,而且有2万多家大学和公司参与。
其中一个挑战是:怎样在太空中导航。NASA需要电脑计算复杂的轨道来引导太空船,因此,造了“阿波罗导航计算机”,有三个要求。
- 计算机要快。
- 计算机要又小又轻。太空船空间有限。
- 要超级可靠。这对太空船非常重要,因为太空中有很多震动,辐射,极端温度变化。
那时候主流的真空管,晶体管无法达到这些要求。所以NASA用全新技术:集成电路。
阿波罗导航计算机,首先使用集成电路,NASA是唯一负担得起集成电路的组织,最初,一个芯片差不多50美金,导航计算机需要上千个芯片。
把集成电路的发展归功于阿波罗导航计算机,但它们产量很低,一共只有17次阿波罗任务,实际上是军事,大大推进了集成电路的发展。特别是洲际导弹和核弹,使集成电路大规模生产。
最初,美国的半导体行业靠高利润政府合同起步,因此忽略了消费市场,因为利润小。因此日本半导体行业在1950-1960年代,靠低利润率占领了消费市场。
日本人投入大量资金,大量制造以达到规模经济,同时研究技术,提高质量和产量以及自动化降低成本。
1970年代,太空竞赛和冷战逐渐消退,高利润的政府合同变少,美国的半导体和电子设备公司很难竞争。虽然很多计算机组件商品化,但并没有什么帮助,提供相同质量的产品且价格还更便宜。
仙童半导体在1979年濒临倒闭被其它公司收购了,为了生存,很多公司把生产外包出去,降低成本,英特尔不再把精力放在内存集成电路,而是把精力放在处理器。
因为集成电路,计算器又小又便宜,取代了办公室里昂贵的桌面计算器,大多数人来说,这是第一次不用纸笔和计算尺来做计算,因此适应市场,进一步降低了集成电路的成本,使得微处理器被广泛使用。
在短短三十年时间里,计算机从大到人类可以在CPU里走来走去,发展到小孩都可以抓住的手持玩具,而且微处理器还快得多。这种巨大的变化是由二种力量推动:政府(军事)和消费者。
政府资金,比如冷战期间美国投入的钱,推动了计算机的早期发展。并且让计算机行业活得足够久,使得技术成熟到可以商用。然后是公司,最后是消费者,把计算机变成主流。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。