首页 > 代码库 > 程序是什么?

程序是什么?

写在前面

这篇文章的标题实在是太大了,也许你第一个疑问就是你能回答好这个问题吗?我想说,我不能,我也不打算把它回答好,因为我知道他并没有标准答案。或者更准确的说,每个人心中都有一个令自己感觉满意的答案。并且这个答案会随着自身感悟的变化而不断发生变化。

为什么问这个问题

写东西总归要有一个触动点?当然这篇blog也不例外。闲来无事总是喜欢思考点什么,有些问题能够通过简单的思考得出一个让自己满意的答案。但是前段时间突然冒出一个问题,这个问题咋一看,凡是接触过计算机的朋友都能回答。但是我却发现自己没法找出一个让我自己满意的答案。这个问题就是——程序是什么?经过一段时间的琢磨,只能说找到了一个马马虎虎的答案,也许继续纠缠下去,也不会有什么让我满意的答案出现。

我的思绪

我只能说接下来的一些问题是我在寻找答案的过程中的一些思绪,谈不上思考。我认为思考是需要有严格谨慎的逻辑来支持的思维过程,而我的一些想法看上去是零散的,不完备的。

  1. 关于程序的产生过程
    你也许会不假思索的说,是写出来的。恭喜你答对了,但是很抱歉,我不满意这个答案。程序的产生一般都是由问题驱动的。比如,我们常常遇到的“从一堆电话号码中,查找某位朋友的电话号码“这个问题。我们遇到问题之后一般会设法思考这个问题的解决方案。假设,解决方案是挨个查看每一个名字,如果名字正好是我要找的那个朋友的名字,那么该名字对应的电话号码就是我要找的电话号码。这个解决方案很抽象,与具体如何实施没有任何关系。得到该解决方案之后。这时,不同的人会采用不同的方法来解决这个问题。比如,A是一个生活在18世纪的人,那么它很自然的想到拿出电话号码薄,找出朋友的名字,然后查看对应的电话号码就可以了。再比如,B是一个生活在21世纪的IT程序员,那么它很自然的会想到把电话号码薄存入到电脑中,然后通过写程序的方式来解决这个问题。
    这时,我们发现,程序是在我们对某个问题已经形成抽象解决方案之后,实施该抽象解决方案的一种手段。从这个角度看,程序是一种手段。既然程序是抽象解决方案的一种实现手段,那么我们可以讲程序是抽象解决方案的一种映射。映射(描述/表述的过程其实就是采用某种程序设计语言编写程序的过程。前提是,程序设计语言必须有能力表述抽象的实施方案,即程序设计语言需要有足够的表达能力。
  2. 关于程序的执行过程
    在看一下上面例子中程序的执行过程。假设程序将电话薄组织成一个map的形式,key是人名,value是电话号码。那么程序执行的过程就是在map中查找对应的人名,然后返回其对应的电话号码。从这个角度看,程序执行过程就是根据输入,在数据上执行特定的操作,然后返回结果。程序的执行过程可以看成抽象解决方案的具体实施过程。关于程序的执行过程,其实就是一个计算的过程。只是这个计算并不是我们通常所说的算术计算,而是通用计算。这其实也是我们把电脑称为计算机的原因。
  3. 为什么看上去几乎所有的事情都可以通过写程序来解决?
    这个问题背后意义深刻,且曾经深深困扰着我们一代又一代的数学家。我们现在所使用的计算机本质上是实现了一个通用计算模型。通用计算模型其实是现代计算机的灵魂,而计算机只是通用计算模型的一个物理实现。计算模型本质上是一个纯数学问题,一代又一代的数学家尝试发掘出一个通用计算模型,这个模型不但可以解决算术问题,还可以解决逻辑推理问题,还可以解决文字编辑问题,还可以解决数据排序问题等等一系列通用计算问题。寻找出这个通用计算模型的前提是数学家一直在尝试探索计算的本质是什么?终于阿兰·麦席森·图灵在1936年发表了一篇题为《论数字计算在决断难题中的应用》的论文,这篇论文中图灵提出了一个计算模型,”图灵机“。“图灵机”不是具体的物理机器,而是一种思想模型,可制造一种十分简单但运算能力极强的逻辑计算装置,用来计算所有能想象得到的可计算函数。其基本思想是用机器来模拟人们用纸笔进行数学运算的过程。图灵机还是停留在理论层面,而冯诺依曼则将这个逻辑计算装置转换成了物理实现。现在我们使用的计算机都是基于冯诺依曼计算机体系结构。如此看来,”几乎所有事情都可以通过在计算机上写程序的方式来解决“并不是一个偶然,而是有严谨的数学理论支持。

我的总结
上面三个问题看上去没有什么逻辑关系?但是想清楚这三个问题对于我理解”程序是什么“这个问题至关重要。

如此看来程序是:

  1. 描述抽象问题解决方案的一种手段
  2. 程序的运行过程,就是我们解决问题的过程,更是一个广义的计算过程。
  3. “什么东西都可以通过写程序来解决”,看上去是形容程序的强大,其实程序只是一个指挥计算装置进行操作的指令集合。真正强大的是现代计算机提供了通用的计算模型。这个计算模型可以模拟人的思维过程,它几乎可以帮助我们解决我们人脑所能解决的所有问题。

先写到这里,后面还会整理我的一些思路,继续更新这篇blog。