编程语言之争

编程语言之争

有很多对编程刚入门的童鞋来问我学什么编程语言好,说实话这是一个没有答案的问题。作为一个老菜鸟,我觉得我有必要写一篇文章来聊聊编程语言,并简单谈谈主流编程语言的特点。

每一个刚刚接触编程的童鞋,在网上搜索编程相关的内容时,就会看到各种编程语言的课。不出意外的话,在面向普通人的网站或APP,总会蹦出那么几个语言吹。吹哪个语言好,哪个语言世界第一。(PHP是世界上最好的编程语言)其中尤其是Python被吹的最恨,什么人工智能的编程语言,面向未来的编程语言。坦白来说,这是一种非常幼稚的行为,编程语言没有好与不好,只有是否适合当前的应用场景。

首先我们来了解一下,为什么我们需要编程语言?以及为什么有这么多的编程语言?回到上个世纪,计算机刚出现时,人们为计算机编写程序是一件十分痛苦的事情。当时的人们使用打孔纸来编写程序。通过打孔纸上的对应位置是否有孔来表示0和1,通过0和1构成的机器语言来命令计算机执行指令。后来有了键盘,人们发明了汇编语言,大大减小了开发程序的难度。但汇编语言不能视为编程语言,它只是将哪些枯燥的0和1变成了一些缩写的英语单词。除此之外,汇编语言还有一个重大的问题没有解决。那就是与硬件高度耦合的问题。用汇编语言编写的程序,一旦硬件发生变动就必须重写。这个问题被Unix和C语言联手解决了。有了操作系统,程序员不再为一台具体的计算机编写程序,而是为一个操作系统编写程序,这样当硬件发生变动后,由操作系统消除硬件的差异。这同时意味着程序员只需要为一个操作系统编写程序,它就能运行在安装了相同系统的其它计算机上,这大大提升了开发效率。

后来随着时代的发展,一种新的编程范式出现了——面向对象。C++之父将C语言和面向对象结合诞生了C++。由于C语言的使用者们认为C语言就应该尽可能接近汇编语言的逻辑,因此C语言到现在为止也没有加入面向对象这类新时代编程语言的特性。后来互联网和操作系统百花齐放的时代来临,开发者们不得不为多个操作系统编写网络程序。这当然让开发者们苦恼,于是Java之父带着Java语言来了,并喊出了“一次编写到处运行的口号”。Java之所以能做到这一点,是因为Java引入了一个新的东西——Java虚拟机。开发者编写Java代码后,由Java编译器将其编译为字节码,Java虚拟机在运行时将字节码编译为目标平台对应的机器码。通过添加一层虚拟机,Java实现了对操作系统的解耦,算是一大进步。但凡事皆有代价,Java引入了虚拟机必然会使程序的执行效率下降。不过互联网时代的服务器程序却有一个特点使得Java造成的性能下降是可接受的,那就是IO操作远多于计算操作。互联网时代的服务器程序处理网络请求所执行的IO操作是非常耗时的。除此之外,Java还引入了GC(垃圾回收器),将C/C++程序员从手动管理内存的苦海中解放出来,大幅提升了开发效率。因此Java理所应当地受到了互联网企业的青睐。看到Java如此爆火而且受到Sun公司的控制,微软可就坐不住了于是发明了C#来对抗Java。除此之外,当时的微软还山寨了Javascript搞了个Jscript,不过现在Jscript已经停止更新,C#的核心 .NET Framework 在2014年选择开源后,C#也逐渐蒸蒸日上。10年代开始,开发者们发现程序中大多数错误都是因为指针(引用)为空或者指向一个错误的位置造成的,于是一种新的编程范式诞生了——RAII(Resource Acquisition Is Initialization)。这种新的编程范式简单来说就是,要求变量在创建时就要被赋值并且不允许使用NULL。一些比较新的编程语言如Rust强制要求使用RAII作为编程范式,而一些给原来的语言打补丁的编程语言,如Kotlin、Typescript则提供了这套机制并建议用户尽可能地使用。

综上所述,之所以有这么多编程语言是因为面对不同的使用场景,用对应的语言能更好的权衡开发效率,执行性能等多种因素之间的平衡。

当然目前对于Python的过分吹捧,我有必要提出一些让读者冷静的观点。首先对Python的吹捧主要在两个地方,一个是Python在人工智能领域的广泛应用,另一个则是Python多年蝉联TIOBE编程语言排行榜榜首。对于以TIOBE榜评价编程语言好坏的行为,一定要严厉地批评。TIOBE榜单的排名依据是搜索指数,这是一个非常片面的排名依据。Python之所以拿第一,是因为Python的使用人群主要来自于编程需求不是特别高的领域,例如各种数学相关的专业抛弃了R语言,开始用Python编写计算程序和数据分析程序。这群人一有不会的就会去搜索引擎搜索,再加上他们人数远大于编程领域的开发者,这就造成Python的排名很高。实际上编程领域这边的人出了问题,更喜欢上Github、Stackoverflow等网站寻求帮助。而根据Github和Stackoverflow发布的榜单,Javascript才是使用最广泛的编程语言。这也很正常,毕竟现在Javascript几乎是前端唯一的编程语言了。对于Python在人工智能领域广泛应用是因为开发人工智能的专家不是特别擅长编程。因此每当他们有新的想法是就会将其描述成算法,交给程序员使用性能较强的编程语言开发(主要是C++),然后再封装成Python API供他们调用以进行研究。毕竟脚本语言在性能上永远不可能打败编译语言,而现阶段的人工智能对计算性能的要求却很高。因此Python并不是人工智能领域不可或缺的编程语言,也许未来有了更好的脚本语言,Python就会走R语言的老路。