当前位置: 首页 > 科技观察

为什么有这么多编程语言?

时间:2023-03-17 12:59:50 科技观察

据说人类建造通天塔是为了得罪神,神施法让人类语言混乱,无法相互交流。这意味着各种语言实际上是麻烦的根源——它只会导致交流的不便。但看看今天编程语言的数量,你会怀疑人类是不是又在建造“巴别塔”了?这么多语言真的有必要吗?我要学多少种编程语言才够?根据维基百科,至少有600种编程语言可以称得上是比较“主流”的(有人用,有文档),还有大量商业化失败、实用性低、小众的语言(这里“语言”是指编码语言。一般的编程语言习惯使用拉丁字母集或其超集作为源代码的字符集。也有日文、俄文编程、中文编程,如易语言)很难统计(保守估计可以上万。)尽管现在已经有这么多的编程语言,但是仍然有大量的人投入大量的时间去开发新的语言。这不是在重复通天塔的故事吗?为了解释“为什么有这么多编程语言”这个问题,我想让我们看一下较新的编程语言流行度排行榜:榜单前十名分别是:C、Java、Object-C、C++、C#、PHP、Python、JavaScript、Perl和VB。下面我将根据这个排名来回答我们的问题。首先阐述一个基本观点:编程语言的产生主要有三个目的——实用目的、学术目的、商业和特殊应用需求。下面一一分解:1.实用目的可以看出,在排名中,C、Java、C++等语言几乎每年都排在前五名。这些语言的实用性非常高。让我们回顾一下C语言的历史:1973年,AT&T的KenThompson因为开发和维护操作系统的需要,要求一种高效简洁的编程语言,于是他在BCPL语言的基础上创建了C语言。Java、C++等语言也是在类似的高要求任务下临时创建,然后不断发布改进的标准(C语言是针对操作系统,Java是针对嵌入式应用和网络开发……)如果现有的轮子是不够好,所以自己造一个轮子。正是因为这个特殊的原因,所有这些实用语言都非常高效,语法构造方法、编程逻辑和配套的编译技术都非常成功,因此可以有效解决工程问题。另外,这些实用型语言的语法非常自由(Python是个例外,因为它有“清晰”和“简单”的哲学),正好满足了不同性格的程序员的需求。还有很重要的一点是:“决定一门编程语言是否强大的是这门语言的库(标准库、类库、包、组件、单元、模块……每种语言都有自己的名字)而不是编程语言本身”;这可能会让很多人不爽:老实说,C语言在语言的优雅和友好性(比如==和=)方面完全无法与Ada和Pascal相比(Ada是数学家设计的军人,Pascal是数学家设计的),但是C语言还是很流行的,这是因为你要写一个包含系统调用的程序,使用C语言是最好的选择,Ada和Pascal等语言想要直接和内核通信比较麻烦.同样的道理也可以解释C++、Java、Perl等语言的流行。如果要编写多线程程序,使用C++多线程库和Java包。如果你想写正则表达式相关的程序,用Perl或者C++的boost库就可以了……知道不要重新发明轮子很重要。遇到解决不了的问题,先查资料,看看有没有人写过类似的程序,把他的函数copy过来——恐怕很多人都会这样做吧?这些实用语言在长期广泛的使用过程中积累了大量优秀的库(C++STL、BOOST和一些编译器自带的库、MacOSX专用的Object-C库、Fortran方便科学的函数计算等),越来越多的程序员不断加入更好的库,使得这些“语言”越来越强大。在这些编程语言的发展过程中,既有一些公共库(如文件I/O),也有一些特殊库(如线程库、RE库)。优点,可以说是这些独立的库区分了不同的语言。从长远来看,程序员在解决某些特定问题时往往会使用特定的语言。这并不是说这些独特的库不能移植到其他语言,但由于代码量巨大,移植不是一个小工程。很难表达。比如C语言就有很多语言没有的显示指针。在Lazarus项目中,程序员开发了一个程序,可以自动将C头文件转换为Pascal单元。尽管如此,实现的代码量还是很大。源码到源码翻译的介绍请参考龙书介绍部分,不了解编译原理的请跳过)。由于有如此多的专用库,因此这些实用语言越来越多也就不足为奇了。2.学术目的无论是什么编程语言,在机器层面本质上都是0或1。所谓高级语言在机器眼里不过是废话(这正是编译技术的价值所在)。然而,人不是机器,也不能也不必是机器。创建编程语言的目的是为程序员服务。应该说,程序员使用的语言在很大程度上决定了他的思维方式——编程语言本身就是一种严密的数学模型,一种高效的思维方式。为了说明这个道理,我就拿一道物理题来举例说明:一辆汽车匀速直线运动,以2m/s的速度通过6m。汽车需要多长时间?显然t=s/v=6/2=3(s),这也可以通过制定方程求解:假设运动时间为t·s,则tv=s,即2t=6,解为t=3,这似乎是多余的。如果问题稍微“复杂”一点:小车以1m/s的初速度匀速直线运动,加速度为2m/s2,6m后,小车需要多长时间?根据运动学公式,方程V0*t+1/2*a*t2=s,即1*t+0.5*2*t2=6,求解为t=2,即需要2s.或者可以这样:v(t)=v0+a*t可以由速度与时间的关系得到,t也可以通过解这个方程得到。这时候用方程是很自然的,用定积分就显得多余了。我们从中学到什么?人的思维能力是有限的。面对复杂的新问题,要么用老方法计算麻烦,要么提出新的高效模型来解决问题。不管是算术,方程还是微积分,傅里叶变换还是其他高等数学方法,模型只是一个抽象层,把问题简单化(数学家看到我这么说估计会生气,但这是事实),打个比方,编程语言就像这里的数学模型。问题越复杂,规模越大(指问题的规模),越能体现一门高级语言的价值(有人用几十种语言写出“helloworld”,这有什么意义?我可以用机器语言编写helloworld)。知道了语言模型对思维方式的影响,我们就可以解释这么多语言的学术(或研究)目的:机器语言/汇编语言意味着程序员关注寄存器、内存地址、状态、位的开启或关闭,所以思考集中在每个实际指令上;而C、Pascal等命令式语言关注的是每一个“计算过程”,所以思维侧重于表达计算方法、算法和数学模型;而JavaC++、C++等面向对象的编程语言则试图用对象、类、属性、方法等概念统一描述算法和数据结构。因此,OO语言的思考可以集中在算法和数据上;Erlang、Prolog等函数式逻辑语言强调数学推导、函数运算和逻辑证明。我认为它们是最接近人类思维的语言;而像SQL这样的语言强调“高输出”,他们将常用的指令简化和“宏化”(Macronize,我自己创造的一个词),他们的思维是“做什么”而不是“怎么做”;***,它是一种和HTML一样的Markup语言(有人说HTML不是编程语言。。。)我个人认为是一种胶水(胶水语言,最著名的胶水是Lua),它描述了格式文本(如网页),同时它还将JavaScript、Applet和其他扩展“连接”在一起。他们的思维是“组合”,如何协调各个组件,最大化组件的功能(说到排版,不得不提TeX,它和HTML的思维类似,各种开发的宏集就是它的“组件”)。***我还想说一下“学术味”很浓的函数式语言。函数式语言历史悠久,但在学术界活跃多年,能成功商业化的寥寥无几。不燃烧的状态。不过今年随着编译技术的发展,函数式语言的执行效率已经非常高了。加之大数据时代对大量数据处理的需求、机器深度学习的成熟、现代架构计算机的发展,仅靠程序执行单线程的性能提升已经不能满足实际需求。只有并发和并发才能满足这样的高负载计算需求。纯函数式语言非常方便多线程,可以“榨干”处理器的计算潜力。近年来也是如此。像Erlang这样的语言大放异彩的一大原因。在现代计算机结构和技术发展的情况下,这些函数式语言可能成为提升计算能力的重要推动力。对此,请参考我的论文《AACOS:基于编译器和操作系统内核的算法设计与实现》(由于版权问题,我暂时无法发布论文:-))。3、业务和特殊应用需求(以下言论仅代表个人观点,无任何指责之意)开发一门编程语言可以赚钱,你信吗?其实,开发一门新的语言,就是建立自己的“统一标准”(说到标准,就不得不说高通了,高通靠“标准”赚了多少钱?),一方面可以方便维护另一方面,可以利用自己的市场地位,迫使程序员学习某种语言,从而达到自己(至少在某个领域)的霸主地位。为什么微软这么多年来一直对BASIC情有独钟?在DOS时代,BASIC的变种QBASIC是每台PC机上必备的应用程序,也是当时很多人不得不学习的语言。QBASIC无论是程序执行效率还是语言思维都不好。但因为是预装的,本着“不够好但够用”的原则,很多用户其实凑合着用(惭愧我是从QBASIC开始编程的)!这恐怕和IE用户那么多的原因是一样的吧?就这样,QBASIC一时间成为最流行的入门编程语言工具。后来微软推出VisualBasic,在入门级编程工具市场上与Borland的(现已收购)Delphi竞争(很长一段时间,VB都不是Delphi的对手,请参考我的另一篇文章《Borland和Microsoft的对话》,直接导致到C#的诞生——C#——C++、Java、ObjectPascal的混合体),依靠其BASIC用户的积累,在RAD领域做得很好,微软趁热打铁VBS/VBE、VBA等脚本语言相继推出,目的就是拉拢自己的VB用户,让这门拙劣的语言勉强适应系统GUI编程、办公套件编程、数据库编程,现在已经形成了一个有机的整体。一个程序员要么学习多种语言来完成不同的任务,要么学习一门不够好但够用的语言——然后,一招,吃遍天下……学习一门语言的成本非常高(需要timeandelectricity),所以很多程序员都会选择微软规定的这个标准。还有近年流行的Object-C、Swift、Go。尽管它们名义上是开源的,但谁知道它们的真正用途呢?另外还有很多DSL(Domain-SpecificLanguages,专业领域语言),比如处理文本的sed和awk,处理Web开发的PHP,扩展编辑器功能的EmacsLisp和Vim脚本,还有用于排版、批处理的PostScript以及各种shell脚本,用于shell编程等等。这里有一个典型的介绍:Adobe的ActionScript,它的作用是支持Adobe自己的Flash,主要用于Flash动画和应用,ActionScript语言本身再好,也只是一种扩展。嗯,我已经介绍了实践目的、学术目的、业务和特殊需求。相信大家对“为什么有这么多编程语言”这个问题有了更深刻的理解,也可能会有更多的疑惑。如果您有任何疑问或想与我交流,请留言。顺便问一下,除了我说的三个目的之外,还有其他的理由去创造新的语言吗?是的,我自己设计了一个叫Grove的语言,用“树”来完成过程式编程和lambda表达式,我会把解释器的源码发出来交流。我的目的是什么?只是为了好玩……不要想着你能为世界做些什么,想想你应该为世界做些什么!