计算机有多少种开发语言,为什么现在会有这么多种编程语言?

21世纪,计算机的应用越来越多,为了适应各种使用场景,于是诞生了各种语言,不仅语言是多样的,每种语言下面都有不同的开发框架,框架也是多样的。有时候为了性能,可能会选择编译型语言,为了写得爽可能会选择解析型语言,自己写点小应用可能会选择轻量级框架,对于大型项目,用笨重一点的框架也无所谓。

编程语言是靠“适者生存,优胜劣汰”的“编程语言进化论”来发展的,也许A语言的创造初衷也是为了打造适应性超强的万能语言,但后来在实际过程中,大家会发现这门语言在B场景下用得很好,放到C场景下使用就会很蛋疼,于是这门语言在B场景下的适应性会越来越完善,大家都热衷于完善它在B场景下的功能而忽略了C场景,于是C场景相应的功能由于没有人维护而渐渐退化。这时候,有人想兼顾A语言在B场景下的优秀特性,又想在C场景中发挥作用,于是它创造了D语言。后来有人觉得D语言还不够好,于是又有了E语言、F语言,于是,“编程语言多样性”就这么来了。

20819013a2cb6e22150767f6dae1a54e.png

编程语言如此之多,实际上是这个世界上的开发者共同努力的成果,大家都在尝试把各门语言的优秀特性综合,不断地产生优秀技术来淘汰掉旧技术,是自然选择演变而来的。你想当救世主,创造一门自以为是全世界最优秀的语言,实际上也只是为了编程语言的进化共享了一份力量而已。

一、编程语言历史发展的多样性基因

在计算机还全都是些庞然大物的石器时代,写程序是靠「机器语言」。虽然名字叫做「语言」,实际上用到的就真的只有两个数字0和1(考虑到三进制计算机[1]的话,也许还要算上“-1”)而已。一些特定的数字组合,对于计算机来说有特定的意义,会让计算机做出特定的动作——其实我们甚至不该叫它们「数字」,因为它们并不代表任何「数量」,而是代表「模式」(pattern)的信号。这是什么意思呢?

就好比你伸出一只手去按钢琴键盘的同一部分,缩起来的指头记作0,伸开来的指头记作1,01000和11110按出来的声音是不一样的,计算机接受的数字组合与之类似。01000000这个指令输入一块小芯片的时候,芯片里面有八坨晶体管组成的小装置被「按下」了,其中第二个被通上高电压,另外七个则是低电压,而这个组合会继而引发更多的、由芯片工程师所预先设计的一系列连锁反应。无数这样的模式数字接踵而至,才最终让你面前的屏幕上出现一些能被人理解的图案来。

给计算机输入这种相当于「命令」的数字——称为「指令」——来让它做一些事情,包括处理其他的数字(不管那些数字是真正代表数量的数,还是另一些代表指令的模式),就是编程的本质活动。

用纯数字的机器语言编程的难度可想而知,所以从数字到助记符号的转译很快随之出现,称作汇编语言。比如若是一组数字 0010 0000 可以让芯片把内部的一个存储单位,称作「寄存器 X」,加上一个值 Y,那么不妨就把这组数字和助记符「ADD」对应起来,上面的指令就可以写作「ADD X, Y」这样。一条条类似的指令写成一串,就是一个对于程序的描述。相对于纯数字来说,这是个质的飞跃——终于不必去扳开关了不是吗?而这样的一串字符,可以由专用的小程序来「翻译」成二进制的机器码,也就是真正可以输入处理器去按下晶体管的程序电子信号。当然,每种处理器的汇编语言仍旧是不同的(具体可查看马海祥博客《计算机语言的发展简史》的相关介绍)。

机器语言、汇编语言的优点在于,每一条指令都几乎对应于芯片能做的一件事,比如一条指令把一个数字从内存转入寄存器,另一条指令给它加上一,第三条指令将它写回内存去——直接对于一块芯片下命令,效率非常高。相应的缺点则是,如果你只是想把一个数字加一,却每次都要连续写三条指令,时间一长非常痛苦。而且既然不同芯片支持的指令集不同,就意味着这块芯片上需要三条命令完成的事情,另一块芯片可能需要不太一样的五条命令。假如能将一部分固定出现的操作,像连续技一样一次性施放,每次只需要打一个指令,却能够在不同结构的芯片上都做同样的事该有多好?换句话说,如果能有一种更倾向于描述需要解决的问题(给一个数字加一)而不是描述计算机具体进行何种操作(读数,加数,写数)的语言,来封装那些不需要关心的细节,把细小步骤想要达成的意图抽象出来,该有多好?

