编程语言的新体会

王垠在【为什么一种程序语言是不够的】这篇文章中说:

我们都知道,程序语言里包含了变量,数字,对象,函数等“元素”。它们就像物理学的基本粒子一样,可以用于构造我们所需要的几乎任何“模型”。既然所有的东西都是用基本粒子组成的,那么除了物理学,我们为什么还要有化学和生物?化学家使用的语言是化学元素,它们比基本粒子大很多。生物学家的语言就更大一些了,处于细胞的级别。那么为什么化学家和生物学家不使用基本粒子来描述他们的领域呢?
那是因为基本粒子无法提供足够的“抽象”。它们到底是如何组成原子,原子又如何能产生细胞,这些事情到现在还没搞清楚。用基本粒子来表示化学和生物学,那么我们恐怕要等很久很久以后才能描述化学和生物的现象和原理。

这个类比很有启发性,让我对编程语言有了新的体会。

到如今为止出现了这么多的编程语言,其实说到底就是为了利用不同语言的不同层次的抽象能力,来解决不同应用场合的问题。

汇编是纯机器的语言,每一句(除伪指令之外)都与CPU指令一一对应,用汇编编程就是直接用CPU指令编程。

C把不同的机器CPU指令进行统一的封装,封装之后我们可以用的就是C的语法,数据类型、函数、分支结构、循环结构,这样就大大的减小了编程的复杂度。但是说起来,C还是有着很多的“机器特性”,比如指针,比如char是1个字节,int有的机器里是2个字节有的是4个字节。我隐隐觉的我以前是写过这样的C代码:

1
2
3
4
5
char i;
for (i=0; i<250; i++)
{
...
}

这个是一个死循环。所以写C语言的时候还需要考虑这些方面的东西,在有些场合的话这些就有些影响注意力了。Matlab的M语言里,每个定义的变量都是C语言的双精度double矩阵,而且矩阵的大小维度是可变的,适合用来处理科学计算。然后就是一些动态类型语言,一个变量可以是整数,也可以是浮点数,还可以是字符串,一个列表(数组)里面可以同时放整数、浮点数、字符串,这些特性使用起来就更加灵活,就能更方便的表达一个人的想法。

所以按数据抽象能力来说的话,我觉得编程语言可以大致这么分类:

  • 直接与CPU指令对应的汇编语言;
  • 静态类型语言,如C、C++;
  • 动态类型语言,如LISP、Python;

就后面两种来讲,现在大量使用于各个场合的语言怎么说也有几十种。编程语言的语法特性远没有这么多,数据、运算、函数、类大体就这么几种。现实就是编程语言的之间语法差距是非常小的,分支、循环结构每个语言都有,C++、Java、C#的代码写起来多么的相似。决定一门语言是面向过程还是面向对象还是函数式其实只是一些很小的特性差距,这些差距会影响语言的抽象能力,但是跟主体部分比起来仍然算“小”。

王垠在文章的开头说:

我曾经希望设计出一种“终极语言”……

我觉得这种思路是对的,那就是——语言需要缩减。想象一下,按我上面的分类,其实我们只需要除汇编之外的两种语言:

  • 一种是面向机器的有一定程度抽象能力语言,用来方便的操作硬件和硬件之上的协议,并给上层提供接口。这方面C语言就已经很接近了。
  • 另外一种就是面向思维的语言,其语法特性是现在所有高级语言的语法特性的并集——支持各种编程范式、支持动态数据类型等等特性的一个最小最通用的一个实现。

然后这两个语言要在各个需求千差万别的场合应用的话,那就是针对这些场合开发相应的类库、框架,有必要的话开发相应的编译器。

会需要另外的语言吗?那除非是需要解决另外一个“维度”的问题,才会出现跟这些语言的语言特性“正交”的语言。