草庐IT

一文速览计算机的前世今生

移动Labs 2023-03-28 原文

Part 01

引言 

计算机发展史洋洋洒洒近80年,一篇短文想讲透是不现实的。但不必担心,作为普通用户,只需记住一个神奇年代,计算机发展史就能在你眼前脉络清晰起来,那便是——1970s初。

Part 02

俯瞰今生 

为什么是1970s初?因为如今我们所见的计算机,其赖以生存的各项技术,都在1970-1973这3年间呱呱坠地,不信且看——

➵ 1970年,英特尔,发布了第一款商用DRAM内存。电脑要是离了内存可玩不转。

➵ 1971年,英特尔,发布了第一款商用微处理器,即如今的CPU。有了它,电脑才能小巧玲珑。

➵ 1971年,贝尔实验室,研发出了Unix操作系统第一版。Unix是今天绝大多数操作系统的老祖宗,包括无处不在的Linux(含安卓)、苹果系统等等。计算机时间的“起点”(1970年1月1日0点),也是Unix定义的。

➵ 1972年,贝尔实验室,研发出了C语言。C语言可能是影响力最大的编程语言了,许多操作系统、编程语言都直接或间接基于C语言。

➵ 1973年,ARPA,设计了TCP/IP协议,它是互联网的基石。电影《流浪地球2》通过重启全球互联网拯救地球,背后依赖的正是TCP/IP协议簇。

➵ 1973年,IBM,发布了第一款现今结构的机械硬盘。

1973年,施乐公司,发明了第一款图形界面操作系统,实现了简单直观的人机交互,为计算机的普及奠定了重要基础。

总的来说,今天计算机最重要的几样东西,基本都在1970s初诞生。

你可能会想,哇塞,70年代初也太厉害了吧,竟然发生了这么多大事,那后来的岁月里,计算机都发展了什么?

后来的故事

70年代后期,个人电脑诞生,从此昂贵的计算机不再是政府、企业、高校的专属。

80年代,消费者的福音——图形界面操作系统开始商用流行,即苹果系统、Windows(用C/C++写的)。

90年代,程序员中广为流行的生产力工具诞生——Python和Java(用C/C++写的)。

90年代,数十亿人工作、生活所需的信息高速公路诞生——万维网(基于TCP/IP)。

21世纪:

00年代,智能手机操作系统的王者——Android、iOS诞生(间接源自Unix)。

10年代,移动互联网、云计算大火。

20年代,现有技术的集大成者——元宇宙,在2021年起飞。

对比而言,70年代初有如开挂,浓缩了太多开创性成果,而之后的岁月里,发展似乎相对乏善可陈,更多的是既有技术的优化升级。

譬如CPU,位数从最初的4位,一路“奔腾”到如今主流的64位,性能也巨幅提升。

譬如DRAM内存,诞生之初叫DRAM(动态随机存取存储器,简称动态内存);后来一路升级,不断叠加前缀,如今叫LPDDR5 SDRAM(第5代低功耗双倍数据率的同步动态内存)

图1 内存名称释义

如果把1970后的计算机看作“今生”,那它的“前世”又在干嘛呢?难道在1970s前,就没有如今的这些硬件、软件系统吗?

要知道,人类首次登月是1969年,70年代初的那些技术都还没问世,那登月所依赖的系统是什么模样?

Part 03

回眸前世 

一般认为计算机诞生于1946年,那么直到1970年,计算机的发展都经历了什么?这里用“三化”来概括:

  • 硬件小型化
  • 操作系统人性化
  • 编程语言高级化

硬件小型化

最初计算机的电路用的是电子管,整体足有2个房间大。难以想象前人为了掌控这庞然巨兽需要付出多么艰苦卓绝的努力。

幸运的是,50年代有了晶体管和集成电路技术,让CPU和内存先后开始小型化,从而逐渐实现整机的小型化。进化路线为:巨->大->中->小型机,至于微型机(微机),则到70年代才出现。

集成电路使芯片小型化的同时性能飞升,进而支撑起丰富的上层应用。而集成电路的关键工艺在光刻技术,所以为什么说先进光刻机会卡脖子,因为它在产业链上游,一旦掐断,下游可不就巧妇难为无米之炊了。

操作系统人性化

如今的电脑似乎有三头六臂,同时放歌、下视频、聊微信,不费吹灰之力。

然而早期的计算机却相当“专心”,一个任务做完了再做下一个。当时计算机稀缺、速度还慢,几十号人只能排队轮流使用。

五、六十年代出现的“批处理”、“分时”操作系统则改善了这种糟糕的用户体验。

