传说人类建造通天塔触怒上帝,上帝施法令人类语言混乱彼此之间没法交流。这就是说各类各样的语言其实就是祸乱之源——只会致使交流的不便。但是看看现在的程序设计语言的数量,你会怀疑人类是否又在造“通天塔”了?真的有这么多语言的必要吗?我到底要学习多少种程序设计语言才够用呢?程序员
根据维基的资料,能够称得上相对“主流”(有人用、有文档)的程序设计语言至少有600种,还有大量的商业化失败、实用性不高、语言小众(这里的“语言”指的是编码的语言,通常的程序设计语言都习惯用拉丁字母集合或其超集来做为源码的字符集,也有用日文、俄文编程、汉语编程的,好比易语言)就难以统计了(保守估计能够上万种),尽管已经有了这么多种程序设计语言,仍然有大量的人投入了大量的时间来研发新的语言,这难道不是重复通天塔的故事吗?正则表达式
为了解释“为何会有这么多种程序设计语言”这个问题,想让咱们来看一份较新的最流行编程语言流行榜:算法
排行榜上排名前十的依次是:C、Java、Object-C、C++、C#、PHP、Python、JavaScript、Perl和VB。下面我会根据这份排行榜来回答咱们的问题。首先阐述一个基本观点:程序设计语言被创造的目的主要有三个——实用目的、学术目的、商业及特殊应用须要。且听一一分解:shell
能够看见在排行榜中,C,Java,C++这样的语言几乎是年年稳居前五。这些语言的实用性都是很是高的。让咱们回顾一下C语言的历史:1973年AT&T的Ken Thompson由于研发和维护操做系统的须要,要求一种高效简洁的程序设计语言,因而在BCPL语言的基础上创造了C语言。Java、C++等语言也都是在有着相似的高要求的任务下临时创造出来,而后再不断发布标准进行改进的(C语言是为了操做系统,Java是为了嵌入式应用和网络开发……) 若是现有的轮子不够好,那么就去本身造一个轮子,也正是由于这个特殊的缘由,全部这些以实用为目的的语言都很高效,语法构造方法、编程逻辑和配套的编译技术都很成功,因此可以切切实实地解决工程上的问题。另外,这些实用目的语言的语法都很自由(Python由于“明确”、“简单”的哲学因此算个例外),正好符合了不一样性格的程序员的须要。另外很是重要的一点是:“决定一种程序设计语言是否强大的是这个语言的库(标准程序库、类库、包、组件、单元、模块……每种语言都有本身的叫法)而不是程序设计语言自己”;这可能会让不少人不高兴:说实话,C语言在语言的优雅性和友好性上(好比==和=)彻底和Ada、Pascal比不了(Ada是军方人员设计的,Pascal是数学家设计的),可是C语言依然很是流行,这是由于你想要写一个含有系统调用的程序,用C语言是最佳选择,Ada和Pascal这样的语言想要直接和内核交流是很麻烦的。同理也能够解释C++、Java、Perl等语言的流行,你想要写多线程的程序用C++的多线程库和Java的包就好了,你想写正则表达式相关的程序用Perl或者C++ boost库就行了……懂得不要重复造轮子是很重要的,遇到不能解决的问题,先去查查资料看有没有人已经写好了相似的程序,直接把他的函数抄过来就是了——这恐怕是不少人都会作的吧?这些实用性的语言,在长期使用的普遍的使用过程当中积累了大量优秀的库(C++的STL、BOOST和有些编译器自带的库,Object-C专门针对Mac OS X的库,Fortran的便于科学计算的函数等等),并且还有愈来愈多的程序员在不断增长更好的库,这些都使这些“语言”愈来愈强大。数据库
这些程序设计语言在发展过程当中既有一些公共的库(好比文件的I/O),也有一些特有的库(好比线程库、RE库),这些特有的库每每是某一语言的最大优点,能够说正是这些各自独立的库把不一样的语言区别开来,久而久之,解决某些特定问题时程序员就倾向使用某一特定语言。这并非说这些特有的库没法移植到其它的语言上,只是因为代码量巨大,移植是在是个不小的工程(何况,在某种语言中表述很方便的语言在另外一种中就会难以表示,好比C语言有不少语言都没有的显示指针,在Lazarus项目中,程序员开发了一个程序用以把C头文件自动转换成Pascal单元,即便这样,实现代码的量依旧很大,这种源到源的语言翻译的介绍能够参见龙书的引论部分,不学编译原理的请略过)。由于有如此多的专用库,这些实用目的语言愈来愈多也就不稀奇了。编程
无论什么程序设计语言,在本质上都不过是机器级别的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。这个时候使用方程就很天然了,用定积分却显得多余。从中咱们知道什么?人的思惟能力是有限的,面对复杂的新问题,要么用就用原来老方法麻烦地进行计算,要么提出新的高效的模型来解决问题。无论是算术、方程仍是微积分、傅立叶变换或是其它高级的数学方法、模型都只是一个简化问题的抽象层(数学家看到了我说这句话恐怕会很生气的,但这就是事实),做为类比,程序设计语言就比如这里的数学模型,越是复杂的问题、越是大的规模(指问题规模),才越能体现出高级语言的价值(有人用过几十多种语言写”hello world”,这有什么意义呢?我用机器语言都能写hello world)。知道了语言模型对于思惟方式的影响,咱们就能解释这么多语言的学术上(或者说是研究上)的目的了:机器语言/汇编语言意味着程序员专一的是寄存器、内存地址、状态、位的打开或关闭,所以思惟重在每一条实际的指令;而C、Pascal这样的命令式语言注重每个“计算过程”,所以思惟重在将计算方法、算法、数学模型表达出来;而Java、C++这样的面向对象的程序设计语言,试图用对象、类、属性、方法这些概念来统一的描述算法和数据结构,OO语言的思惟所以可以重在算法和数据;还有像Lisp、Haskell、Erlang、Prolog这样的函数式、逻辑式语言,强调的是数学的推演、函数的运算、逻辑的证实,我认为它们才是最接近人的思惟的语言;而像SQL这样的语言,强调是“高产出”,它们是对经常使用的指令进行了简化、“宏化”(Macronize,本人本身造的一个词),它们的思惟是“要作什么”而不是“怎么作”;最后,是像HTML这类Markup语言(有人说HTML不是程序设计语言……)我的认为是一种glue(胶水语言,最有名的glue算是Lua了),它对文本(好比网页)的格式进行描述,同时又把JavaScript、Applet等等扩展“链接”在一块儿,它们的思惟是“组合”,是怎样才能协调各个组件、把组件的功能发挥到极致(提及排版不得不提提TeX了,它和HTML的思惟相似,各类开发好的宏集就是它的“组件”)。最后我还想再谈一谈“学术风味”很浓的函数式语言,函数式语言历史悠久,但多年以来一直在学术界活跃,少有可以成功商业化的,多年来一直处于不温不火的的状态。但随着今年来编译技术的发展,函数式语言的执行效率已经很高了,加上大数据时代对于大量数据处理的需求、机器深度学习的成熟、现代架构计算机的发展,仅仅依靠程序执行的单线程性能提高已经不可以知足实际需求了,只有并发和并发才能知足这样的高负荷计算要求,纯函数语言处理起多线程来十分方便,可以“榨干”处理器的运算潜力,这也是近年来Erlang之类的语言大放异彩的重要缘由。在现代计算机结构和工艺发展难度大的状况下,这些函数式语言可能会成为推进计算力的重要动力,这一点能够参见本人的论文《AACOS:基于编译器和操做系统内核的算法设计与实现》(因为版权的问题,我暂时不能把论文贴出来:-))。多线程
(如下言论仅仅是本人我的观点,没有任何指责的意思)架构
开发一种编程语言是能够赚钱的,你信吗?
实际上开发一种新的语言意味着创建本身的“统一标准”(提及标准就不得不谈高通了,高通从“标准”上捞了多少银子?),一方面能够方便维护本身的产品,另外一方面能够借助市场地位强迫程序员学习某种语言进而达到本身(至少在某一领域)的霸主地位。为何这么多年以来微软对BASIC情有独钟?在DOS时代,QBASIC——一种BASIC的变种,是每台PC上必装应用,也是当时不少人必学的一种语言,QBASIC不管是从程序执行效率仍是语言的思惟性上都很差,可是由于是预装的,本着“不够好但够用”的原则,许多用户竟然凑合下来了(惭愧本人就是从QBASIC开始接触编程的)!这恐怕和IE用户如此众多的缘由是殊途同归的吧?就这样QBASIC竟然一时成为了最受欢迎的入门编程语言工具。到后来,微软推出Visual Basic其实是为了和Borland(现已被收购)的Delphi竞争入门级编程工具市场(在至关长的一段时间内VB都不是Delphi的对手,能够参见本人的另外一片随笔《Borland和Microsoft的对话》,这直接致使了C#的诞生——C#——一种C++、Java、Object Pascal杂交的到的混血儿),凭借本身在BASIC用户上的积累,在RAD领域混得不错了,微软又趁热打铁的推出了VBS/VBE、VBA等等脚本语言,目的就是拉拢本身的VB用户,使这种糟糕的语言可以勉勉强强适应系统GUI编程、办公套件编程、数据库编程,好了如今造成了一个有机的总体。一个程序员要么学多种语言来完成不一样的任务,要么学一种不够好但够用的语言——而后,一招鲜,吃遍天……学习一种语言的成本是很高的(要时间和电费),因此有不少程序员会选择微软指定的这一标准。还有近几年大红的Object-C、Swift、Go,虽然名义上是开源的,可是谁知道他们的真正目的?除此以外,还有不少DSL(Domain-Specific Language,专业领域语言),好比sed和awk是为了处理文本,PHP是为了处理Web开发、Emacs Lisp和Vim脚本是为了扩展编辑器功能,PostScript是为了排版,batch和各类shell script是为了shell编程等等。这里介绍一个典型:Adobe的ActionScript,它的做用就是为了支持Adobe本身的Flash,主要用于Flash动画和应用程序,不论ActionScript语言自身发展的多好不过是一个扩展罢了。
好了,已经介绍完了实用目的、学术目的、商业及特殊须要,相信各位对“为何会有这么多种程序设计语言”这个问题有了更深入的理解,也可能有了更多的疑惑。若是你有任何疑惑或者愿意和我交流,欢迎留言。对了,除了我说的三个目的以外还有没有别的创造新语言的缘由?有,我本身设计了一种名为Grove的语言,用“树”来完成过程编程和lambda表达式,改天把解释器的源码发出来交流一下。个人目的呢?Just for fun……