发明那么多编程语言到底是为了什么啊?

虎嗅网  •  扫码分享
我是创始人李岩:很抱歉!给自己产品做个广告,点击进来看看。  

本文来自微信公众号: 阿朱说 (ID:azhushuo) ,作者:吕建伟,头图来自:pixabay


一、计算机的前世


法国大革命后,需要进行土地重新丈量以便确定新的税收政策,因此有了巴贝奇差分机的发明动机。


美国是小政府,一开始能征的税种很少。美国因为南北战争打完,政府欠了一屁股国债,靠税收是很难维持政府运行的,必须对更多的人征收更多的税。所以开始新一轮的人口普查和经济普查,用到了IBM的打孔计算卡和打孔自动计算设备。


这都是计算机的前身。发明的动机都是为了税。


另外,有线电报——跨大西洋海底电信电缆、马可尼无线电报,这在欧美大陆之间早已经成熟。这比计算机的出现早的多。


另外,打字机:打印墨盒、打印纸、打字机键盘,也早已经成熟,这也比计算机出现早的多。


不过显示屏幕 (电视机) 出现的时间比较晚,黑白电视机也是在1950年以后才在美国大众家庭开始普及 (苹果公司发明的apple I 就是不带显示器,需要你用外接电视机做显示屏幕,就如同咱们小时候玩的小霸王学习机一样)


二、计算机编程语言出现


计算机程序一开始真是生用二进制01写的。不过大家都不奇怪这事。因为IBM的打孔计算卡和打孔自动计算设备,大家过去就在用。所以打字机改进成为打孔卡机,计算机读入打孔卡—识别打孔卡—自动计算,然后通过驱动打字机—打印纸,把结果输入到打印纸上。这是一个很自然的过程。


然后就出现了汇编语言,不用人不容易理解的01,有了人能看懂的短指令。 但是汇编语言的设计思想本质上就是: 用软件来模拟计算机硬件 。所以汇编语言的指令,和计算机的工作原理思路一样。


三、大型主机时代


1. 研究计算用途


计算机一开始在高校—研究所—军队使用,计算的用途较多。所以IBM的工程师在1957年发明了第一个高级编程语言Fortran,主要目的就是让计算编程变得简单。当然,当时的编程输入还是打孔输入,只不过你是把Fortran的代码,通过打孔机输入进去,打孔机会自动把你输入的代码转化成打孔卡片上的孔。就是IBM发明的这个打孔编码方法 (人称何乐礼编码方式)


2. 商业处理用途


计算机后来从高校-研究所扩散到了工商业界。


IBM用计算机开始为美国航空公司编写订票系统SABRE。


安达信也用计算机为它的大客户通用电气编写人力薪资税金计算系统。


所以1959年,用于商业处理的编程语言COBOL发明了。


3. 教学用途


由于计算机开始被高校—研究所、军队—工商业广泛使用。所以计算机人才的需求开始大增。


高校教授们为了教学,于是BASIC、Pascal编程语言都出现了。


BASIC以简单著称,Pascal以结构严谨著称。这都是60年代的事情了。


四、小型机时代


Fortran和COBOL都是应用级编程语言,但是过去写系统级软件,如操作系统,还是使用汇编语言。


到了70年代,1974年,贝尔实验室的研究员开始开发Unix操作系统,但是因为Unix研究员是借专利部门的DEC PDP小型机在偷偷摸摸干活,生怕哪一天被人发现不让用了,所以他一直想解决个问题,一旦不让用了,怎么能把现有写的代码在另外的机器上赶快运行起来继续工作。但是他当时面临的环境是:写操作系统这种系统级软件,没有更好的编程语言,只有汇编,但汇编的移植性并不高 (我上述就说了,汇编其实本质相当于软件模拟硬件) 。真是运气好,瞌睡来了枕头, 贝尔实验室的另一个研究员发明了C语言 ,它比汇编语言要高级,但比Fortran和COBOL要低级。