所谓「高级」计算机语言就是为了这一目的而出现的。最古老的高级语言有FORTRAN、ALGOL和COBOL,以及一种同样古老但是来源迥异的LISP(严格来说,LISP 是先作为一种形式语言发明出来,继而人们发现它可以用汇编语言转写给机器执行,后来甚至有专门运行LISTP的机器出现),这些都是二十世纪五六十年代出现的语言。

所以你可以说目前流行的一切计算机语言,几乎全都是上述四种古老语言的综合演进,而且如果看看 TIOBE 的流行语言榜,你会发现这四种语言都好端端地活在它的徒子徒孙中间,LISP甚至名列第十五,FORTRAN、COBOL也都没有掉出前五十。就如同芯片从一开始就有很多种类,这些彼此不尽相同的高级语言也都是几乎同时出现——一定要追寻个中原因的话,也许就是「自由市场经济」吧,每个人都有可能(也有资源)去自由地按照自己的想法开发一种语言,不会有(也不应该有)外界的权威从一开始就去限制、整合它们的差异。

六十年代到七十年代,人们开始将这几种当时还很年轻的、主要针对科研(除COBOL是针对商业)领域的计算机语言加以修饰、扩展和融合。其动机和幅度,主要取决于程序员的实际需求。与当初「不想记住数字」导致汇编语言的出现、「不想重复劳动」导致宏(macro) / 过程(procedure)的出现类似,因为「想要把数据和操作数据的动作组织到一起」,导致语言增添原生支持物件导向(object orientation)的数据类型和语法;「能方便地把一小块功能隔离/独立出来,便于维护/分享使用」的需求,导致语言的模块化支持(比如Python的import);「方便干净地在局部处理突发意外状况」的需求,导致异常处理(try…catch…finally)机制的出现;「免于手动管理内存」的需求,导致垃圾收集的出现;「将运算(computation)抽象出来」的需求,导致许多语言开始将函数视为类型系统的一等公民;「一件事做到一半时可以跳开去做另一件事然后还能回来」的需求,导致协程(coroutine)的发明……,当然,并不都是所有的语言特性都是以语言使用者的需求为本,比如C就是这样一个例子——它的若干设计最开始只是为了能快速方便地在不同结构的计算机上写出它的编译器来;还有些语言做的一些尝试完全就是「想看看这样有什么效果」而已。总而言之,那是个不断摸索的时代,因为许多事情都没有人做过,所以大家也不知道怎么做才算好。

后来计算机逐步小型化并变得廉价,应用范围大幅度扩展到各种产业。工程方面不断有新的应用实践,也会发现新的可以偷懒 / 改进之处,从而产生新的语言特性需求。这种进程如此之快,语言设计者们不可能一下子追踪、汇总所有的需求,总要有所侧重,好在此时语言的种种可能特性都差不多尝试过一遍了,所以新发明的语言往往会侧重于一种特定的方法、制作特定的语言功能,来使得编写某种特定形式的程序特别便利。这就是编程的所谓「范式(paradigm)」。几乎可以说,许多现今很流行的语言从一开始的设计目标,都是支持一种或几种主要的范式,因为许多设计者的最初目的仅仅是想要满足一个小圈子,甚至就是他自己,在某个领域(domain)的需要,而无法预见到它日后的走红。除此之外,语言设计者对于代码的态度也是一个决定因素,比如强调代码应该「易读」、「好维护」呢,还是「易写」、「好编译」?不同的选择会催生完全不同的两种语言。