分时的精髓在于,各任务在微观上是轮流执行,宏观上却表现为并行,而用户基本察觉不出来这种假象。这个人性化的设计可算是解决了用户的痛点,当然,这种操作离不开CPU性能的提升。

编程语言高级化(自动化)

Python这些年一直很火,原因之一是简单而强大,即使非专业人员也能用Python实现办公自动化,从重复劳动中解放出来。而这,需要感谢当年编程语言的高级化。

我们知道计算机底层是0和1,最初人类直接用0和1组成的机器语言,读或写都很吃力,更别说出错后的排查了。

后来有了相对易读的汇编语言,但效率还是相对低下。

1957年,第一款高级语言Fortran推出,实现自动编程。

从此,人只用写简单的表意文字,计算机就能自行翻译为机器语言;此外,用简单符号就能代指复杂功能,实现四两拨千斤的效果,可以说大大解放了人力。

表1列举了计算机早期各技术的重点发展,有兴趣的可参考。

表1 计算机早期发展重点列举

Part 04

 照向未来 

了解计算机发展史有何意义呢?

一方面,千变万变,底层不变。

算力网络、智慧家庭、元宇宙,是近年来较热门的事物,它们较大程度上是基于现有技术进行整合创新,如云计算、物联网等等,而这二者归根结底是CPU、内存、操作系统、网络等等在强力支撑。了解根源,透过现象看本质,面对千变万化的新事物才能更从容不迫。

比如算力网络不是凭空冒出来的,它勾勒的愿景(让算力成为像水电一样的基础设施,即取即用),早在1960年代分时操作系统出现后,就有了类似的设想与大规模实践,只是由于时代的局限未能长存。