本来小型机是DEC首提的,但是DEC搞小型机的操作系统却还是用汇编语言编写的,所以移植性并不高。而C语言比汇编高 (所以移植性高) ,比Fortran这些应用级语言低,恰好写系统软件。


五、工作站时代


1972年,施乐实验室的工程师为了发明图形窗口界面操作系统而发明了世界上第一个面向对象编程语言SmallTalk。你想啊,这是一个很自然的映射,窗口里的菜单、按钮、输入框,这是典型的以对象的形式存在的啊,如果你用像素、线条的层次去看,那就复杂到姥姥家了。 所以乔布斯后来做NextStep图形工作站就发明了Ojb-C编程语言 (面向对象的C) ,而微软搞Windows就直接用了C++。 这一切都是因为他们两个人都是从施乐图形窗口界面操作系统中偷学来的。哈哈哈哈,现在你们也都知道为啥大家写图形游戏软件也大量使用C++编程语言了吧。


而1980年发明的C++,就是借鉴了SmallTalk。我过去写过一篇文章,里面还提到GNU,他们研发了最著名的Unix上的GUI-Gnome,为了编写Gnome,他们研发了自己的全套工具链:Emacs编辑器、C++编译器和调试器—类库—实用工具。


六、个人电脑时代


1980年,个人电脑上流行了一种综合软件:Dbase,后来还衍生出Foxbase/Foxpro,甚至还影响了Access。为啥说它综合呢,因为它杂合了数据库存储、数据库查询引擎、编程语言、UI界面引擎四大部分。为啥会产生这么奇怪的四不像软件呢?嗯,就是为了满足个人在个人电脑上管理和处理个人数据的,怎么简便怎么来。


但是后来微软模仿VisiCalc、Lotus 1-2-3,发明了Excel,Excel也几乎是这四大部分 (Excel中有VBA,Visual Basic for Applications) ,而且比xBase更简单。这个渊源也造成了每一个时代会有产生一个类似xDbase的所谓低代码开发的潮流,但每个时代都被Excel干灭。魔高一尺道高一丈。


七、局域网时代


1980年,3COM公司成立,并且与IBM当时推兼容个人计算机工业开放标准一拍即合,为计算机加入以太局域网卡。3COM就是以太局域网技术的发明公司。局域网时代开启。


1980年还有一个编程语言正式出现,那就是SQL。本来它在1974年就出来了,只是在1980年才正式改名为SQL。这就是为数据库存取而专门设计的编程语言。于是,业务逻辑编程和数据库存取编程,分道扬镳成为两个。


后来,局域网流行了,单机应用被分离成客户端—数据库端两个。第一个支持C/S模式的数据库公司Sybase发明了PowerBuilder这个编程工具,里面有个PScript编程语言,这样就把编程语言和UI界面引擎,与Sybase数据库查询引擎和存储做个彻底切割。


1990年代,随着图形UI界面、C/S结构的产生,也营运而生了三大快速编程工具:PowerBuilder (新PScript) 、Visual BASIC (源自老BASIC) 、Delphi (源自老Pascal)


八、Web时代


到了90年代,1995年,互联网在大众市场火了。本来1969年互联网就产生了。70年代互联网主要被高校-研究所使用,主要干软件的FTP。这些学生毕业后就把互联网的习惯带进了工商业,80年代互联网扩散到了工商业,主要用来发电子邮件。到了90年代发明了HTML编程语言和HTML浏览器,互联网才在大众市场爆发。


所以,90年代,随着互联网的爆发,出现了一系列的Web编程语言:PHP、Perl、Python……


不过这些语言都是在服务器端编程。 毕竟Web B/S不像局域网C/S,C/S是一门编程语言既可以写界面又可以写逻辑,再加上一门SQL编程语言就可以存取数据库。而Web,由于浏览器的功能限制、HTML编程语言功能限制,想让一门编程语言既可以写Web界面又可以写业务逻辑,这就难了。所以在Web浏览器端出现了专门的用于控制Web界面并可以写点少量逻辑的编程语言:JavaScript。


