桌面系统的虚与实

背景 此篇文章是从之前的计算机纵深这篇文章的独立出来的, 因为发现, 想写的内容实在有点多, 如果放在那篇文章中的话, 会造成不好的文章结构, 这个部分过于详细会像一个人背了很重书包的人一样, 不和谐(应该托运或放行李中才对). 这篇文章中是基于我对现今操作系统(OS)中的的"命令/终端/图形界面"这几个方面的疑惑而展开的, 希望通过结合之前的知识以及写文章整理思路, 解决掉"直觉性/理解上"的疑惑.

在写此篇文章时, 我正享受着图形界面带来的便利: 在桌面系统中找到".md"文件, 用鼠标双击打开, 然后跳出此Typora的软件窗口, 然后我敲击键盘, 在窗口中出现了这些文字. 这一切, 在一个使用者的角度来说是很自然和直觉性的事情了, 除非有一天突然被问到: 1+1为什么等于2, 则桌面系统和终端命令之间的疑问黑盒在心中被打开.

图形用户界面(Graphical User Interface)用图形的方式将消费者带入到计算机当中去, 请允许我这么说, 因为若不是采用了图形用户界面, 则现在的普通大众(消费者)不会这么容易地能使用计算机, 相反的, 如果没有GUI, 则消费者只能使用命令行界面(Command Line Interface)来"操作/使用"计算机了(那将会是一个怎样的情景). 现在的个人电脑(Personal Computer, 计算机的一类分类)使用了图形界面, 对消费者来说是一个很好的接受方案(视觉图案方案), 详细地(引用维基百科):

然而这界面若要透过在显示器的特定位置,以“各种美观、而不单调的视觉消息”提示用户“状态的改变”,势必得比简单的文字消息呈现,花上更多的计算机运算能力,计算“要改变显示器哪些光点,变成哪些颜色”。

我们可以将上述这一小段话与日常使用电脑时的感受结合一下, 应该会发现这段话描述地"别有一番滋味在心头".

图形用户界面的历史

以下, 我将维基百科中关于GUI历史变迁的一节完整的引用过来(没什么可总结的, 都是时间节点), 大致地领略GUI的发展路径:

  • 1973年第一个可视化操作的Alto计算机在施乐帕洛阿尔托研究中心(Xerox PARC)完成。Alto是第一个把计算机所有元素结合到一起的图形界面操作系统。它使用3键鼠标、位运算显示器、图形窗口、以太网络连接。[1]
  • 1980年Three Rivers公司推出Perq图形工作站
  • 1981年施乐公司推出了Alto的继承者Star,Alto曾首次使用了窗口设计
  • 1983年苹果计算机公司推出Apple Lisa个人计算机,是全球第一款搭载图形用户界面(GUI)的个人计算机
  • 1984年苹果计算机公司推出Macintosh
  • 1986年首款用于Unix的窗口系统X Window System发布。
  • 1988年IBM发布OS/2 1.10标准版演示管理器(Presentation Manager),这是第一种支持Intel计算机的稳定的图形界面。
  • 1992年微软公司发布Windows 3.1,增加了多媒体支持。
  • 1995年微软的Windows 95发布,其窗口操作系统的外观基本定型。
  • 1996年微软发布Microsoft Bob,此软件具有动画助手和有趣的图片。
  • 1996年IBM发布OS/2 Warp 4,它的交互界面得到显著改善,至今仍有不少ATM机运行这样的系统。
  • 1997年KDEGNOME两大开源桌面项目启动。
  • 1997年苹果计算机公司发布Mac OS 8,这个系统具有三维外观并提供了SpringLoaded Folder功能。
  • 2000年苹果计算机公司推出Mac OS X系统的默认外观Aqua。
  • 2001年微软发布Windows XP,实现桌面功能的集成。
  • 2003年Mac OS X v10.3提供了一键单击访问任何已打开窗口的功能。
  • 2003年Sun公司的Java桌面系统为GNOME桌面添加了和Mac类似的效果。
  • 2006年微软发布Windows Vista,对此前其视窗操作系统的外观作了较大的修改。
  • 2009年微软发布Windows 7,对此前其视窗操作系统不仅是外观,甚至是对硬件的支持都作了较大修改,比Vista降低了对硬件的要求。
  • 2012年微软发布Windows 8,与前一代外观更加简洁,操作也较简单,不过移除了最实用的开始菜单受到批评。
  • 2013年微软发布Windows 8.1,与前一代一样,只是把开始菜单给加回来,但不是Windows 7开始菜单界面。
  • 2015年微软发布Windows 10,与前一代一样,保留原有外观,但开始菜单改回了Windows 7界面。

