在2019年底之前不久,我偶然发现了" Modern Operating Systems"的摘录。由著名计算机科学教授,MINIX操作系统的原始作者Andrew S. Tanenbaum撰写。
他在书中写道," [MULTICS]旨在仅在一台计算机上比Intel 386(...)强大一些,以支持数百名用户。这在当时并不像听起来那样疯狂。人们知道如何编写小型,高效的程序,但后来又完全丧失了这项技能。"
从那以后,这句话一直在我脑海中震撼。有点开玩笑,但情绪很明显。这不是我第一次听到这样的消息,而Tanenbaum并不是第一个也不是最后一个提出这样的主张的人-我本人一定对在某个时候说类似的话感到内gui时间。尽管如此,它仍然困扰着我,因为它实际上是不正确的,并且非常侮辱许多年轻的程序员。
在Tanenbaum的辩护中,我了解他来自何方。这是一个容易犯的错误,在我们脾气暴躁的旧gits中很常见。看着以GB为单位的现代软件消耗的内存和磁盘空间,很容易让人想起在640甚至64 KB的RAM对每个人都足够的情况下更简单的时间。
这也是一个非常普遍的误解。这种情绪同样适用于编程以外的交易,并且可能以一定的规律性出现在各地。任何随着时间而发展的手工艺品,无论是软件开发,烹饪,裁缝,捕鱼还是砌筑,都会有一群长辈嘲笑新的捷径和技术进步。如此现代的愚蠢行为被认为是一种污蔑做工固有灵魂并降低其价值的东西。在进行此类陈述时,很少考虑必须掌握新技能才能掌握这项新技术的事实。
我当然不会仅仅为了进步而提倡进步。这样做常常会导致改变和改进这两个截然不同的概念混淆,只有在经验证明这一区别之后,这种区别才对某些人感到遗憾。拥有一点历史知识也总是一件好事,如果没有别的,那是因为谦虚地了解我们所站的巨人。
然而,对具有更多存储器的更快计算机的需求是对实际改进的需求。这意味着我们不仅可以用我们的机器做更多的事情,而且还能做几十年前似乎不可能的新事物。这很重要,因为这是我推理的核心。
今天,计算机无处不在。不仅用作家庭和办公室中的笔记本电脑或台式机,还用作平板电脑,智能手机,手表和娱乐中心。实际上,如今除了食物以外,几乎所有其他东西都可以用某种计算机化形式购买:吸尘器,灯泡,镜子,书本,汽车甚至门铃。我们处于一个可以让计算机以日常用语与它们交谈并被合理理解的水平。
在MULTICS概念性构思之初,一台计算机毫无疑问是一台巨大的大型机器,可以轻松地占据一个大房间。具有386芯片性能的芯片是真正的顶级产品。实际上,它是如此先进且昂贵,以至于MULTICS本身就被指控为资源浪费者,这就是它从未变得非常流行的原因之一。
简而言之,用来获得像这样的古老大型机来执行计算的方法非常粗糙。复杂的程序代码必须用笨拙的语言(例如FORTRAN)编写,存储在大量打孔的纸卡上,然后机械地读入计算机的小而昂贵的内存中。如果很幸运,并且程序没有错误运行,您所能做的就是等待。在过去的几十年中,即使是外行人使用电子表格程序眨眼就能解决的相对简单的任务,在准备好计算机并加载程序后,也可能需要几分钟甚至几小时才能完成。课程。
这并不意味着电子表格程序的外行是熟练的程序员,但这也不意味着今天没有熟练的程序员。这只是一个例子,说明增加的程序复杂性也会增加计算机的实用性和可用性。为了使外行在不了解FORTRAN和打卡的情况下执行此类任务,这种复杂性是必需的。反过来,这增加了软件的总体占用空间。
MULTICS及其(也许在更大程度上)其更成功的衍生产品UNIX,无疑是软件工程的奇迹。他们确实为要运行的许多通用应用程序提供了多用户,多任务环境,并且这样做的硬件非常有限。同时,在用鼠标和GUI游走了几个小时之后,这些系统没有什么让别人抓紧的。一切都是基于您必须认真学习的密码命令,并由您也必须认真学习的密码参数控制。
一旦获悉,这些命令便可以用于启动程序。并不是您真的知道它是否还在运行,因为大多数程序对计算机输出没有显着影响。通常,它们只是在电传打字机上显示黑屏或空白行,并且与启动它们的命令一样神秘。即使是用于执行简单算术的程序,也可能会使初次使用的用户感到困惑,他们肯定会想要编写" 1 + 2"。并按Enter键获得结果,但可能必须了解堆栈和RPN并输入" 1 2 + p"进行基本的整数加法。
RPN(反向波兰表示法)是一项伟大的发明,因为它在内存非常昂贵的时候减少了内存使用,而这恰恰是“小型高效”的一种。 Tanenbaum代码声称这是一门失传的艺术。这也是一个很好的例子,说明了为什么较小的程序和效率较低的编程可能会给最终用户带来更愉快的体验,因此最终用户可以将更多的精力放在手头的实际问题上,而不是像如何使用计算机来思考来解决问题。今天,我们期望即使是最便宜的手机,也都带有类似于袖珍计算器的程序来执行此类计算,与几门小学数学课相比,所需的必备知识很少。
在MULTICS时代,使用计算机意味着要处理粗略而复杂的用户界面,执行时间长且结果通常以打印在纸上的简单文本呈现。该代码小巧而有效,因为这些机器无法为程序员提供其他选择,但是该代码(尽管如此出色)导致原始的,耗时的并且常常使用户体验沮丧。这是用户期望的,即使这意味着要学习RPN进行计算,并至少要使用一种复杂的声明式编程语法来格式化最简单的文档。
今天,我们将图形界面用于大多数事情。一旦您学会了如何操作命令行,仍然会有像我这样的人享受命令行所提供的强大功能和灵活性。对于其他用户,例如初学者用户或仅将其计算机视为任何其他家用电器的绝大多数人,GUI的效率要高得多。无需像CPU那样思考,就可以记住繁琐的命令并将复杂的数据结构(如目录树)和概念(如逻辑运算符)放在脑海中。
GUI需要付出一定的代价:这些易于使用的界面增加了程序代码的复杂性,需要更多的内存和更快的处理器。即使是早期的图形界面也需要强大的功能,尽管现代用户可以立即识别出它们,但是它们既缺乏速度,技巧又缺乏诸如色彩之类的奢侈品。结束今天的旅程,这是一段漫长而曲折的旅程。
表面上看起来像文本渲染一样简单。当计算机从DIP开关面板和闪烁指示灯移至通过电传打字机接口时,这是可用性上的一大进步:可以输入纯文本命令并产生纯文本结果。当然,全都是7位ASCII(或等效值),不占用太多空间,也不需要大量的计算资源。电传打字机决定了大多数编写的软件应能够处理哪些字符,从而使程序小巧高效。
向前推进,电传打字机被CRT终端所取代。最初,他们只是模仿其机械的前身,但是利用屏幕固定宽度和高度以及更快的刷新率的软件很快就出现了。例如,全屏编辑器是最终用户的升级版,通过始终在屏幕上显示周围的行,向他们提供有关当前正在编辑的行的上下文信息。
当然,制造商希望将其计算机和终端出售给英语以外的市场,这使7位字符的空间有点拥挤。添加额外的信息使字符数量增加了一倍,实际上,这确实开拓了中欧市场。今天,像变音符号,抑扬音和重音符号是理所当然的,但是要处理它们,我们不得不增加内存和带宽的使用率。
诸如普通话和日语之类的亚洲语言对整个单词使用复杂的符号,以及诸如波斯语和他加禄语之类的大量其他字母,最终导致了Unicode和UTF的产生,其中单个字符现在可能占据许多字符。 7位ASCII字符之一的空格。这增加了编写用于处理简单文本文件的工具的复杂性。这也增加了显示此类文本的复杂性。在规定7位ASCII时,终端在硬件中嵌入了固定字体,没有其他选择。如果幸运的话,它可以以某种方式显示粗体文本,但除此之外,所有字符始终看起来相同,并且视觉尺寸相同。
所谓的位图显示的普及使Unicode成为可能,其中在屏幕上的单个位置不是由整个字符表示,而是由一个小点-像素表示。这增加了字符形状和位置的自由度,但增加了复杂性。例如,今天要显示简单的文本模式,例如Linux上的终端窗口或Windows上的PowerShell提示符,软件必须将电传打字终端的规则转换为适合位图显示的内容。这需要计算开销,但是允许用户在这样的老式界面和现代Web浏览器之间快速切换,而不必在不同的硬件显示模式之间切换。
早期的位图显示当然比基于字符的显示大了很多,但是它们仍然很有限。可用的字体带有预设的尺寸,每种字体都对应于屏幕上一定数量的像素。由于此类字体的存储格式是基于像素的,因此可以在基于像素的显示器上快速,轻松地渲染此类字体。问题在于,使用预设大小以外的大小是不可能的,或者会导致难看的缩放问题,并且在纸张上打印基于像素的字体不可避免地会导致块状,块状输出。对于高中作业来说,这可能是可以接受的,但是对于专业出版市场来说,这几乎是可以接受的,自从大约一千年前可移动字体的发明以来,就一直期望获得流畅,清晰的文本呈现。
通过使用字体(不是基于像素,而是基于每个字形的数学表示)来解决此问题,该字体描述了端点以及在它们之间绘制不同粗细的曲线和线条的说明。当然,它们仍必须在位图显示上数学地转换为像素,这导致内存和CPU使用率增加。
为了使计算机屏幕上的文本看起来更加清晰和平滑,最明显的方法是增加其像素密度。如今,消费市场提供的显示器具有800万像素,是第一款家用计算机位图显示器的60到120倍。为了进一步提高屏幕的可读性并减少眼睛疲劳,采用了各种平滑技术。一种是巧妙地利用现代纯平屏幕的特性,在字形的轮廓周围产生中间颜色值,从而消除了前景和背景之间的尖锐边缘。这就是所谓的亚像素平滑,我们希望它能在我们今天购买的几乎所有系统中都存在,从手表到平板电脑和笔记本电脑。甚至在咖啡机的小触摸屏控制面板上都具有这种字体平滑处理功能。
所有这些都是对文本呈现的巨大改进,但是当然,它增加了编写用于显示文本的程序代码的复杂性。可能不认为这种复杂性是“小而有效”。与电传打字机模拟器上的7位ASCII相比,今天的普通计算机用户几乎不会认为它是不必要的膨胀,并且如果突然删除它可能会大声抱怨。
与早期改进相比,无数种此类改进意味着与今天相比,如今小型且高效的计算机的使用是一种非常令人愉快的体验。经过多年的思考和不断增加的代码复杂性,与那些对运行MULTICS之类的早期原始机器感兴趣的人相比,可以使更多的人接触到这种东西。
从生产可用软件的意义上讲,编程本身也变得更加容易。大量的工作已经完成并预先打包到库中,准备导入并供那些想解决某个问题的人使用,而不必一遍又一遍地编写相同的代码-甚至,甚至知道该怎么做它。因此,完成某件事所需的计算机内部运作知识较少。在某些情况下,这当然会导致代码不是最佳代码,这本身并不是什么新鲜事物。总是有好坏的程序员编写好坏的代码。即使在MULTICS时代,也有关于如何编写良好代码的文章,并且还考虑了规则以消除不良的编程习惯。
如今,比以往任何时候都有更多的程序员,这当然意味着比以前有更多的坏人-但也有很多好人。就像以前一样,优秀的程序员知道如何编写小型高效的代码。我什至会争辩说,今天写好的代码(至少从Tanenbaum的小巧而高效的意义上来说)比以前更加困难,因为早期的计算机是如此简单,以至于开发人员可以轻松地持有地图。整个系统在他们脑海中浮现,例如,帮助他们节省内存使用量。
计算机的日益复杂性以及我们对计算机的期望,再加上新的软件交付平台,不仅需要对计算机有基本的了解,而且还需要许多其他特定领域的知识。为网络编写好的代码不仅意味着要了解算法,大的O表示法和内存使用情况,而且还要了解面向对象和功能的编程范例,SQL数据库,高级的排版和布局概念,与异步代码执行和数据加载有关的问题,各种网络和传输协议,与访问敏感数据的公共可用多用户系统有关的安全性问题等等。出于几个原因,一个开发人员花费数周的时间来抛光用于文本文件的小型批处理程序,直到几行C的日子已经过去了-出于多种原因-但这并不意味着他们仍然不知道如何去做吧。
周围有许多程序员可以完成所有这些甚至更多工作。比1960年代后期的MULTICS和甚至1987年的Tanenbaum自己的MINIX系统年轻得多的人们,都在用JavaScript编写超小型射线追踪器,原始Game Boy的音乐音序器,PIC处理器组件以及甚至是用于Commodore 64(1982年以来的家用计算机)的多任务操作系统。在世界范围内,有多次重复的竞赛,目的是编写最精美的非交互式图形和音频程序,其.exe大小限制为一千字节。
这些人中的一些人为了盈利而创建了这样的小程序,其他人则是为了娱乐而做。声称他们不具备编写小型高效代码的知识,不仅是谎言,而且对他们的才智,技能和努力也产生了深深的贬低。在Tanenbaum的帐户上,也许是轻描淡写的嘲讽,但它仍然是很多人重复的事情,其中许多人应该更了解。
以前的情况好些了吗?事情变得更糟了吗?我的旧版Amiga 1200是一个小巧而高效的奇迹,它配备了2 MB的RAM和120 MB的硬盘驱动器空间,而且似乎总是用光了两者。我可以同时运行图形包和编程环境,几乎可以在其中做一些有价值的事情。如果我想连接到Internet(并进行一些基于文本的操作:图形浏览是不可能的),则必须关闭这些程序,因为TCP / IP堆栈仅需要太多内存。直到我将Amiga的内存增加了三倍(顺便说一句,它的速度也提高了),我才真正开始享受OS的多任务功能。这样做的成本超过了计算机本身价格的一半。
纯粹从绝对程序大小的增长来看,肯定看起来不成比例。幸运的是,比例已经改变。我的家用电脑,一台便宜的笔记本电脑,价格大约与Amiga差不多。请注意,未经通货膨胀因素调整-除了四分之一世纪以后,货币都是相同的。作为笔记本电脑,高分辨率,高品质的屏幕已包含在该价格中,这是我必须增加Amiga成本的原因。这台计算机具有256 GB的SSD磁盘,其中约5%用于完整的系统安装(包括多个浏览器,编程语言,办公类型的软件以及图形和音乐包)以及我的个人文件。我有8 GB的内存,在观看高分辨率视频,浏览Web和编辑代码时,我通常不会同时使用其中的25%以上的内存,而同时又没有延迟。
MINIX是Tanenbaum自己的创造力,也是一个用于教育目的的操作系统,它的开始是发行在几个软盘上的东西。最新版本对现代标准的硬件要求仍然不高,但是它占用的存储空间要大数百倍,并且在初次发行时就需要与相当大小的硬盘相当的RAM数量。尽管它的资源利用率仍然可以被认为是令人印象深刻的,但是它缺乏我们今天期望的许多基本功能。是否想在您的计算机上使用便宜的鼠标,例如今天商店中出售的10美元型号?在这种情况下,我不推荐MINIX-它不支持USB。
当然,周围有坏软件。 在某些情况下,“"膨胀”的指控 和"废物" 是绝对有效的。 毫无疑问,有糟糕的程序员在生产它。 但是很多东西很容易被嘲笑为" bloat" 或"效率低下" 在许多情况下,这仅仅是增加复杂性的自然结果,以满足对实用性和可用性的更高期望。 的确,我们不需要亚像素平滑就可以撰写论文,但是对于那些每天花几个小时盯着屏幕上的文本的人来说,这是一个很棒的功能。 对于现实世界的应用程序编程,在大多数情况下,增加的资源消耗对编写软件的人和使用软件的人都有利。 回到“小而高效”的时代 过去的一年不可避免地意味着删除我们现在要购买的东西 ......