(深度思考)为啥我们的语言都长一个样

186 阅读4分钟

为什么我们的编程语言都很像?

首先我们来提出一个问题,编程语言它的本质是什么?

先让我们来看最简单的一个程序

const a=1;
const b=2;
c=a+b;

其中上面a,b,c,1,2我们都可以理解为数据,数据的本质其实就是“不同”,数据的本质就是对不同的抽象,而cosnt ,=,+这些我们可以理解为指令,不管再复杂的程序最终都是由数据和指令这2个方面完成的,

所以对于编程语言来说它的本质就是数据和指令,就是想用有限的元素去构建无限的可能性。但问题还没解决,现在我们再想想凭什么编程语言的本质是数据和指令,那编程语言就不可以是其他方式来实现吗?

这里我查阅了一下资料,发现在当时数学家们在思考怎么用最简单的一个方案能构建出能够解决宇宙中任何可能出现的数学问题的一个系统,当数学问题都能解决掉,那现实生活中很多问题也能通过这个系统来解决掉,因为现实生活中很多问题都是可以投射到数学问题的。

当时有三个方案比较流行,那就是λ演算法,元胞自动机和图灵机

λ演算法

λ演算法演算是从数学的角度进行抽象,不关心运算的机械过程而只关心运算的抽象性质,只用最简洁的几条公理便建立起了与图灵机完全等价的计算模型。

其实λ 演算只做三样事情:

  1. 给个输入变量;
  2. 用 λ 表达式来构造函数;
  3. 把函数应用于变量上。

举个例子:

f(x)=x+1

0=01=f(0)
​
2=f(f(0))
​
3=f(f(f(0)))
​
n=f(f(f(f(0))))...后继函数的n次调用

如果你愿意,就表示自然数的每个符号,但显然是不方便阅读和书写的

像一些基础的加减法都是能够实现的,但是就是比较难书写,也不太好让人理解。但它的的确确是跟图灵机是等价的,也是能解决几乎所有问题(除了停机问题等问题)

元胞自动机

元胞自动机:它是由无限个有规律、坚硬的方格组成,每格均处于一种有限状态。整个格网可以是任何有限维的。同时也是离散的。每格于t时的态由t-1时的一集有限格(这集叫那格的邻域)的态决定。每一格的“邻居”都是已被固定的。(一格可以是自己的邻居。)每次演进时,每格均遵从同一规矩一齐演进。

其实元胞自动机更多的是相当于一种思想、一种框架,通过设置一套规则,将时间离散化后,对元胞进行规则下的随时间的演化。

至今元胞自动机已经有了非常广泛的应用,典型应用如交通流模型、人员疏散模型、森林火灾模型、传染病模型、土地利用演化模型、城市发展扩张、交通状况模拟、博物馆逃生模拟等等

演示视频

而我们现在一般接触到的编程语言都是图灵机演变过来的,而面向对象编程这个编程思想也是参考了λ演算法这个方案来改进的,而这3种方案都是图灵完备的,后面也证明了他们三种方案都是等价的,也都可以通过这三种方案来实现通用计算机。但因为数据➕指令这种模式更容易被人们所理解,建模,相反而λ演算法,元胞自动机的实现起来都比较抽象,也不好建模,数据➕指令最后也都被编程语言说使用。

最后总结:

为什么现在的编程语言都可以分成数据和程序两部分,因为所有的编程语言都是基于图灵机来实现的,数据和程序是图灵机里面天生机有的,为什么用图灵机而不用别的方案呢,因为图灵机已经到达天花板了,它做不到的别人也做不到,就像我们现在分析一个问题的可计算性,其实就是在说是不是可以用图灵机解决的

图灵机相比的优势是容易理解和编写,同时解构式编程,面向对象编程,mvc架构这些更好给我们解构的方式也都是在数据➕指令这个优势之上建立起来的