有意思的是, 1973年的施乐的图形界面的Alto计算机(下图, 图1), 也是苹果乔布斯当年参考的原型(Apple I计算机可不是图形界面的), 后来还因此和微软起了争执: 因为这个图形界面实在是太有价值了, 而当时乔布斯和比尔盖茨都是"风华正茂"的年轻人, 因竞争关系谁也不服谁:

The revolutionary Xerox Alto computer was introduced internally at the Xerox Palo Alto Research Center (PARC) in 1973. This was the first manufactured machine to use a mouse, and the Ethernet protocol was established to network the machines within Xerox. The main processing unit, the size of a small refrigerator, was designed to sit under a desk or table, while the display, mouse, and keyboard sat on the tabletop. The display was shaped like a piece of letter-sized paper and in conjunction with the mouse employed a graphical user interface (GUI). This was perhaps the most farsighted feature of the machine, as it took another 20 years for GUI’s to become standard on desktop computers.

Steve Jobs of Apple Computer toured the Xerox PARC facilities in 1979 and immediately recognized the utility of the GUI on the Alto. The design of Apple’s Lisa computer, already under development, was changed to be GUI-based. Xerox also developed a GUI machine called the Star for the mass market, but both the Lisa and Star were flops due to their high price tags. It wasn’t until the Macintosh was released in 1984 that the price point for mass-market appeal in a GUI machine was achieved.

01_xerox-alto.jpg
Fig.1, 1973 Xero Alto Computer, source: ref.

图形用户界面工作机理

下面, 我总结一下图形界面的工作机理, 以消除在文章开头提到的"命令/终端/图形界面"这三个方面的理解鸿沟(对于只会用高级编程语言的码农来说底层的世界太恐怖:D).

首先, 理解"桌面"(下图, 图2, 此图中还包含各个大小不一的"窗口"). 桌面, 由OS内的桌面系统相关程序(即可执行程序)在OS启动时加载运行, 在它加载完成之前, 我们无法使用电脑(因为"还没进入桌面"), 它负责:

  • 将OS的桌面文件夹映射到屏幕中: 在Mac是’~/Desktop’文件夹内的内容, 在Windows中则是’系统盘(默认为C盘):\Documents and Settings\[用户名]\桌面’文件夹;
  • 桌面背景的加载: 这没啥好说的, 就是一张图片, 是视觉美观的因素…;
  • 其它桌面组件加载: 如Mac中桌面底部的Docker, 顶部的菜单栏, 如Windows中的底部开始菜单栏;

以上差不多就是一个我们日常使用中的桌面了, 它显示的所有文件夹, 文件, 程序(终端式), 应用软件(图形式), 都有在磁盘上的对应"实体"(指OS中的文件, 从能否看见的角度来说, 此处"实体"的说法有点不妥), 下面我们要讲"窗口".

02_X-Window-System.png

Fig.2, 1990年代早期Unix平台上运行的 X-Window-System, ref.

其次, 我们看看"窗口". 窗口是应用程序为使用数据而在图形用户界面中设置的基本单元(例: 浏览器窗口, 终端窗口, Finder窗口(Mac)). 注意, 此时, 应用程序和数据在窗口内实现了一体化, 用户可以在窗口中操作应用程序, 进行数据的管理, 生成和编辑. 好了, 我们看看具体的例子, 如:

  • 敲击出此段文字的我使用的Mac系统上的Typora软件窗口, Typora窗口提供了一个区域让我生成和编辑我的数据, 在我使用快捷键"Cmd+S"保存文章数据时(OS会理解成是一个中断需要响应, 即"保存"), 在Typora之下的Mac OS系统会"调用"保存命令: 可能是C语言中的fopen(文件名,w+(读写文本文件,打开方式)), 至此, 窗口中对数据的管理就完成了;
  • 再如, 图2中的Manual Page窗口(左侧), xlogo窗口(右上), 它们一个是文本窗口, 一个是图像(二进制文件)窗口;

此外, 窗口还附有其它组件元素(如下段引用文字), 据我的直觉性理解, 鼠标针对这些菜单, 图标的点击都会生成中断, CPU根据点击发生的坐标位置(x和y)来知晓是哪个组件发生了点击这种"中断/事件", 据此生成相应的动作, 如点击关闭图标就关闭窗口, 点击最小化图标就最小化窗口:

引用: 通常在窗口四周设有菜单、图标,数据放在中央。在窗口中,根据各种数据/应用程序的内容设有标题栏,一般放在窗口的最上方,并在其中设有最大化、最小化(隐藏窗口,并非消除数据)、最前面、缩进(仅显示标题栏)等动作按钮,可以简单地对窗口进行操作。

而以上窗口的菜单, 图标, 按钮等窗口组件, 依我的理解, 它们由各自OS中的视窗系统(如Unix的X Window System)一一生成.

这样, 文章开头的"命令/终端/图形界面"疑问可以总结如下:

  1. 终端应指命令行接口(CLI)界面(如: Mac中的Terminal, 或早期的MS-DOS), 图形界面则指GUI, 它们都是运行在OS内核之外(不妥, Mac OS已将窗口系统整合进内核)的"一种软件/程序", 而在它们的基础上(它们先于用户与OS内核打交道), 用户与计算机完成交互(你叫计算机干点什么事情, 如写文字, 下载东西);

  2. 终端主要通过键盘完成与OS的交互, 而图形界面主要通过"键盘/鼠标/其它(如笔记本电脑的触控板)"完成与OS的交互, 不管哪种交互, 都会对OS生成中断, 而OS根据此中断的类型, 执行相应的操作, 如保存数据, 关闭窗口等;

  3. 那么, 疑问中的"命令"怎么理解?

    #1. 终端在输入某个命令并敲击回车后, Terminal软件(Mac中)会分析Shell语句中的命令, 并对OS生成一个中断, Terminal会向OS请求执行Shell语句中的命令(如Python解释器), 如果一切合规, 则OS会转而执行Shell语句中的命令(此时, 你无法使用Terminal, 不是吗?!), Terminal会将Shell语句中命令的输出(如果有的话)显示出来. 由此看来, 终端中的命令就是让系统调用相关程序(如果路径中(PATH)没有改命令对应的程序, 则报错).

    #2. 图形界面中的命令又是什么回事?! 其实, 和终端的情形一样/类似: 当你鼠标点击某个组件, 该窗口程序会依据点击发生的位置来判定发生了哪一种事件/中断(如浏览器tab的关闭按钮, 菜单栏的设置条目), 并向OS申请系统调用执行某种程序(如浏览器关闭tab(浏览器内部调用), 设置浏览器(开启设置窗口, 保存配置文件), 退出浏览器(系统终止浏览器程序(如chrom))). 简而言之, 图形界面根据事件发生的位置(触控屏的操作也类似)生成相应的系统中断和调用(或程序内部的调用), 不同的是根据响应的结果, 图形界面中的操作可能要重新绘制图形(如文字的生成, 浏览器tab的打开), 绘制图形的机制, 则是相应的窗口系统(如Unix的X Window).

行文至此, 图形用户界面的大致机理已经整理得差不多了: 不管是终端界面还是图形界面(它们都是OS下的软件), 最终都是: 软件生成中断 => OS或软件响应中断(打开新程序(系统调用), 保存数据(软件内执行, 不过数据保存还是通过系统调用的IO)). 这其中的区别, 则是表象上的表现形式以及随之而来的内容丰富性: 一个是"简陋的"单色文字界面, 另一个则是色彩丰富的图形图片.