于是接下来的二十年间涌现的语言大都个性鲜明,比如同样作为教学语言出现的 LOGO 和 BASIC 彼此大相径庭——Apple II 计算机上面同时有两种语言、并且可以在两种语言之间切换对我来说是最初的「原来程序语言可以有思路完全不同的很多种」之启蒙——而感谢此前的多年试错,许多语言都学会了遵循着一组特定的准则(principle)来设计,比如著名的 The Zen of Python。可与此同时也不乏有巨匠试图将语言做得大而全,填入很多特性,支持尽可能多的范式,但这种语言也因此而变得畸形而难以驾驭,到最后连他自己都说,「there is a much smaller and cleaner language struggling to get out」。而最终在语言进化之中「胜出」的,并不是那些设计「完美」的语言。Dennis Ritchie 说 C 是「quirky, flawed, and an enormous success」,同样的评语也可以用在许多其他语言上面,比如在统计学和生物信息学领域中大获成功的 R。重要的是,这些语言都能解决领域内的问题。毕竟语言使用者的需求和,呃,计算机语言 connoisseur 们的着眼点完全不同。语言使用者会不惜(或者说「无意识地」)使用最为愚蠢和肮脏的方式来使用一种编程语言,只要它能达到自己需要的效果;语言使用者也轻易不会切换到另一种不熟悉的语言,不论后者可能会在理论上带来多少倍的好处。

这就触及到了一个问题:不同的计算机语言拥有不同的「个性」,实际却都是对于最底层 0 与 1 的抽象和封装,只是方式与层级不一样——但人类对于这些方式与层级的选择态度,是非常难以改变的。也就是说,如果把语言抽象和封装的层级排成一列,那么每个人都能在这条线上找到自己的舒适区域(comfortable zone),呆在里面很舒服;抽象程度再高阶一些就会嫌不自由,再低一点却又觉得麻烦——如果这样说不够直观,那么不妨搬一个现成的例子:iOS 设备很好用,老太婆和小孩子都能搞定;但 Android 用户会说它不够「开放」(whatever that means),意思其实就是,认为它封装了太多东西,自己则希望掌控更多细节;可是除了刷 ROM 之外,多数 Android 用户从未给自己的手机写过任何一个程序——即便他对于某个理想中的 app 应该如何运作有着非常高深的见解。

既然我们应该允许人们自由决定使用哪一款电子产品,哪怕他们会因此展开圣战、互斥「脑残」,那么容许甚至鼓励不同风格的编程语言并存,也就是顺利成章的事情了。

二、为何会有如此之多的编程语言?

编程语言应该是随着进步而越来越多,就像一棵树,树根很少,越往上生长树枝就越多,这点也类似于生物多样性。

我们拥有如此之多的编程语言(不完全统计,至少超过一千种以上),一个重要的原因,是因为目前业界发展虽然看似迅猛,但是软件领域在过去几十年里,其理论认识和发展过程,依然远远比不上硬件方面的发展。

曾经硬件生产是属于智力密集型的,既需要尖端的知识,特殊的设备,还需要复杂的过程才能生产;如今,硬件生产依然需要特殊的设备、甚至更复杂的过程,但是整个流程已经被高度自动化、系统化、流程化。反过来看看软件行业,我们的程序员在增多,但是制造软件的难度以及软件本身的复杂度却在急剧膨胀并不断向着超出人们控制能力的方向发展。我们的理论却几近贫乏——虽然每年有牛毛一样多的论文,可是“银弹”还是从未被人真正找到。

这种矛盾,使得人们更加积极的寻求各种可能的解决方案。一个很重要的探索方向就是,是否能找到一个更好的编程语言,能够解决目前所遇到的各种,或者至少一部分问题呢?

于是大量的编程语言出现了。

从这个角度来看,编程语言的涌现,是由于人们在软件研发(软件的程序式语言表达)过程中遇到了瓶颈,人们试图突破这些瓶颈因而创造了大量的语言(具体可查看马海祥博客《盘点史上最奇葩的10大编程语言排行榜》的相关介绍)。

另一方面,编程语言大量涌现,也和创造编程语言所需的成本较低有关。

尽管大部分程序员,对于“编程语言”抱有近乎崇拜的心态,但真相是,创造一门编程语言并将其实现的难度,甚至低于其他一些业务型软件。真的,古人云:“难者不会,会者不难”,确实一针见血。如果你也愿意花费时间去学习,那么就会发现,要实现一门现代编程语言,虽然谈不上非常容易,但是也绝对不是太难——当然,实现是一回事,实现得好又是另一回事了。能运行不代表性能好。当然,这又成了另外一个问题的答案——由于性能糟糕,或者其他致命的缺陷,我们虽然有那么多的编程语言,但是真正实用并被广泛应用的却寥寥无几。