但是Java进展速度更快,在1999快速建立了三大标准:J2ME、J2SE、J2EE。全能啊,一举把只擅长Web编程的PHP、Perl、Python干灭了。


Java算是一个无心插柳柳成荫的东西,我过去就写过。Java编程语言使用中间字节码 (不是二进制机器码) 、使用虚拟机的方式,一开始是为了应对种类繁多的日本家电的。后来J2EE模仿微软的COM/DCOM/COM+发明了EJB,组件的创建和销毁不需要由程序员控制了,而是由虚拟机内存回收和组件容器互相配合来达成了。这就比微软的编程语言、组件技术更胜一筹。


过去没有容器,内存的管理,对于大部分程序员来说都太难了。所以会拖累操作系统变慢、不稳定蓝屏。其实这不是操作系统的罪,但是让操作系统背锅。用户又不知道这里面的弯弯绕,反正他看到的就是电脑很慢、电脑死机,就把罪归集到微软头上。这问题让微软头疼死了。


所以盖茨在1999年自命为首席架构师,推动.NET战略,模仿Java编程语言、Java虚拟机、组件技术、组件容器,发明了:C#编程语言、.Net虚拟机、.Net组件、.Net组件容器。因为.Net是2001年才推出,比J2EE晚了好几年,所以.Net结合WebService更加简化和自然 (WebService标准是2000年由W3C确定的)


从此这两大应用级语言,借助互联网之风,横霸了2000年代。


其实到了2010年代初,也就是在2010-2012期间,还发生了三个事。


一个是谷歌在2010年推出了Dart编程语言,它类似JavaScript,它也是可以运行在浏览器里面的,但是它是静态编译-严格检查的,它比JavaScript更适合编写大规模的Web端的代码。


谷歌出了Dart,微软也不甘示弱。微软也出了一个和Dart竞争的编程语言,这就是2012年发布的TypeScript编程语言。


还有一个事是:在过去,JavaScript运行在Web浏览器端,其他如Java、C#、PHP等等都运行在服务器端。编写一个应用,开发人员最少得掌握两门编程语言。所以有人在想,能不能让JavaScript运行在服务器端,这不就一个程序员只需要掌握一门编程语言就可以写一个完整应用了么?所以,Node出现了,这是一个在服务器端可以运行JavaScript的引擎,脱胎于谷歌的Chrome浏览器里的V8 JavaScript解释引擎。


不过,由于Web互联网已经远去,2010年代是移动互联网当红炸子鸡,所以虽然Web互联网还有很多遗憾问题没有解决,但是,对不起,过去搞不定的,未来也不需要了。


所以这三个编程语言的发明,目前还都默默无闻没有引爆。


九、移动时代


2007年,iPhone发布。2008年,Android发布。2008年,苹果公司还发布了应用商店。


iPhone的操作系统源自乔布斯过去投资的NextStep公司,所以使用Obj-c编程语言。而Android的前身是想搞个智能相机的操作系统,就如同Java在1990年想干的事,所以Android也很自然选择了Java作为编程语言。这都是90年代遗留的东西被带到了2010年代。


所以,在2016年,苹果公司又发明了更擅长移动软件开发的Swift编程语言。2017年,安卓也宣布Kotlin为安卓第一优先的编程语言。


苹果公司为了防止重蹈微软当年的诟病,不让烂程序员写的烂软件来影响操作系统,所以严格管控应用商店。不像过去微软操作系统,用户随便下载个软件就可以安装。


十、云计算时代


2009年其实还有一门编程语言诞生,那就是:Golang。


2006年,亚马逊就发布了AWS云计算。


