精子生于 1995 年,英文 ID jysperm.
世界上最好的编程语言
谈到这个话题,一定会有两种人跳出来。
一种人说,PHP 是世界上最好的编程语言;另一种人说,编程语言都大同小异,掌握了思想,什么都简单了。
首先我认为所有切实存在,功能重叠的事物,都是可以比较优劣的,有时不说出真相,只是真相太残酷。『优秀』并非是主观的,而是客观存在的,世界上存在着被广泛认同的『优秀』。否则,作家,设计师,设计编程语言的科学家,应该以什么为目标来工作呢?
那么什么又是编程的思想呢?是循环,回调,面向对象这些么?但似乎并非每个编程语言都有这些元素。我在知乎『优秀的程序员应该掌握多少门编程语言』中列举了几种我了解的,各自具有代表性的编程语言:
- C, 使用原始的内存管理的系统编程
- Java, 工业级的面向对象的,静态类型的虚拟机语言
- Python, 脚本语言,动态类型的虚拟机语言
- Javascript, 基于事件回调的函数式编程
- HTML/CSS, 声明式的语言
- Golang, 并发编程
可以看到,它们风格迥异,使用的领域似乎完全没有重叠。
非要找共性的话,大概是它们都具有『抽象』的能力,描述『算法』的能力,这也是有些人口中的『思想』,但我不认同。
抽象是为了找到解决问题的方法,而编程语言是为了将解决问题的过程(算法)表达出来。
知道如何解决问题,不代表就能够用编程语言表达出来;掌握编程语言,也不代表知道如何解决问题。
我们学习一门编程语言本身的时间并不多,更多的时间在学习它的函数库,以及特定编程环境下的限制。
例如学习 C 语言,我们需要知道计算机如何管理内存,如何实现函数调用,还要学习如何通过标准库进行输入输出,而 C 语言本身的语法,完全可以用一个小时描述清楚。
所以,我们抛开这一切,去寻找世界上最好的编程语言呢。但结果是不存在,因为现在流行的编程语言设计者目光都太短浅。
没错,优秀的不一定是用的人最多的,不一定应用得最广泛,所以编程语言的设计者需要折中,拿出不那么优秀的设计作为最终方案。
比如 PHP 之所以流行,是因为支持 PHP 的虚拟主机最便宜。
比如 C 之所以流行,只是因为有太多项目一开始是用 C 写的。
比如 Python 之所以流行,只是因为库足够多。
比如 Javascript 之所以流行,因为在浏览器里这是唯一选择。
他们都不是因为语言本身被设计得有多么优秀而流行的。
我认为世界上最好的编程语言需要有这样的特征:
- 核心足够小
- 可以扩展语法
- 围绕一种数据结构展开
- 优秀的抽象能力
- 可以被编译成本地代码
世界上最好的编程语言应当是全能的,否则如何和其他编程语言做比较呢?要做到这一点,就要保证这个语言的核心部分是最小的,不偏向于任何一个领域,也减少学习成本。
这方面的正面例子有 Lisp, Lisp 中的一切都是列表,核心部分仅包括不到十个基本运算符。从这个角度来看,你根本不知道 Lisp 是被设计用于什么领域的——这是世界上最好的编程语言所必须的要素。
但是 Lisp 没有火起来,因为有个笑话说的是一个 Lisp 程序末尾要有整整一页的括号。
所以世界上最好的编程语言需要能够灵活地扩展语法,这个概念通常被称为元编程,例如 Ruby 就号称支持元编程,虽然我没有体验过。
除了扩展语法之外,最好还要能够改变程序在编译时的行为,这会加强元编程的能力,也会对提升性能有一定帮助。
比如 PHP 和 Python 都支持用 C 编写扩展,如果这种语言支持用自己本身来写扩展,并且能够干预编译器的行为,那么这种改造会让它适合几乎所有领域的编程。虽然干预编译器的行为是很危险的行为,只有少数人会编写这种扩展,但是这总要比设计一门新的领域特定的语言要容易。
可以扩展语法,这是保证世界上最好的编程语言能够快速适应各种特定领域编程的重要条件。
世界上最好的编程语言应该内置一种数据结构,能够方便地在程序内,甚至包括程序外进行数据交换,让整个语言围绕着这种核心的数据结构展开,具有一种『一致性』的美感。
这方面正面的例子是 Lisp 和 Javascript, 但 Javascript 做得还不够好,类型系统中有很多陷阱。
世界上最好的编程语言还应该有优秀的抽象能力,比如 C 的抽象能力就不够,组织大型项目会非常麻烦。Lisp 的抽象手段又太单一,Java 和 C++ 的特征又过于复杂。
『可以被编译成本地代码』这才是最具有挑战性的一个特征,前面我提了很多变态的需求,它们都需要在可以被编译成本地代码的条件下实现。可以被编译成本地代码,表示这种语言不需要虚拟机,可以自行提供各种功能,性能上也有更多的优化空间。
在发表这篇日志之前,又看了一遍王垠写的『如何掌握程序语言』,顿时觉得自己的日志似乎没必要发了,但是既然写了,还是发出来好了。