我是昨天在梳理生态应用开发、低代码开发工具到底需要啥样的开发语言而有感整理的。
计算机硬件、操作系统、编程语言,这是计算机工业的三大基础件。咱们今天主要说编程语言。
(1)开启
1946年,世界上第一台通用计算机ENIAC产生。但真正要说把全球整个IT产业带起来的,要说两个公司:
1、一个是IBM,1964年发布System/360大型机,开启主机工业时代。当然,1976年贝尔实验室发布Unix和C语言,也值得纪念
2、一个是Apple,1977年发布Apple II,开启PC工业时代。当然,1983年IBM发布PC兼容机开放标准,也值得纪念
一开始的计算机控制,用的是最原始的01010二进制编码。还是IBM牛逼,在1953年发布IBM 650大型主机时,研发出来汇编语言,这是间于机器和人类之间的一种语言,堪称创世纪,把人和机器连在了一起。
一开始计算机很昂贵也很复杂,所以主要用于科学研究和军事。所以,1957年,IBM发明了Fortran语言,主要目的用于科学计算。
随后,大型企业也开始为了计算财务、税务、薪资、库存,使用开计算机。早在1953年,安达信会计师事务所就为帮助通用电气公司提高薪资处理效率而安装了美国第一台商用电脑,从此开创了企业信息化的时代。COBOL开发语言于1958年产生。现在,全球很多金融机构,还有很多COBOL代码仍然在运行。
Fortran和COBOL从一开始设计的时候就都有自己的明确目标,一个偏科学计算一个偏商业逻辑。到此为止,要搞一些通用型的其他东西,只有汇编。这就不大好。1972年,贝尔实验室的 D.M.Ritchie为了开发Unix,特意发明了C语言。这是历史上第一个人类可流畅使用的通用编程语言。
到了1980年,软件需求越来越复杂,代码规模越来越大,C语言的代码组织方式已经不容易Hold住。于是,一种面向对象的编程语言设计哲学产生,因此也探索性地产生了第一个面向对象开发语言:SmallTalk。不过还是C语言的生命力强胜啊,Bjarne Stroustrup在1979年从剑桥大学计算机中心来到贝尔实验室,开始把C语言改造成带类的C语言,1983年正式命名为C++。
(2)PC时代编程语言
我接触计算机比较晚,1993年才接触计算机,从ENIAC计算机发明算起,已经快过去50年了。不过即使算整个计算机史到现在2020年也才74年,我陪着这个行业也走过了27年(小30年了)。我是自学的C语言。当时计算机资源非常宝贵,所以我和前辈们一样,都是在纸上写好代码并且反复推演,有了上机机会就赶快敲入代码并进行调试,所以也就是在那个时候,练成了我们代码设计、严谨逻辑思考、飞速打字的好习惯。后来总有一些操作系统内核级的东西绕不过去,我就又自学了汇编语言。等真正用C++的时候,已经是VC++4.0的版本了,用MFC类库写Windows窗口GUI应用。
但我并未用C++写过商用软件,我真正拿到收入的反而是DBase系列,以及后来衍生的FoxBase、FoxPro for DOS、FoxPro for Windows。Dbase产生于1980年,我用的是1984年用C语言重写的DbaseIII这个版本。当年这些编程语言都是偏商业应用的,为PC单机而准备,GUI开发、业务逻辑开发、SQL操作数据库,三位一体。后来随着局域网的产生、互联网的产生,开发语言才不断分化,有的擅长前端UI层,有的擅长业务逻辑层,有的擅长后端数据层。
我一直没用过Basic语言,虽然BASIC在1964年就被John Kemeny 和他的老师 Thomas Kurtz发明出来了,John Kemeny这家伙还是人工智能的鼻祖,人工智能编程语言LISP就是他的杰作,想想一个人发明两个编程语言也是够牛的。后来是盖茨把BASIC移植到PC机上,开创了微软帝国。真正在90年代火翻天的Windows应用开发三剑客是:VB、PowerBuilder、Delphi。VB和PB都是1991年产生,而Delphi最晚,是1995年发布。我学习Delphi是1996年,算比较早的。
(3)Web时代编程语言
但其实,1995年是什么年份?1995年既是PC最辉煌的年代,因为最风靡的PC操作系统Windows95在这一年发布了。但是,这也是全球互联网爆发之年,因为这一年,Amazon电子商务、雅虎资讯门户都创立了。这一切都得益于WWW之父,欧洲核子研究组织的研究员:蒂姆·伯纳斯·李,是他在1991年发布了四个东西:URL、网页编辑工具、网页浏览器、网页服务器。1993年,欧洲核子研究组织宣布万维网对任何人免费开放。1993年,伊利诺斯大学的学生马克·安德列森写出了Mosaic浏览器,后来他在1994年成立Netscape公司。所以说,HTML算是1991年就发明了,现在都HTML5标准了。
一开始,互联网只用于信息展示,不能作为应用。人们热切想在互联网上搞应用。于是,一堆过去做自动化脚本的编程语言现在搞出新名堂,支持互联网应用开发。首当其冲的就是四大动态脚本类编程语言:1987年发明的Perl、1991年发明的Python、1994年发明的PHP、1995年发明的Ruby。Perl和Python都发明的比较早,一开始用于UNIX操作系统服务器端自动化Shell编程。但PHP和Ruby显然是为互联网而来的。你看PHP,实际上人家一开始的全称是:Personal Home Page。
服务器端具备了应用开发能力,网页端也得配合。于是,1995年Netscape公司的Brendan Eich发明了Javascript,但其实和JAVA没有半毛钱关系,只不过当时JAVA火的一塌糊涂,Netscape公司正在和JAVA的发明公司Sun公司合作,所以就命了这么一个名。Javascript其实从设计到命名都比较草率和随意,没想到活的这么久。
说到JavaScript,就必须要说到JAVA了。Sun是Andy Bechtolsheim在斯坦福上学时制造了一种强大的图形工作站计算机,后来于1982年创办Sun公司。到了1991年,Sun公司想进军消费智能硬件,就搞了一个研究小组,JAVA之父詹姆斯·高斯林他们就在1992年搞出了一个叫Oak的东西,为了支撑各种繁多的消费硬件,为了让平庸的消费者不会弄崩溃这些智能程序,他们发明了虚拟机这种运作平台。但是发明出来发现无人问津,甚是郁闷。转机出现在1994年,当时互联网热了起来,他们抓住了时机转向互联网应用开发。当时网页都是静态的内容展示,人们渴望更多的动态和互动。于是Sun公司和Netscape合作,Sun公司发明Applet,通过插件方式运行在浏览器客户端,而Netscape公司发明javascript,让javascript可以操作HTML,使HTML可以动态起来。我是1997年开始学习Java的,而Java成气候是1998年,这一年,Sun公司发布了三大标准规范并且免费开放,这就是:J2ME(手机设备)、J2SE(PC设备)、J2EE(服务器设备)。所以,1998年,IBM和BEA都疯狂进入,用Java开发语言实现J2EE规范的中间件,这就是后来的WebSphere和WebLogic。
客户端能动态了,服务器端也能动态了,就差中间了。毕竟HTML是用于内容展示的,不是用于数据表示的。所以1998年W3C制定了XML1.0规范,这是从HTML这个方向裁剪出来的一个子集。但是 ECMAScript委员会他们从javaScript这个方向也裁剪出来一个解决方案,那就是JSON,于2001年发布,在2005年之后因为比XML简洁而流行。另外再提一句,AJAX也因为Google Gmail应用而在2005年伴随Web2.0用户体验交互热潮风靡全球,其实AJAX是微软在1998年就发明了。
微软在Web时代是气喘吁吁。微软搞过IE浏览器软件,打过互联网大战第一仗。微软还自己搞过bing搜索,现在也是全球第二大搜索引擎,给微软每年带来的营收也不小。社交网络这种东西偏运营,对于微软这样的技术产品研发商不太合适,但最后微软还是并购了一个LinkedIn,不算太输。倒是微软在通信方面比较摇摆:微软收购过HotMail邮箱服务,这是互联网基础在线服务。微软还自己搞过MSN Messager,后来还收购过Skype,现在又搞Team。Web互联网时代,Sun搞JVM、Java语言、J2EE,红遍互联网世界。微软当然不能落后,微软就挖来Delphi的发明人安德尔斯,搞了一套.Net、C#。不过当年微软即使不赶这个互联网热,也确实需要.Net和C#。因为微软的看家应用开发语言VB我一直看不上,VC++又太底层不易于开发商业应用。而且微软的Windows95内核是从DOS一路上来的,不像NT这种服务器端操作系统有Client/Server内核保护机制,所以对于写的比较烂的应用或者不怀好意的应用,容易把Windows弄的速度特别慢或者直接蓝屏崩溃,大家都以为是微软的问题。微软也很冤枉,所以微软也急需虚拟机这种内存保护和内存自动回收管理机制。所以Don Box说.Net是更好的COM,我一下子理解了。
在Web时代的黄昏,还留下一个小尾巴咱们也值得讲讲。一个是发明C#的安德尔斯,搞了一个可以在浏览器端运行的C#吧,命名叫TypeScript。而发明Chrome浏览器的Google,则把Chrome的JavaScript解释引擎独立出来成为NodeJS,以便实现JavaScript在服务器端运行。在Web时代的黄昏,这两个的举动尤其搞笑。
(4)商用开发语言
咱们梳理的时间线到了2006年,但是我先暂时按下移动时代不表,我先捡回来说说商用开发语言这个特定兵种。自从1958年发明完大型机的COBOL,1980年发明完PC机的DbaseScript,咱们还没太介绍更多的商用逻辑开发语言。
首先提到的就是SAP创造的ABAP。ABAP最初是用于报表开发的,是随着1979年R/2套件开发而逐步产生的。你可以这么理解,ABAP一开始就好像是EXCEL表格的函数和VBA宏脚本语言。这套语言在1983年发布。要知道,VBA宏脚本语言,是微软1991年才发明的,到了1993年才随着Excel5.0的发布而发布。
后来,SAP为了方便上层应用简单开发,就把ABAP逐步扩张,到了1989年就成熟了。所以,R/3的应用模块就用ABAP开发了,1992年R/3发布。要知道,1992年,COBOL已老,JAVA还刚刚产生,Dbase小儿科,C++太底层,还真没有合适的商业应用开发语言。所以ABAP被发明出来也是天时决定。但是2001年SAP研发Web的ERP套件时就没有自己另外发明开发语言了,而是直接用了最火爆的Java语言。而Oracle的ERP起步就比较晚,所以一上来就是Java,Oracle ERP一直没有创造自己的开发语言,觉得大量的程序员都默认掌握Java和SQL这两大流行杀器,无须再简化。
但是,创办于1999年的Salesforce,在2004年研发PaaS开发平台时,却创建了一种自己的商业应用开发语言APEX。要知道,1999年是Java如日中天的时候,Salesforce也是用Java开发的。2004年Java更是在业界大行其道,但Salesforce为啥自己要创建一种开发语言呢?SAP创造ABAP是有天时限制,你Salesforce有啥限制?
我后来想明白这个问题了。这和Salesforce创始人的初衷哲学有很大关系。他一直希望人们能够像使用互联网一样使用应用软件,所以Salesforce一直追求在线营销、在线销售、在线自助试用、在线自助配置初始化、在线自助订购在线付费、在线社区获得支持。当然他也一直希望人们能够很简单地创建应用。所以在配置平台和开发平台集成平台之间,产生了低代码开发平台:Force.com、APEX开发语言、AppExchange应用商店,而2018年收购MuleSoft,更可以通过调调Open API就能快速开发一个应用了。这样,APEX就成了API的粘合工具了。这和AWS推的Serverless 函数即服务殊途同归。这是在线云服务时代的未来大趋势。
说起API粘合,我还想起一个编程语言,那就是:Lua。2003-2006年,网络游戏特别火。游戏也是一种特殊的应用软件,只不过用漂亮的剧情、音乐、图片、动画把它包装的更吸引人,它其实也有引擎,也有功能,也有API。我过去玩帝国时代时候就特别痴迷地图编辑器,我还钻研过后台的脚本文件结构。想想帝国时代自带的那几个英雄故事就是游戏工作室的工作人员用脚本构建起来的。所以Lua语言小巧玲珑地把C++的函数粘合起来,对于我等C++渣们来说,无疑是个福音。
(5)移动时代编程语言
现在让我们来到移动开发时代吧。这个时代主要是由Apple和Google这两家公司带领起来的。
来源于乔布斯的Next公司的Next操作系统用Object-c(Next操作系统本质上是从FressBSD Unix改造过来的),所以iOS用Object-c。因为iOS用Object-c,所以iPhone上面的应用就用Object-c。就这么个逻辑。
而Google创造出Android(其实是并购的),操作系统内核是Linux,上层应用开发语言是Java。为啥选Java,就是因为Java一开始发明就是为智能硬件而设计的啊,而且1998年已经发布J2ME规范,最成熟。而且Java程序员好多好多。Linux+Java,Google这个技术选择甚是现实,可以方便快速追赶Apple。
但是,现在,移动时代基本是iOS和Android的天下了,进入双子星市场垄断格局,谁也干不掉谁。所以双方都开始歇下来,做更好。2014年,Apple公司推出Swift开发语言,2017年Google推出Kotlin开发语言。
随着这两大杀器语言甚是优美,但是也拗不过万金油的程序员,独独钟爱JavaScript。所以移动Web时代有BootStrap这样的多端适配自响应框架,移动App时代Facebook在2013年还发布了React框架,2015年又流行Vue框架,2017年又流行小程序框架,几乎两年换一茬。换来换去也就是围绕JavaScript这个技术在搞。
(6)云计算、大数据、人工智能时代编程语言
移动时代,都是终端技术上发力,现在风水轮流转,又回到了服务器端发力。
云时代,主要是多租户、分布式,如何并发执行不干扰是关键。并发是人类很早就做斗争的东西。从1998年爱立信创造erLang,到2009年的Golang,到2012年的Rust,都在致力于解决这个问题。但我独爱Golang,从2009年它一发布我就眼前一亮,太工程简洁了,就得这么干,对于中国万金油的程序员,就得给他们格式化的死死的才不会犯错。
说到大数据,不管你怎么绕,比如开发Hadoop的Java、开发Spark的Scala,最后你还得绕回该死的SQL,这和JavaScript一样你看不惯它但是你就是打不死它。如果说Kotlin是终端上更好的java技术,那么Scala就是服务器端上更好的java技术,就这么回事。
说起人工智能,我们先提提经典的科学计算、数据统计、数据挖掘。除了世界上第一个开发语言1957年发明的Fortran,那就得数1980年发明的R语言。真正的人工智能编程语言其实是1958年产生的LISP语言,就是咱们文章最前面提到的曾联合发明BASIC编程语言的麦卡锡。不过受两大人工智能深度学习平台之一的PyTorch影响,Python现在又成为了最流行的人工智能应用的开发语言。有时候我也在想,为啥某个技术是由某个编程语言开发的,后来也想明白了,可能那个主导人就比较擅长某个编程语言而已,没啥适不适合的。
如果让我自己来选择开发语言:
UI前端层是HTML、JavaScript
页面层是:Python和PHP虽然都行,但Python从Web时代过渡到了人工智能时代,那就选择一门:Python
业务逻辑层是:Golang
数据层是:SQL
(7)招聘
去年,为了开放生态、开放平台、微应用、低代码开发平台,我立了一个研究项目,那就是超级小程序。深入到了类JavaScript语言的解释器。后来出了一个Demo演示,发了一个开源项目,发表了一篇论文就结项了。今年想想,这事还得继续专门研究员持续研究起来。
我去年年底想招一个高级程序员,要求是精通Python和JavaScript,职责是来帮助研究员加快原型开发、成果工程化转化,如果还能把低代码编程语言研究这事也能顺接起来那就更棒了。所以我就搞了一个招聘简历来测试到底是不是擅长一门开发语言。很多程序员用一种编程语言写一辈子代码、开发过无数个项目,也对编程语言其实仅仅止步于入门。
我在想,测验他们的什么呢?我就举了一些测试点:
一、开发语言特性类:
1、动态语言和静态语言的优缺点是什么?
2、强类型和弱类型有什么设计考量?
3、对象管理、接口管理、运行时类型信息,几个主流开发语言之间的对比差异
二、计算机控制类:
1、内存管理,几个主流开发语言之间的对比差异
2、线程管理、并发管理、异步管理,几个主流开发语言之间的对比差异
3、进程间通信、远程调用,几个主流开发语言之间的对比差异
三、编译与运行类:
1、作为解释性脚本语言之间,他们在解释性脚本方面有啥差异?
2、解释器原理是什么?和虚拟机模式对比分析
3、如何跨平台?