对编程语言的认识

编程语言的战争 

绝大多数程序员在绝大多数时候都会选择使用高级语言,现在很少人使用汇编语言。只有少数最关键的还可能会用到汇编语言。比如开发某个计算机游戏时,你需要微光水平控制硬件,使得游戏速度得到最大限度的提高。

FortranLispCobolCPascalSmalltalkC++JavaPerlPython等等都是高级语言它们只是比较出名的几种而已,现在的高级语言大约有几百种之多。不同机器语言指令集基本相同,但是高级语言就不一样,它们开发程序的模式差别非常大。

那么,应该使用哪一种语言呢?关于这个问题,一直存在很大争议。部分原因是,如果你长期使用某一种语言,你就会慢慢按照这种语言的思维模式进行思考。导致你遇到其他任何一种有重大差异的语言,即使那种语言本身没有任何不对的地方,你也会觉得难用。这也是为什么那么多程序员对各种语言的优缺点的判断经常被这种心态误导。

可能是因为出于炫耀自己见多识广,某些人会告诉你所有高级语言基本相似。这完全就是谬论,各种语言简直天差地别,好比Fortran I最新版的Perl两种语言就完全不同,而早期版本的Perl最新版的Perl之间的差别也大的惊人。当然,的确有可能使用不同的语言写出了与原始的Pascal语言写的差不多的程序。就好比你吃过麦当劳,就会知道全世界各地的麦当劳的味道几乎都一样。

一些人喜欢用自己的语言,反感其他所有语言。而另一些人则说所有语言都一样,其实事实介于这两个极端之间。语言之间确实存在差别,但很难说哪一种语言是最好的。毕竟这个领域依然还在快速发展。

对编程语言的认识

2017年编程语言排行榜

抽象类

高级语言汇编语言更接近人类语言,而某些高级语言又比其他语言更进一步。举例来说,C语言是一种低层次语言,很洁净硬件,几乎可以堪称可移植的汇编语言,而Lisp语言的层次则是相当高。

如果高级语言比汇编语言更有利于编程,也许你会认为语言的层次越高越好。一般情况下的确如此,但不是绝对的。编程语言可以变得很抽象,完全脱离硬件,但也有可能走错了方向。比如Prolog语言,它的抽象能力很强,但却只能用来解决2%的问题,写出来的程序实际上就是Pascal语言的程序。

另一个你会用到低层次语言的原因就是效率的问题。如果你非常关注运行的速度,那么最好使用接近机器的语言。大多数操作系统都是用C语言写的,这也并非偶然。不过硬件的运行速度越来越快了,所以使用C这样低层次语言开发应用程序的必要性也正在不断减少,但是大家似乎还是要求操作系统越快越好。(另一种可能是,人们还是希望“缓存区溢出攻击”继续存在下去让大家时时刻刻保持警惕)

安全带还是手铐?

语言设计者之间的最大分歧也许就在于,有些人认为编程语言应该防止程序员干蠢事,另一些人则认为程序员应该可以用编程语言干一切她们想干的事。Java语言是前一个阵营的代表,Perl语言则是后一个,而*语言派则嘲笑另一方是“B&D”(奴役和戒律,Bondage and Discipline)语言,我不知道如何反击这些喜欢Perl的*派,因此我就无从知道。(这也是为什么美国国防部很看重Java的原因)

由于防止程序员做蠢事有好几种方法,所以上面争论逐渐分化成几个较小的议题,也就是静态类型语言动态类型语言之争。前者写代码时必须知道每个变量的类型。而后者是随便什么时候都可以把变量设置为任意类型的值。 静态类型语言的拥护者认为这样可以防止BUG,并且帮助编译器生成更快的代码(这两点理由都成立)。动态语言类型的拥护者则认为静态类型对程序构成了限制(这点理由也成立)。所以,这个问题依然值得讨论,并没有固定答案。

面向对象编程

眼下另一个争论的热点则是面向对象编程。它是一种不同的组织程序的方法。假定你要写一个程序,计算二维图形的面积。受限你必须知道它到底是什么图形。一种解决方法是用一整块代码判断遇到的是什么图形,然后再用相应的公式计算面积。而面向对象编程不是这样,它的方法是写出多个类,然后每一个类里面用一小块代码(叫做方法)计算该类图形的面积。求面积的时候你就要问哪一个类,然后再使用相应的方法得出答案。

这两种方法可能听上去很相似,事实上,运行代码后,实际计算面积的运算过程也很相似。(但是这不奇怪,因为你本来就在解决同一个问题。)但是,代码的形式却是大相径庭。在面向对象编程的方式中,计算图形面积的代码可能分散不同的文件中。同类型的放在同一个类型中。

对编程语言的认识

面向对象编程

面向对象的优点在于,如果你需要修改程序,计算另外一种图形的面积,你只需要再另外增加一块代码就行,甚至可以不用修改程序其它部分。但是也有反驳者会说,这种方法的缺点是,由于增加代码不用考虑其他部分,结果往往导致写出性能不佳的甚至有副作用的代码,就好比起房子不考虑已经完成的部分一样。关于面向对象编程的优劣的争论并不像静态类型动态类型之中选一种。但是,面向对象编程只是程度不同的问题。事实上有两种程度的面向对象编程某些语言允许你以这种风格编程,另一些语言则强迫你一定要这样编程。

我个人觉得后一类语言不可取。允许你做某事的语言肯定不差于强迫你做某事的语言。所以,至少在这方面我们可以得到明确结论:你应该使用允许你面向对象编程语言。至于你到底用不用则是另外一个问题了。

编程语言的文艺复兴

有一个问题,我相信很多人都会同意,那就是出现了很多新的编程语言。直到20世纪80年代,只有大机构才买得起开发编程语言所需要的硬件,所以大多数编程语言都是大公司的教授或者研究员开发的。而现在,一个高中生就能搞到所有必需的硬件。

Perl语言的设计者拉里•瓦尔的例子启发了很多黑客:为什么不动手自己设计一种 自己的语言呢?只要你懂得驾驭开发源软件社区,就会有很多人在短期内为你提供大量的代码。结果产生了一些语言:它们的内核设计得非常好,但是却有着无数强大的函数库,可以用来解决特定的问题。有一些很繁琐、很普遍的问题,程序员本来要花大量时间来解决,但是有了这些函数库以后,解决起来就变得很容易,所以这些库本可能比核心的语言还要重要。因此,这些奇特组合的语言一时间变得相当流行。

另一个就是语言的多样化。编程语言之间总是存在很大区别。Fortran、Lisp、APL都是1970年以前开发出来的,它们之间的区别大的很。新兴的开源编程语言肯定将继承这种传统。 每出现一种新的语言,乔纳生•埃里克森把这种现象称为“编程语言的文艺复兴”,人们有时还会用另一个说法,即“编辑语言的战争”。这并不矛盾,文艺复兴期间就是存在很多战争的。

所以,程序员活在这个文艺复兴时代可能是一件好事。如果我们所有人使用同一种编程语言,反而是坏事。
对编程语言的认识

编程语言结构图