如果将对机器的控制也堪称是编写“程序”的话。那么编程的起源便可以追溯到杰卡德编织机上面所使用的打孔纸带。1801年,正值工业革命期间,杰卡德织机的发明使得提花编写的图案可以通过“程序”来自动完成。
爱达·勒芙蕾丝在1842年至1843年间花费了九个月,将意大利数学家Luigi Menabrea关于查尔斯·巴贝奇新发表机器分析机的回忆录翻译完成。她于那篇文章后面附加了一个用分析机计算伯努利数方法的细节,被部分历史学家认为是世界上第一个电脑程序。
简评:
程序的出现,是来自于工业革命时代,人们对于生产力提升的需求。起初,都是针对特定设备的“机器语言”。主要解决“有没有”,“能不能”的问题。
世界上第一台存储程序式电子计算机,是1949年出现的EDSAC。这个时候,所谓的“机器语言”计算正式问世了。
汇编程序的雏型也是在电子离散时序自动计算机 EDSAC上研制成功的。该系统的特征是用户程序中的指令由单字母指令码、十进制地址和终结字母组成。第一个汇编程序是符号优化汇编程序(SOAP)系统,于50年代中期为IBM 650计算机研制的。IBM 704计算机的符号汇编程序(SAP)是汇编程序发展中的一个重要里程碑。此后的汇编程序大都以这一系统为模型,其主要特征至今未发生本质的变化。
在这段期间被开发出来的重要语言包括有:
简评:
从需求上来说,此时的计算机,主要应用于军事及科学计算,为“两弹一星”等重大工程减少计算量服务的。“汇编语言”的出现是为了解决:重复性的录入引导程序的机器语言数列、以及机器语言指令表。
1950年代计算机产业飞速发展。IBM于1951年进军电子计算机领域,出现了汇编语言和高级语言FORTRAN,计算机编程的效率大大提高,促进了计算机的推广普及。
1965年IBM推出了【System 360】系列机,彻底改变了计算机的发展。此前程序是与硬件绑定的,只能在一种计算机上运行。S/360设计师Amdahl提出了兼容概念,使一个程序能在不同型号计算机上都能运行,从而程序不再附属于计算机硬件。从此,软件得到了解放,成为了一种产品,最终形成一个新的软件产业。
在此期间,诞生了以下三个著名的高级编译语言:
简评:
高级语言的出现,实质上是解决“用人类能够读懂的字符与计算机沟通”的问题。从需求上来说,这个阶段的计算机开始向非数值应该方面发展,除继续用于科学计算外,主要用于数据处理、工商业事务处理、企业信息管理。60年代后期出现小型机后,开始应用于生产过程的实时控制。正是得益于此,让高级语言有了更加广泛的发展空间。
1970s的特点体现在微处理器和矢量超级计算机的出现。1971年世界上第一台微处理器在美国硅谷诞生,开创了微型计算机的新时代。1976年3月,克雷研究公司利用集成电路研制了世界上第一台超级计算机“克雷I型”。
1960年代晚期至1970年代晚期的期间中,编程语言的发展也有了重大的成果。1967年5月20日,在挪威奥斯陆郊外的小镇莉沙布举行的IFIP TC-2 工作会议上,挪威科学家Ole-Johan Dahl和Kristen Nygaard正式发布了Simula 67语言。Simula 67被认为是最早的面向对象程序设计语言,它引入了所有后来面向对象程序设计语言所遵循的基础概念:对象、类、继承。
在此期间,产生的主要语言有:
简评:
汇编语言、C语言等面向过程的编程语言,使用的时候,需要把思维转换成机器的思维,时刻要考虑开辟多大的内存,存储多大的数据,数据在使用完毕的后什么时间释放。这样写代码学习成本太高,开发效率低,不适合编程的推广与应用。所以渐渐的就发展出来了更友好地面向对象编程语言。面向对象(Object Oriented,OO)是软件开发方法,并衍生出3个概念:OOA、OOD和OOP。
计算机的发殿应用领域从科学计算、事务管理、过程控制逐步走向家庭。面向对象编程语言的出现,降低了学习成本,易于推广,极大的激发了大家的学习热情,让人们更加专注于如何使用编程语言实现想要的功能。
1980年代的面向对象语言走向繁荣的阶段。在20世纪80年代初期美国AT&T贝尔实验室的本贾尼.斯特劳斯特卢普(Bjarne Stroustrup)博士发明并实现了C++(最初这种语言被称作“C with Classes”),该语言合并了面向对象以及系统程序设计。美国政府标准化一种名为Ada(没错,就是为了纪念第一个程序员爱达·勒芙蕾丝)的系统编程语言并提供给国防承包商使用。日本以及其他地方运用了大量的资金对采用逻辑编程语言结构的第五代语言进行研究。函数编程语言社区则把焦点转移到标准化ML及Lisp身上。这些活动都不是在开发新的范型,而是在将上个世代发明的构想进一步发扬光大。
在此期间,产生的主要语言有:
简评:
这个阶段,计算机算术发展受到了用于执行算术密集型信号处理功能的、低成本和/或高性能嵌入式硬件的需求引导,超大规模集成电路(VLSI)得到广泛应用。
在语言设计上有个重大的新趋势,就是研究运用模块或大型组织化的程序单元来进行大型系统的开发。Modula、Ada、以及ML都在1980年代发展出值的模块化系统。尽管,该阶段没有出现新的主要编程语言范式,但许多研究人员仍就扩充之前语言的构想并将它们运用到新的内容上。
1960年代包交换技术出现,美国国防部决定用该技术构建ARPANET;1977年Cerf和Kahn发明TCP/IP;1983年ARPANET全面采用TCP/IP,互联网诞生!1991年,CERN(欧洲粒子物理研究所)的Tim Berners-Lee发布World-Wide Web (WWW),至此互联网开始向社会大众普及。
也有人认为将1990年代是传统互联网时代,1994年杨致远和大卫-费罗在美国于雅虎,首次确立了互联网的基本经济规则。1998年,Larry Page和 Sergey Brin创建谷歌将数字广告做到了自动化的程度。
2020年代是移动互联网时代,从2008年智能手机上市以来,在2014年到达顶峰,大部分科技公司完成IPO,开始收割。
未来,是物联网大发展的时代。5G非独立组网(NSA)标准已经在2017年12月冻结,独立组网(SA)标准也计划在2019年3月完成,2020年NB-IoT网络实现全国普遍覆盖。
编程语言方面,1990年代未见到有什么重大的创新,大多都是以前构想的重组或变化。这段期间主要在推动的哲学是提升程序员的生产力。许多"快速应用程序开发" (RAD) 语言也应运而生,这些语言大多都有相应的集成开发环境、垃圾回收等机制,且大多是先前语言的派生语言。新的脚本语言则比RAD语言更新更好。这种语言并非直接从其他语言派生,而且新的语法更加开放地(liberal)与功能契合。虽然脚本语言比RAD语言来的更有生产力,但大多会有因为小程序较为简单,大型程序则难以使用。尽管如此,脚本语言撰写并维护的顾虑脚本语言还是网络层面的应用上大放异彩。
编程语言持续在学术及企业两个层面中发展进化,目前的一些趋势包含:在语言中增加安全性与可靠性验证机制、提供模块化的替代机制、组件导向软件开发、元编程、反射或是访问抽象语法树等。
在此期间,产生的主要语言有:
简评:
互联网时代的编程语言上变得更加成熟了。互联网的发展,促便软件工程向模块化、组件化、微服化方向发展,让面向对象深入的发展出用例驱动设计、测试驱动设计、领域驱动设计等方法论,管理上从瀑布式、迭代式、到敏捷式的进化,最后走向大一统的DevOps、研发效能管理的思潮。
编程语言按不同的维度有不同的分类方案,上图为常见的几种分类方法。这边对各种类型做个简要介绍:
机器语言是机器能直接识别的程序语言或指令代码,无需经过翻译,每一操作码在计算机内部都有相应的电路来完成它,或指不经翻译即可为机器直接理解和接受的程序语言或指令代码。机器语言使用绝对地址和绝对操作码。不同的计算机都有各自的机器语言,即指令系统。
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符代替机器指令的操作码,用地址符号或标号代替指令或操作数的地址。在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植。
从CPU体系来划分,常见的汇编有两种:IBM PC汇编和ARM汇编。
高级语言(High-level programming language)是一种独立于机器,面向过程或对象的语言。高级语言是参照数学语言而设计的近似于日常会话的语言。如:java,c,c++,C#,pascal,python,lisp,prolog,FoxPro,易语言,中文版的C语言等等。
说明式语言、命令式语言
说明式语言从问题的本身出发,关注的是“做什么”而不是“怎么做”,因此它们更强调如何对问题进行描述,从而隐藏了语言解决问题的具体实现的细节;而命令式语言从计算机硬件的抽象出发,关注的是如何去解决问题,它们强调的是把问题分解为计算机可以理解的步骤,因此需要程序员不仅要理解问题本身还要理解实现的原理和过程。简单来说,说明式语言是用来说明问题的,问题的解决由语言来处理;命令式语言是命令计算机做事情的,解决问题的逻辑由程序员确定。
函数式语言
函数式语言将函数作为语言的核心,在函数式语言里函数的参数和返回值也是函数。纯正的函数式语言没有可变量和循环,因此函数的定义一般基于递归来表示。函数式语言从数学上来源于丘奇在1930年代提出的λ演算,可以证明的是,λ演算与图灵机在解决问题的能力上是等价的。在本质上,函数式语言的程序被看作是一个从输入到输出的函数,而这个函数的定义是基于一些更简单的函数,经过逐步细化完成的。函数的递归表示使得函数式语言更倾向于用来描述问题,因此它被归于说明式语言的范畴。
如:scheme、Haskell、Clean、Erlang、clojure、Miranda等等。
数据流语言
数据流语言关注数据的流动,而程序由一系列的功能节点组成。程序接收输入数据,并显示地展示数据是如何一步步地被处理和修改,直到输出。功能节点由输入触发,一旦上游的输入准备好了,功能节点就开始工作,处理输入数据并产生输出。如:DSLX等。
逻辑式语言
逻辑式语言把逻辑推理直接变成程序的执行,它们把计算看作是一种有目标的推理过程,设法根据一组逻辑规则来找出满足特定关系的值。逻辑式语言程序描述的是数据对象之间的关系,这些关系以事实和规则表述,根据规则找出合乎逻辑的结果就是推理。因此逻辑语言程序的设计就是陈述事实,制定规则,程序设计的过程就是构造证明,而程序的执行就是推理,推理的过程由解释器来完成,程序员不需要关心实现细节。如:Prolog等;
面向过程语言
面向过程语言也称为结构化程序设计语言,是高级语言的一种。在面向过程程序设计中,问题被看作一系列需要完成的任务,函数则用于完成这些任务,解决问题的焦点集中于函数。其概念最早由E.W.Dijikstra在1965年提出,是软件发展的一个重要里程碑。它的主要观点是采用自顶向下、逐步求精的程序设计方法,使用三种基本控制结构构造程序,即任何程序都可由顺序、选择、循环三种基本控制结构构造。常见的面向过程语言有:c、Fortran等。
面向对象语言
面向对象语言(Object-Oriented Language)是一类以对象作为基本程序结构单位的程序设计语言,指用于描述的设计是以对象为核心,而对象是程序运行时刻的基本成分。语言中提供了类、继承等成分,有识认性、多态性、类别性和继承性四个主要特点。如:Smalltalk、C++、Java、C#等;
编译型语言:程序在执行之前需要一个专门的编译过程,把程序编译成为机器语言的文件,运行时不需要重新翻译,直接使用编译的结果就行了。程序执行效率高,依赖编译器,跨平台性差些。如C、C++、Delphi等。
而相对的,解释性语言编写的程序不进行预先编译,以文本方式存储程序代码。在发布程序时,看起来省了道编译工序。但是,在运行程序的时候,解释性语言必须先解释再运行。如Java、JavaScript、Perl、Python等。
动态结构语言是一类在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化。通俗点说就是在运行时代码可以根据某些条件改变自身结构。动态语言是在运行时确定数据类型的语言。变量使用之前不需要类型声明,通常变量的类型是被赋值的那个值的类型。如:Python、Ruby、Erlang、JavaScript、swift、PHP、SQL、Perl、Object-C、C#等。
与动态语言相对应的,运行时结构不可变的语言就是静态语言。静态语言是在编译时变量的数据类型即可确定的语言,多数静态类型语言要求在使用变量之前必须声明数据类型。 如:C、C++、C#、Java、Object-C等。
强类型语言,一旦一个变量被指定了某个数据类型,如果不经过强制类型转换,那么它就永远是这个数据类型。如:Java、C#、Python、Object-C、Ruby等。
与之相对的弱类型语言,即数据类型可被忽略,一个变量可以赋不同数据类型的值。一旦给一个整型变量a赋一个字符串值,那么a就成字符类型。如:JavaScript、PHP、C等。
在互联网时代,编程语言主要在工程化有较为深入的发展,在研发效能的提升上进行专研。其中,设计方法论上,进一步讨论面向对像方法的落地方案,从领域驱动中进一步分离出命令查询的责任分离Command Query Responsibility Segregation (简称CQRS)模式;管理方法上,比较崇尚敏捷开发,从而发展出DevOps;此外,无服务化的开发模式的出现,也促进了各种类型编程语言进行融合:如:Java也开始支持函数式编程、脚本语言,甚至新版本的Java也计划推出弱类型的支持。
平台支持是我们选择语言的首要考虑因素,比如:业务服务开发,可以选 Java、C#、PHP等。但是有时候一些平台性的限制导致选择,比如:Android开发,首选Java、或者Kotlin; iOS开发,首先Object-C、 Swift;Web页面开发,首先JavaScript等。
不同的应用领域,也必须使用想匹配的语言:
在上面两项的前提下,开发效率是接下来要考虑的第三方面,最直观的表达就是可以用一行代码实现的不要让我用十行代码实现。这里面又设计到几点:
再下来就是要考虑生态了,这里面包含下面几点:
TIOBE排行榜是根据互联网上有经验的程序员、课程和第三方厂商的数量,并使用搜索引擎(如Google、Bing、Yahoo!)以及Wikipedia、Amazon、YouTube和Baidu(百度)统计出排名数据,只是反映某个编程语言的热门程度,并不能说明一门编程语言好不好,或者一门语言所编写的代码数量多少。
TIOBE的访问路径为:https://www.tiobe.com/tiobe-index/。其中2022年2月的前10名为:
发展历程
Java的历史要追溯到1991年,由Patrick Naughton和James Gosling 带领的Sun公司的工程师小组想要设计一种小型的计算机语言,主要用于像有线电视转换盒这类消费设备。遗憾的是,Sun 公司对生产这个产品并不感兴趣,Green 项目组的人员必须找出其他的方法来将他们的技术推向市场。
由Patrick Naughton和Jonathan Payne开发的Hot Java浏路器,在1995年5月23日的SunWorld’95大会上展示,同时引发了人们延续至今的对Java的狂热追逐。1996年年初,Sun发布了Java的第1个版本。后来的Java 1.1弥补了其中的大多明显的缺陷,大大改进了反射能力,并为GUI编程增加了新的事件处理模型。
5.0版是自1.1版以来第个对Java活言做出重大改进的版本(这版本原来定为1.5版,在2004年的JavaOne会议之后,版本号直接升至5.0)。该版本添加了泛型类型,其挑战性在于添加这特性面不需要对虚拟机做出任何修改。
2014年,Java 8终于发布,在近20年中这个版本发生的改变最大。Java 8包含了一种“函数式”编程方式,可以很容易地表述并发执行的计算。
2017年7月,Oracle 公司将发布 JDK 9。该版本算是加入了很早之前就规划的模块化功能,并且对整个 JDK 基于模块进行了重新编写。
从2018年开始,每6个月就会发布一个Java版本,以支持更快地引人新特性。2021 年 9 月 14 日,Java SE 17 LTS 发布。
简评
得意于Java的 JVM机制,使得Java具有良好的平台可移植性,可支持在Windows机子上开发、在 Linux设备上部署,让开发人员、公司更容易接受。同时Java长期在TIOBE排行靠前,经过20多年的发展,积累了庞大的开发框架、以及二次开发库,大大减少重得造轮子的工作。在工程应用方面,形成完成的开发工具链条,有多种IDE支持,并受主流的DevOps工具支持。
发展历程
2011年7月,JetBrains推出Kotlin项目,这是一个面向JVM的新语言。Kotlin v1.0于2016年2月15日发布。这被认为是第一个官方稳定版本,并且JetBrains已准备从该版本开始的长期向后兼容性。
在Google I/O 2017中,Google宣布在Android上为Kotlin提供一等支持。
简评
由于Kotlin也运行在JVM之上,因此几乎可以在Java的现有的生态之前进行开发。当前Kotlin的推广主要得益于由Google在Android的一等支持。在工程应用方面,IDE的支持主要是有IntelliJ Kotlin插件,并受主流的DevOps工具支持。
发展历程
1980年初,布莱德·确斯( Brad Cox)发明了Objective-C,它是基于Smalltalk-80而发展起来的。1996年,苹果公司收购了NeXT Sofiware公司,然后把NEXTSTEP/OPENSTEP环境变成苹果操作系统下一个主要发行版本OS X的基础,这个开发环境的该版本被苹果公司称为Cocoa。
2006年,苹果公司发布了Objective-C 2.0,该版本增加了现代的垃圾收集语法改进、运行时性能改进和64位支持等功能。
简评
Objective-C的发展主要是苹果公司的支持,在苹果公司的生态中占有重要的位置。其IDE主要是XCode,但包管理上,主要是社区提供的Cocoapod,并不支持私有化部署。
发展历程
苹果于2014年WWDC苹果开发者大会发布的新开发语言,可与Objective-C共同运行于macOS和iOS平台,用于搭建基于苹果平台的应用程序。Swift结合了C和Objective-C的优点并且不受C兼容性的限制。Swift采用安全的编程模式并添加了很多新特性,这将使编程更简单,更灵活,也更有趣。
简评
主要利益于苹果公司的支持,为iOS开发的首推语言。其IDE主要是XCode,DevOps工具支撑方案,如包管理上,苹果官方就提供Swift Package Manager。
发展历程
JavaScript在1995年由Netscape公司的Brendan Eich,在网景导航者浏览器上首次设计实现而成。因为Netscape与Sun合作,Netscape管理层希望它外观看起来像Java,因此取名为JavaScript。但实际上它的语法风格与Self及Scheme较为接近。
JavaScript的标准是ECMAScript 。截至 2012 年,所有浏览器都完整的支持ECMAScript 5.1,旧版本的浏览器至少支持ECMAScript 3 标准。2015年6月17日,ECMA国际组织发布了ECMAScript的第六版,该版本正式名称为 ECMAScript 2015,但通常被称为ECMAScript 6 或者ES2015。
简评
JavaScript的发展主要占着浏览器的支持而来。随着JavaScript的流行,发展出一系列的工程化支持工具,并形成了包管理工具npm等。JavaScript占着跨平台支持的优势,在大前端方案中占有重要的位置。目前主流的IDE为WebStorm,并受主流的DevOps工具支持。
发展历程
HTML的英文全称是 Hyper Text Markup Language,即超文本标记语言。HTML是由Web的发明者 Tim Berners-Lee和同事 Daniel W. Connolly于1990年创立的一种标记语言,它是标准通用化标记语言SGML的应用。用HTML编写的超文本文档称为HTML文档,它能独立于各种操作系统平台(如UNIX, Windows等)。使用HTML,将所需要表达的信息按某种规则写成HTML文件,通过专用的浏览器来识别,并将这些HTML文件“翻译”成可以识别的信息,即现在所见到的网页。
在 2008 年正式发布HTML 5,该版本结合HTML 4.01的相关标准并革新,符合现代网络发展要求,是互联网的核心技术之一。
简评
自1990年以来,HTML就一直被用作万维网的信息表示语言,使用HTML描述的文件需要通过web浏览器显示出效果。HTML支持的IDE非常丰富,并受主流的DevOps工具支持。
发展历程
1994年哈坤·利提出了CSS的最初建议。而当时伯特·波斯(Bert Bos)正在设计一个名为Argo的浏览器,于是他们决定一起设计CSS。
CSS 3是CSS技术的升级版本,于1999年开始制订,2001年5月23日W3C完成了CSS3的工作草案。CSS 3规范的一个新特点是被分为若干个相互独立的模块。这些模块独立实现和发布,也为日后CSS的扩展奠定了基础。
简评
CSS为HTML标记语言提供了一种样式描述,定义了其中元素的显示方式。CSS在Web设计领域是一个突破。利用它可以实现修改一个小的样式更新与之相关的所有页面元素。CSS支持的IDE非常丰富,并受主流的DevOps工具支持。
发展历程
C语言诞生于美国的贝尔实验室,由丹尼斯·里奇(Dennis MacAlistair Ritchie)以肯尼斯·蓝·汤普森(Kenneth Lane Thompson)设计的B语言为基础发展而来,在它的主体设计完成后,汤普森和里奇用它完全重写了UNIX,且随着UNIX的发展,C语言也得到了不断的完善。为了利于C语言的全面推广,许多专家学者和硬件厂商联合组成了C语言标准委员会,并在之后的1989年,诞生了第一个完备的C标准,简称“C89”,也就是“ANSI C”,截至2020年,最新的C语言标准为2018年6月发布的“C18”。
简评
C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、仅产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。当前,C语言最主要用于编写系统软件。在工程化方案,C语言支持的IDE非常丰富;在工具链层面上,因为需要用 C 语言做的事情通常比较底层,与操作系统紧密相关,因此相对比较凌乱。
发展历程
Python解释器易于扩展,可以使用C语言或C++(或者其他可以通过C调用的语言)扩展新的功能和数据类型。 Python 也可用于可定制化软件中的扩展程序语言。Python丰富的标准库,提供了适用于各个主要系统平台的源码或机器码。
2021年10月,语言流行指数的编译器Tiobe将Python加冕为最受欢迎的编程语言,20年来首次将其置于Java、C和JavaScript之上。
简评
由于Python语言的简洁性、易读性以及可扩展性,用Python做科学计算的研究机构日益增多。众多开源的科学计算软件包都提供了Python的调用接口,例如著名的计算机视觉库OpenCV、三维可视化库VTK、医学图像处理库ITK。而Python专用的科学计算扩展库就更多了,例如如下3个十分经典的科学计算扩展库:NumPy、SciPy和matplotlib,它们分别为Python提供了快速数组处理、数值运算以及绘图功能。因此Python语言及其众多的扩展库所构成的开发环境十分适合工程技术、科研人员处理实验数据、制作图表,甚至开发科学计算应用程序。目前主流的IDE为PyCharm,并受主流的DevOps工具支持。
按当前的应用领域说来:
四、参考资料