(基于这些硬件软件构筑的计算机体系,究竟有多璀璨夺目、高效神速,可参考移动Labs公众号的这篇《揭秘:千里送信为何能瞬时到达》

另一方面,以史为镜,可知兴替。

随着国际形势的变化,推进芯片、操作系统等关键技术国产化的紧迫性剧增,毕竟底层为基,如果底层技术抽走,那上层建筑再绚丽宏伟也会轰然倒塌。

在国产化进程中,我们某种程度上将重走计算机生态的发展历程,以史为鉴,可以少走弯路。

当然,本文只是抛砖引玉,尝试拨开消费者眼中计算机上笼罩的迷雾,以一窥全貌。更多史料,可见文末参考资料。

Part 05

结语 

话说回来,1970s初,真的有那么重要吗?

实际上更重要的是集成电路,分时系统,高级语言等,这些诞生于五六十年代的技术,为后来的发展奠定了基础。70年代初的成果爆发与其说是迸发的巧合,不如说更像是水到渠成的必然。

但这并不妨碍我们将1970s看作一个重要的里程碑节点,毕竟我们消费者最熟悉的就是手头的电脑(微机),它不凡的身世,就得1970s这个神奇的分水岭讲起:

在1970s初的3年里,如今电脑最重要的硬件软件纷纷登上历史舞台;

往后的“今生今世”,大致是基于这些成果的不断升级创新。

往前的“史前文明”,大致是三化:硬件小型化(集成电路)、操作系统人性化(分时)、编程语言高级化(自动化)。

彩蛋

前面提到的1970s初那些技术,皆由美国创造,想必当时美国是盛极一时吧?

恰恰相反,当时美国的日子并不好过。

上世纪70年代的美国,经济上终结了二战以来的高速增长,进入停滞阶段;政治上处于冷战时期的“苏攻美守”阶段,美国面临很大压力。后来长期称霸CPU的英特尔,当时也曾陷入绝境,在1975年甚至要考虑卖掉自己。

可危机时常是危与机并存不是吗?

美国担心苏联核武轰炸导致自己的指挥系统瘫痪,所以研发了“阿帕网”(1969),互联网由此发端。

70年代初各成果固然诞生,但还不成气候,直到90年代才迎来互联网经济大繁荣。而这一繁荣的技术底座,早在70年代就已埋下伏笔。

国内正处制裁危机,但也因此大力推进关键技术国产化,产业体系将迎来一次自底向上的涅槃重生。

2020s初的此时时刻,或许正如1970s初的彼时彼刻。相信今天夹缝生存的不屈成长,终会在不远的未来,结出累累硕果。

有关一文速览计算机的前世今生的更多相关文章

  1. ruby-on-rails - 使用一系列等级计算字母等级 - 2

    这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,

  2. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  3. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  4. ruby - 使用 Ruby,计算 n x m 数组的每一列中有多少个 true 的简单方法是什么? - 2

    给定一个nxmbool数组:[[true,true,false],[false,true,true],[false,true,true]]有什么简单的方法可以返回“该列中有多少个true?”结果应该是[1,3,2] 最佳答案 使用转置得到一个数组,其中每个子数组代表一列,然后将每一列映射到其中的true数:arr.transpose.map{|subarr|subarr.count(true)}这是一个带有inject的版本,应该在1.8.6上运行,没有任何依赖:arr.transpose.map{|subarr|subarr.in

  5. arrays - 计算数组中的匹配元素 - 2

    给定两个大小相等的数组,如何找到不考虑位置的匹配元素的数量?例如:[0,0,5]和[0,5,5]将返回2的匹配项,因为有一个0和一个5共同;[1,0,0,3]和[0,0,1,4]将返回3的匹配项,因为0有两场,1有一场;[1,2,2,3]和[1,2,3,4]将返回3的匹配项。我尝试了很多想法,但它们都变得相当粗糙和令人费解。我猜想有一些不错的Ruby习惯用法,或者可能是一个正则表达式,可以很好地回答这个解决方案。 最佳答案 您可以使用count完成它:a.count{|e|index=b.index(e)andb.delete_at

  6. ruby-on-rails - 如何计算 Ruby/Rails 中 JSON 对象的数量 - 2

    Ruby中如何“一般地”计算以下格式(有根、无根)的JSON对象的数量?一般来说,我的意思是元素可能不同(例如“标题”被称为其他东西)。没有根:{[{"title":"Post1","body":"Hello!"},{"title":"Post2","body":"Goodbye!"}]}根包裹:{"posts":[{"title":"Post1","body":"Hello!"},{"title":"Post2","body":"Goodbye!"}]} 最佳答案 首先,withoutroot代码不是有效的json格式。它将没有包

  7. ruby - 如何计算自 Ruby 中给定日期以来的周数? - 2

    目标我正在尝试计算自给定日期以来周的距离,而无需跳过任何步骤。我更喜欢用普通的Ruby来做,但ActiveSupport无疑是一个可以接受的选择。我的代码我写了以下内容,这似乎可行,但对我来说似乎还有很长的路要走。require'date'DAYS_IN_WEEK=7.0defweeks_sincedate_stringdate=Date.parsedate_stringdays=Date.today-dateweeks=days/DAYS_IN_WEEKweeks.round2endweeks_since'2015-06-15'#=>32.57ActiveSupport的#weeks

  8. 最新版人脸识别小程序 图片识别 生成二维码签到 地图上选点进行位置签到 计算签到距离 课程会议活动打卡日常考勤 上课签到打卡考勤口令签到 - 2

    技术选型1,前端小程序原生MINA框架cssJavaScriptWxml2,管理后台云开发Cms内容管理系统web网页3,数据后台小程序云开发云函数云开发数据库(基于MongoDB)云存储4,人脸识别算法基于百度智能云实现人脸识别一,用户端效果图预览老规矩我们先来看效果图,如果效果图符合你的需求,就继续往下看,如果不符合你的需求,可以跳过。1-1,登录注册页可以看到登录页有注册入口,注册页如下我们的注册,需要管理员审核,审核通过后才可以正常登录使用小程序1-2,个人中心页登录成功以后,我们会进入个人中心页我们在个人中心页可以注册人脸,因为我们做人脸识别签到,需要先注册人脸才可以进行人脸比对,进

  9. ruby - 如何计算两个字符串共有的字符数? - 2

    如何计算两个字符串之间的字符交集?例如(假设我们有一个名为String.intersection的方法):"abc".intersection("ab")=2"hello".intersection("hallo")=4好的,男孩女孩们,感谢你们的大量反馈。更多示例:"aaa".intersection("a")=1"foo".intersection("bar")=0"abc".intersection("bc")=2"abc".intersection("ac")=2"abba".intersection("aa")=2一些补充说明:维基百科定义intersection如下:Int

  10. python - 如何计算文件中唯一字符的数量? - 2

    给定一个包含各种语言字符的UTF-8文件,我如何计算它包含的唯一字符的数量,同时排除选定数量的符号(例如:“!”、“@”、"#",".")从这个算起? 最佳答案 这是一个bash解决方案。:)bash$perl-CSD-ne'BEGIN{$s{$_}++forsplit//,q(!@#.)}$s{$_}++||$c++forsplit//;END{print"$c\n"}'*.utf8 关于python-如何计算文件中唯一字符的数量?,我们在StackOverflow上找到一个类似的问题

随机推荐