虽然Java擅长写服务器端应用软件,而且J2EE也力推分布式远程调用中间件、分布式消息中间件、分布式事务中间件,但是就如同当年Unix和C语言的产生一样,谷歌认为,云计算就是无数台简陋x86服务器组成的一台虚拟的超大无比的计算机,那这个虚拟的计算机肯定需要一个操作系统,这个操作系统的编写一定要出现一个擅长的开发语言:它天生就擅长处理分布式、它天生就擅长处理并行计算。这就是Golang发明的初心。


Java和J2EE过去是在中间件级试图处理这个问题,而谷歌试图在编程语言和操作系统级解决这个问题。你看搞不搞笑,同样的一个问题,有人想在中间件级和平台级解决,有人在编程框架级解决,有人想在编程语言级解决,有人想在编译器级解决,有人想在操作系统级解决。


十一、人工智能时代


2015年,人工智能借助AlphaGo突然爆发。谷歌用Java编写了Tensorflow平台,Facebook用Python编写了PyTorch平台。


Python这个90年代Web互联网时代的编程语言,居然在人工智能时代老树开花了。


如今人工智能已经活了8年了,我在想,难道就没有出现一门新的编程语言来尤其擅长处理人工智能么?


开启Windows的有:VB (来自老的BASIC) 、Delphi (来自老的Pascal) 、PB (新的PScript)


开启Web互联网的有:Java (虽然最初是为了日本智能家电) 、C# (新的) 、PHP、Perl、Python、Ruby..。


开启移动互联网的有:Java (老) 但被Kotlin代替、Ojb-c (老) 但被Swift代替。


开启云的有:Golang。


难道开启人工智能的,就没有针对性的编程语言了吗?


现在Tensorflow用Java、PyTorch用Python,这都是应用级编程语言。


人工智能虽然出现了专用的GPU、TPU芯片,但人工智能专用的操作系统还没有。Tensorflow和PyTorch只能算编程框架、中间件、平台。


人工智能是个大力依赖海量数据、大算力的活儿,听说GPT-3预训练一次就得花费上千万美金、上万张AI芯片板卡并行处理,所以不能天天训练来接纳新知识。这是目前人工智能很大的瓶颈。我个人感觉,需要把现在的AI平台再拆分拆分,在AI平台和AI芯片之间再加一层东西,专门调度这上万张芯片板卡,而且这个东西需要新的针对性的编程语言来实现。


有人说,Linux操纵系统+K8s云原生平台+Golang编程语言不就可以满足么?我想说:大家可以回头再看一遍Golang是因何而出现的,就能明白我为啥这么个思考逻辑。


我在这篇文章里反复给大家强调的: 一个时代就会应运而生一个时代的编程语言。 如果没有产生新的编程语言,那说明这个时代是个人们定义的假时代,或者这个时代还没有真正来临呢。


十二、万物智能互联时代


这几年又火起来一门开发语言: Rust 。这个编程语言的1.0版本是2015年产生的。


目前操作系统Linux可以接受Rust代码了。谷歌在2020年发布的Fuchsia操作系统听说内核也是用Rust写的。


过去内存管理,Java和C#都是用组件技术和组件容器、二进制字节码和虚拟机垃圾回收这四种技术的组合来解决的。现在Rust想在编程语言级解决。


你对于一个计算机应用一个手机应用,出了问题我们可以很容易杀死进程甚至重启操作系统清空内存。但是如果是万物互联,这工作环境要么是地下管网、要么是野外三高地带,所以就得有Rust这样凶悍的编程语言保障着。


所以,要不要All in投入到一个真真正正的大时代, 标志就是:针对性的新的编程语言,出现了。 这才是我今天写这篇文章的真正价值。而梳理编程语言历史,毫无价值。


本文来自微信公众号: 阿朱说 (ID:azhushuo) ,作者:吕建伟

随意打赏

提交建议
微信扫一扫,分享给好友吧。