虽然有很多冠冕堂皇的理由,但是说到底,即使是那些被万千程序员“膜拜”的“伟大的”编程语言,在被创造出来的时候,只不过是某个年轻的学生或者工程师脑子里的一个小小的想法,他们会说:“嘿,其实我觉得程序应该这么表达,你们看好了……”。然后日夜的工作之后,终于有了一个粗糙的语言轮廓;然后由于某些方面成功的设计,确实得到了一些应用;接下来在商业环境或者科研领域获得自己的一席之地,并不断向前发展。

总而言之,还是人们对编程语言的要求不同,才产生了这么多的编程语言。事情就这么简单!

马海祥博客点评:

我们遇到了问题,总是用程序员的思维期待着“救世主”式的编程语言,因此许多人发明了大量的编程语言,积极探索;另外,由于发明编程语言的难度并不如想象的高,因此也导致了编程语言的大量出现。可惜的是,大部分语言都有致命的缺陷,所以市场虽大,但优质商品却依然寥寥无几,探索还在继续!

本文发布于马海祥博客文章,如想转载,请注明原文网址摘自于http://www.mahaixiang.cn/bcyy/2076.html,注明出处;否则,禁止转载;谢谢配合!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/504695.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机保护地阻值,机房接地系统的一般接地电阻要小于多少欧姆?

机房接地系统宜采用综合接地方案,综合接地电阻应小于1欧姆。机房接地系统:(1)机房有四种接地方式:交流工作地、安全保护地、直流工作地和防雷保护地。(2)信号系统和电源系统、高压系统和低压系统不应使用共地回路。(3)灵敏电路的接地应各自隔…

计算机丢失wpcap.dll会影响什么,Win7系统提示wpcap.dll丢失如何解决?

最近有Win7系统用户反映,打开程序或者玩游戏的过程中都会出现wpcap.dll丢失的提示,这直接导致了程序无法正常打开以及游戏无法正常运行,用户为此非常苦恼。那么,Win7系统提示wpcap.dll丢失如何解决呢?下面,…

centos安装mysql5.7.12_CentOS二进制安装MySQL5.7.12

1、检查服务器上是否有其他版本的mysql数据库,可能会影响现有安装的数据库,卸载之yum -y remove mysql-libs-5.1.73* (rpm -e mysql..... --nodeps)2、安装mysqltar -zxvf mysql-5.7.12-linux-glibc2.5-x86_64.tar.gz -C /usr/local/(解压安装包文件)mv …

linux 启动一个网站_在线试用 200 多种 Linux 和 Unix 操作系统

只要打开该网站,选择你需要的 Linux/Unix 发行版,然后开始试用!-- Sk(作者)不久前我们介绍过 OSBoxes ,该网站提供了一系列免费且开箱即用的 Linux 和 Unix 虚拟机。你可以在你的 Linux 系统中下载这些虚拟机并用 VirtualBox 或 V…

搭建微信令牌中控服务器,使用ThinkJs搭建微信中控服务的实现方法

本人前端渣渣一枚,这篇文章是第一次写,如果有硬核bug,请大佬们轻喷、指出... 另外,本文不涉及任何接口安全、参数校验之类的东西,默认对调用方无脑级的信任:joy: 目前自用的接口包括但不限于以下这些|--- 微信相关| |-…

华为服务器sn号查询网站,linux 查询服务器sn

linux 查询服务器sn 内容精选换一换Linux云服务器变更规格时,可能会发生磁盘挂载失败的情况,因此,变更规格后,需检查磁盘挂载状态是否正常。本节操作介绍变更规格后检查磁盘挂载状态的操作步骤。以root用户登录云服务器。执行以下…

jdba访问mysql_mysql连接出现问题记录

解决:Caused by: com.mysql.cj.exceptions.InvalidConnectionAttributeException: The server time zone valu//报错信息Caused by: com.mysql.cj.exceptions.InvalidConnectionAttributeException: The server time zone value ‘‘ is unrecognized or represents…

python制作表白神器_python制作exe可执行表白神器-Go语言中文社区

1、效果图2、程序源码import turtleimport time#writing txtturtle.hideturtle()turtle.penup()turtle.goto(130,50)# turtle.pendown()turtle.color("blue")turtle.write("亲爱的,给你画个东西",font ("Times",18,"bold"…

qtp连接mysql 无驱动_QTP连接MySQL

1、安装 Connector/ODBC2、查看数据源名称『控制面板』- 『管理工具』- 『数据源(ODBC)』-『添加』3、连接数据库Dim Conn,ConnString创建数据库实例Set ConnCreateObject("ADODB.Connection")连接字符串ConnString"Driver{Mysql ODBC 5.2w Driver};DATABASEmys…