相关参考/概念

计算机软硬件中的任意一个概念都不是游离的, 它都是这个强耦合体系中的其中一个耦合点, 在上述行文中, 我自认为有些概念是没有去扩展开的(注意篇幅及文章结构!), 我将它们罗列如下(包含索引), 以便将来的查阅和扩充: 1.X窗口系统[Ref], 2.视窗系统[Ref], 3.

Reference:
  1. 维基百科, 用户界面, Ref;
  2. 维基百科, 图形用户界面, Ref;
  3. 维基百科, 命令行界面, Ref;
  4. 维基百科, Unix, Ref;
  5. 维基百科, Unix Shell, Ref;
  6. 维基百科, MS-DOS, Ref;
  7. 维基百科, X显示管理器, Ref;


附录1 - 命令行界面

命令行界面, 真的, 与图形界面的区别不大: 它们都是OS中的一种软件(虽然人们常叫它们终端, 但是它们是软件终端, 而不是上个世纪70/80年代的实体终端机器了), 它们一个低配"简陋"了些, 另一个高配"丰富"了些, 但完全说它们区别不大也不够负责任(至少从理解者的角度来说): 图形界面多了不同的"中断/响应"来源, 比如鼠标, 比如触控板, 图形系统(如Unix上的X Window)将窗口中的事件响应到OS, 由OS进行相应的操作(如网络, 如保存), 这一点, 与命令行界面是相同的. 以下再一小叙命令行界面(Source: Wikipedia, Ref), 以消除陌生感, 并附图(图3)铁证命令行界面:

通常认为, 命令行界面(CLI)没有图形用户界面(GUI)那么方便用户操作。因为,命令行界面的软件通常需要用户记忆操作的命令,但是,由于其本身的特点,命令行界面要较图形用户界面节约计算机系统的资源。在熟记命令的前提下,使用命令行界面往往要较使用图形用户界面的操作速度要快。所以,在现在的图形用户界面的操作系统中,通常都保留着可选的命令行界面

虽然现在许多计算机系统都提供了图形化的操作方式,但是却都没有因而停止提供文字模式的命令行操作方式,相反的,许多系统反而更加强这部分的功能,例如Windows就不只加强了操作命令的功能和数量,也一直在改善Shell Programming的方式。而之所以要加强、改善,自然是因为不够好;操作系统的图形化操作方式对单一客户端计算机的操作,已经相当方便,但如果是一群客户端计算机,或者是24小时运作的服务器计算机及路由器交换器电信设备,图形化操作方式有时会力有未逮,所以需要不断增强命令行界面的脚本语言语言来提供丰富的控制与自动化的系统管理能力,例如Linux系统的Bash或是Windows系统的Windows PowerShell

03_Bash_screenshot.png
Fig.3, Bash CLI in Gentoo Linux, Source: Ref.


再引用维基中的内容, 说明/证实一下"命令行界面是OS中的一种软件", 常见的CLI程序:

它们都是勤劳的小蜜蜂, 踏实地将Shell命令(命令行语句)发送给系统(系统内核), 申请系统调用, 请求执行命令行中指定的程序(如: python, g++, javac), 再多说一句, 依次看来, 命令行软件像不像那种转包的包工头, 自己不执行命令, 而将命令"层层外包", 但命令行中则是转包给"OS/内核".

附录2 - 微软开源MS-DOS代码

在2014年, 微软开源了早期的MS-DOS代码[Ref], 我还记得更早之前看到比尔盖茨手拿软盘的照片(不过拿的应该不是MS-DOS的了), 不禁感觉到一个时代的意思, 在此附图两张(图4/5), 也算是致敬一下计算机和代码这种宇宙力量:

04_Bill_Gates_And_Floppy_Disk.jpg
Fig.4, Bill Gates With Floppy Disk, Ref.

05_MS_DOS_Products.png

Fig.5, MS_DOS_Products, Ref.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值