编程语言之争

编程语言之争

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

每一个刚刚接触编程的童鞋,在网上搜索编程相关的内容时,就会看到各种编程语言的课。不出意外的话,在面向普通人的网站或 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 语言的老路。