python保存模型的路径怎么写_使用python在MongoDB中保存机器学习(ML)和深度学习(DL)模型...

我们知道,当我们训练机器学习或深入学习模型时,我们必须保存训练过的模型,以便将来进行预测。现在的训练模型非常昂贵,所以如果我们能够保存它们并将其用于解决其他一些问题。例如,一个训练过的能够识别汽车的神经网络…

java token_Java实现基于token认证的方法示例

随着互联网的不断发展,技术的迭代也非常之快。我们的用户认证也从刚开始的用户名密码转变到基于cookie的session认证,然而到了今天,这种认证已经不能满足与我们的业务需求了(分布式,微服务)。我们采用了另外一种认证方式&#xff…

java jni helloword_JNI学习一:编写HelloWorld程序

转载请说明出处~本文教程翻译jni官方文档的部分内容。要查看Jni官方文档,请点击这里先感叹一下时光如水,岁月不留人哇有木有!!!认真想想在XMU的这三年,真的改变了我好多。我还清楚地记得学习C语言写的第一个…

【学习记录】macOS的Redis安装及基本使用

【学习记录】macOS的Redis安装及基本使用一. Redis的安装与启动二. 简单使用① 尝试插入第一个key-value② Redis的数据类型与基本使用字符串列表字典(哈希表)集合有序集合三. 杂乱无章的笔记一. Redis的安装与启动 打开终端,输入以下命令即…

【学习笔记】JAVA基础——异常处理部分

文章目录前言简介一. try、catch与finally① try && catch② finally③ throws补充:JVM 相关二. 异常的分类① 分类解释与思维导图三. 自定义异常例子:Hero类的attack方法的isDeadException。四. 上传代码到GIT① 首先在github新建一个仓库Java_…

【学习笔记】数据链路层的差错控制——检错编码与纠错编码(海明码、奇偶检验码与CRC循环冗余码)

文章目录前言一. 差错控制简介二.补充知识三. 检错编码(1)奇偶检验码组成:构造方法:以奇检验码为例。举个例子:检验码求法:错误检测方法:特点(2)CRC循环冗余检验码三要素…

【学习笔记】数据链路层——流量控制:停止等待协议、后退N帧协议(GBN)、选择重传协议(SR)

文章目录一. 流量控制① 必要性② 数据链路层 VS 传输层③ 定义④ 方法1)停止等待协议2)滑动窗口协议关系:包括:3)协议对比二. 停止-等待协议必要性应用情况① 无差错情况② 有差错情况1)数据帧丢失&#x…

java线程唤醒与等待_Java线程的等待与唤醒

生产者和消费者必须使用同步代码块包裹起来,保证等待和唤醒只能有一个执行,同步使用的锁对象必须保证唯一Thread中重要方法void wait() 在其他线程调用此对象的notify()方法或notifyall()方法前,导致当前线程等待void notify() 唤醒在此对象监…

【学习笔记】数据链路层——信道划分访问控制(FDM、TDM、STDM、WDM、CDM CDMA)

PPT截自王道考研B站教程 一. 铺垫知识 ① 传输数据使用的两种链路 星型、总线型都是广播式结构。 星型更有容错率,总线型断一个则全断。 ② 介质访问控制 定义 采取一定措施,使得两对节点之间的通信不会发生互相干扰的情况。 分类 多路复用&…

【学习笔记】数据链路层——随机访问介质访问控制(ALOHA、CSMA、CSMA/CD、CSMA/CA),截断二进制指数规避算法

文章目录小前言一. ALOHA协议纯ALOHA协议时隙ALOHA协议ALOHA对比CSMA协议定义与分类① 1-坚持CSMA② 非坚持CSMA③ p-坚持CSMA总结CSMA/CD协议传播时延对载波监听的影响确定重传时机:截断二进制指数规避算法最小帧长问题CSMA/CA协议工作原理CSMA/CD 与 CSMA/CA的对比…

pca算法介绍及java实现_PCA算法原理及实现

众所周知,PCA(principal component analysis)是一种数据降维的方式,能够有效的将高维数据转换为低维数据,进而降低模型训练所需要的计算资源。以上是比较官方的说法,下面是人话(正常人讲的话)版。pca就是一种能够有效压缩数据的方…