计算机科学入门
我们之前讨论过输入输出,但都是 计算机组件 互相输入输出,比如 RAM
输出数据,或输指令进 CPU
,我们还没讲来自 人类 的输入,也没讲怎么从电脑中拿出信息,除了用 打孔纸卡
。
当然,有很多种 输入输出设备
让我们和计算机 交互 ,它们在人类和机器间提供了界面,如今有整个学科专门研究这个,叫 人机交互
(Human-Computer Interaction)。
早期输入方式
界面对用户体验非常重要,早期机械计算设备用 齿轮
, 旋钮
和 开关
等 机械结构 来输入输出,这些就是交互界面。
甚至早期电子计算机 比如 Colossus
和 ENIAC
也是用一大堆 机械面板 和 线 来操作。
输入一个程序可能要 几星期 ,还没提运行时间,运行完毕后想拿出数据,一般是打印到纸上。
打印机超有用,甚至 查尔斯·巴贝奇 都给 差分机
专门设计了一个,那可是 1820 年代!
然而,到 1950 年代,机械输入完全消失,因为出现了 打孔纸卡
和 磁带
,但输出仍然是打印到纸上,还有大量指示灯,在运行中提供 * 实时反馈* 。
那个时代的特点是 尽可能迁就机器 ,对人类好不好用是其次,打孔纸带就是个好例子,就是为了方便计算机读取,纸带是 连续 的,方便机器处理;纸孔可以方便地,用机械或光学手段识别;纸孔可以编码程序和数据。
当然,人类不是以纸孔方式思考的,所以负担放到了程序员身上,他们要花额外时间和精力转成计算机能理解的格式,一般需要额外人员和设备帮忙。
要注意的是,基本上 1950 年前的早期计算机 "输入" 的概念很原始。是的,的确是人类负责输入程序和数据,但计算机不会 交互式 回应。程序开始运行后会一直运行,直到结束。
因为机器太贵了,不能等人类慢慢敲命令和给数据,要 同时 放入程序和数据。
键盘
这在 1950 年代晚期开始发生变化,一方面,小型计算机变得 足够便宜 ,让人类来回和计算机交互变得可以接受,交互式就是人和计算机之间来回沟通。而另一方面,大型计算机 变得更快 ,能同时支持多个程序和多个用户,这叫 多任务
和 分时系统
。
但交互式操作时,计算机需要某种方法来获得用户输入,所以借用了当时已经存在的数据录入机制:键盘
(keyboards)。
当时,打字机已经存在几个世纪了,但现代打字机是 克里斯托弗·莱瑟姆·肖尔斯 在 1868 年发明的,虽然到 1874 年才完成设计和制造,但之后取得了商业成功。
肖尔斯的打字机用了 不寻常 的布局,QWERTY 。名字来自键盘左上角按键。
为什么这么设计有很多猜测,最流行的理论是这样设计是为了把常见字母放得远一些,避免按键卡住。
这个解释虽然省事,但可能是错的,或至少不够全面。
事实上,QWERTY 把很多 常见 字母放在了一起,比如 TH 和 ER 。
我们知道,肖尔斯和他的团队设计了很多版才进化到这个布局,总之,肖尔斯 的打字机取得了成功,所以其它公司很快开始抄他的设计。
过去一个世纪有不少新的键盘布局被发明,宣称各种好处,但人们已经熟悉了 QWERTY 布局,根本不想学新布局,这是经济学家所说的 转换成本
(switching barrier)。
所以现在都快 1 个半世纪了,我们还在用 QWERTY 键盘布局。
QWERTY 不是通用的 ,有很多变体,比如法国 AZERTY 布局,以及中欧常见的 QWERTZ 布局。
有趣的是,肖尔斯根本没想到打字会比手写快,手写速度大约是每分钟 20 个,打字机主要为了 易读性 和 标准化 ,而不是速度。
然而随着打字机成为办公室标配,对快速打字的渴望越来越大,有两个重大进步,解放了打字的潜力。
1880年左右,辛辛那提速记学院,一名叫 伊丽莎白·朗利 的老师,开始推广 十指打字
(ten-finger typing)。
比一个手指打字要移动的距离短得多,所以速度更快。
几年后,弗兰克·爱德华·麦克格林,盐湖城的一位联邦法庭书记学会了 盲打 ,打字时不用看键盘。
1888年,麦格高林赢了备受关注的打字速度比赛,之后十指盲打开始流行。
专业打字员每分钟 100 字以上,比手写快多了!而且清晰又整洁!
电传打字机
虽然人类擅长用打字机,但我们没法把打字机塞到计算机面前,让它打字,计算机又没有手指。
所以早期计算机用了一种 特殊 打字机,是专门用来发电报的,叫 电传打字机
(teletype machine)。
这些打字机是强化过的,可以用电报线发送和接收文本,按一个字母,信号会通过电报线,发到另一端,另一端的电传打字机会打出来,使得两人可以长距离沟通,基本是个蒸汽朋克版聊天室。
命令行界面
因为电传打字机有电子接口,稍作修改就能用于计算机,电传交互界面在 1960~1970 很常见,用起来很简单,输入一个命令,按回车,然后计算机会输回来,用户和计算机来回 "对话" ,这叫 命令行界面
(command line interfaces)。
它是最主要的人机交互方式,一直到 1980 年代。用电传打字机的命令行交互类似这样,用户可以输入各种命令。
我们来看几个命令,先看当前目录有什么文件,输入命令 ls
,名字来自 list 的缩写。然后计算机会列出当前目录里的 所有 文件。
如果想看 secretStarTrekDiscoveryCast.txt 有什么,要用另一个命令显示文件内容。
Unix 用 cat
命令显示文件内容, cat 是 连接 (concatenate)的缩写,然后指定文件名,指定的方法是写在 cat 命令后面,传给命令的值叫 参数
(argument)。
如果同一个网络里有其他人,你可以用 finger
命令找朋友,就像是个很原始的 "找朋友" App。
屏幕
电传打字机直到 1970 年代左右都是主流交互方式,尽管屏幕最早出现在 1950 年代,但对日常使用太贵,而且分辨率低。
然而因为针对普通消费者的电视机开始量产,同时处理器与内存也在发展,到 1970 年代,屏幕代替电传打字机变得可行。
但与其为屏幕专门重新制定全新的标准,工程师直接用现有的电传打字机协议。
终端
屏幕就像无限长度的纸,除了输入和输出字,没有其它东西,协议是一样的,所以计算机分不出是纸还是屏幕,这些 "虚拟电传打字机" 或 " 玻璃电传打字机" 叫 终端
(terminals)。
到 1971 年,美国大约有 7 万台电传打字机,以及 7 万个终端,屏幕又好又快又灵活,如果删一个错别字会立刻消失,所以到 1970 年代末,屏幕成了标配。
早期文字游戏
你也许会想,命令行界面太原始了,做不了什么有意思的事。
即便只有文字,程序员也找到了一些方法,让它变得有趣一些,早期的著名交互式文字游戏 Zork
出现于 1977 年。
早期游戏玩家需要丰富的想象力, 想像 自己身在虚构世界,比如 四周漆黑一片,附近可能有怪物会吃掉你 。
就像之前,我们可以用 ls
命令,看当前目录有什么,然后用 cd
命令,进入游戏文件夹, cd 的意思是 改变当前文件夹 。
再用 ls
看有哪些游戏,超棒!我们有 冒险旅程
!(adventure) 。
想运行这个程序,只需要输入它的名字,在程序自行停止或我们主动退出前它会接管命令行。
你现在看到的,是 巨大洞穴冒险
(Colossal Cave Adventure) 这款游戏的真实输出,由 Will Crowther 在 1976 年开发。
游戏中,玩家可以输入 1 个词或 2 个词的命令,来 移动人物 ,和其他东西 交互 ,捡物品等。
然后游戏会像旁白一样,输出你的当前位置, 告诉你能做什么动作,以及你的动作造成的结果,有些动作会导致死亡!
原始版本只有 66 个地方可供探索,但它被广泛认为是最早的 互动式小说 。
游戏后来从纯文字进化成 多人游戏
简称 MUD
,或 多人地牢游戏
,是如今 MMORPG
的前辈(大型多人在线角色扮演游戏)
命令行界面虽然简单,但十分强大,编程大部分依然是打字活,所以用命令行比较自然。
因此,即使是现在,大多数程序员工作中依然用命令行界面。
而且用命令行 访问远程计算机 是最常见的方式,比如服务器在另一个国家。
如果你用 Windows, macOS, Linux ,你的计算机有命令行界面,但你可能从来没用过,你可以在 Windows 搜索栏中输入 cmd
,或在 Mac 上搜 Terminal
,然后你可以装 Zork
玩!