了解编程语言的分类,有助于选择 the right language for the job 。Peter 这里给出三个分类的角度。

是否需要编译

第一个分类角度很简单,就是按照语言在执行之前是否需要编译。需要编译的,叫做编译型语言,Compiled Language 。不需要编译的叫做解释型语言 Interpreted Language 。

编译型语言,例如 C 语言,写好之后,通过编译器编译成二进制文件,就可以在 CPU 上执行了。运行的时候不需要依赖于其他软件,所以一般执行效率高。

解释型语言,例如 Python ,Ruby 或者 Javascript ,写好之后无需编译,直接运行于自己的解释器之上。解释型语言因为跟硬件隔了一层,所以效率上一般是比较低的,但是功能上可以更为灵活。解释型语言有时候也叫脚本语言 Scripting Language ,二者是一个东西。

这就是第一个分类角度。注意,很多语言也会同时使用编译和解释的方式来执行,例如 Java 就先编译成 bytecode 然后再虚拟机上执行。C 语言也可以根据需要在解释器上执行。

与硬件的距离

第二个分类角度是与硬件的距离。可以分为比较低级 Low-level 的语言和比较高级 High-level 的语言。

最低级的的语言就是机器语言。写程序就是根据硬件指令集写 0101 ,当然一般都用八进制表示。

接下来是汇编语言。它对硬件指令做了简单的封装,一些操作可以用 ADD ,MOVE 等英文单词来表示了,但是写出程序来依然是只有了解计算机的人才能看懂的。

除了上面两种,其他语言都是高级语言。高级语言中也有相对低级和高级的。例如 C 就属于非常低级的高级语言,因为 C 语言中也还是时不时的会用到硬件知识。而类似 Ruby 或者 JS 这样的脚本语言就基本不用操心硬件的事了,一门心思完成业务功能就可以了。

一般来讲,跟硬件离的越近,就越能通过打磨去挖掘硬件潜力,写成的程序执行效率就会越高,但是开发效率肯定也就越低。

编程范式

最后要多聊几句的就是按照编程范式,Programming Paradigm ,来分类。

什么叫范式呢?简单来说就是大思路,大风格,可以近似理解成 Way 。编程范式是有很多钟的,咱们这里挑一些比较有意思的来聊聊。

大家听的最多的两种范式就是面向对象编程和面向过程编程。面向过程编程就是把操作转换成语句一步步的去做,主要使用顺序、条件选择、循环三种基本结构来编写程序,典型代表是 C 语言。面向对象编程是先把数据封装成对象,通过对象之间的交互来实现功能,典型代表是 C++ 和 Java 。

但是 Peter 觉得,最值得拿出来对比的,其实是面向对象编程和函数式编程这两种编程范式。我们大家都是对面向对象编程很熟悉,但是对于函数式编程往往重视程度不够。原因也很简单,就是面向对象的思想在产业界是占据统治地位的。但是最近几年,随着前端大爆发和 React 的大规模使用,函数式编程又开始回到了大众视野了。Peter 自己是函数式编程铁粉,认为理解“变量不变性”,是写好程序的必备知识。

另外,命令式编程 Imperative programming 和声明式编程 Declartive programming 也很值得了解一下,对比一下 jQuery 和 Reactjs 修改 DOM 的方式就清楚这二者的区别了。

不过,按照编程范式来对语言进行分类其实是比较模糊的。首先,编程范式总体来说是一种思想,是可以互相借鉴的,例如 C 语言虽然不是面向对象语言,但是也一样可以借鉴面向对象的思想来写代码的。其次,编程范式之间也互有交叉,例如面向过程编程范式其实就是一种命令式编程范式。最后,大部分语言都是多范式语言,维基百科上 https://en.wikipedia.org/wiki/Comparison_of_multi-paradigm_programming_languages 有一张完整的表。上面可以看到 Javascript 是同时支持函数式编程和面向对象编程的,Rust 也是。

这就是按照范式来进行分类,也就是按照做事情的大思路来分类。

总结

这就是非常常见的编程语言分类的三个角度了,分别是按照是否需要编译,与硬件的距离,编程范式。其他一些分类角度也很有意思,例如分静态和动态,强类型和弱类型等等,这里我们就不展开了。

参考: