认识编程:以Python语言讲透编程的本质
上QQ阅读APP看书,第一时间看更新

1.2 何谓程序?

来看历史上几个典型的发明,斧子、轮子、蒸汽机,它们的目的单一,结构一旦确定下来,功能也就确定下来了,不能用于其他用途。

但是计算机可以通信、播放音乐、写作、记账等。它是通用的,其具体的功能取决于程序。

为了理解程序的概念,先来看看没有程序的计算机是什么样子。

人类很早就知道计数,有了数字,就需要有对数字的操作,最典型的就是加法和减法。最早通过手指计数,这种计数方式很方便,不过有一个问题就是不易存储这些数。于是人们就想到了用石子或者绳结来长期存储这些数。可能是在5000年前出现了计数方法,这意味着人类已经把“数”这个概念抽象出来了,然后用了更久的时间才发明了0,至此人们习惯的十进制才成形。

十进制方便了计算,促进了生产和贸易,也就有人专门从事这个职业,计数和计算。这是当时的新兴行业,受过教育的年轻人拿着小刀和泥板,一笔一画地诚实记录、用心计算,日复一日年复一年。这不仅仅是一个脑力劳动还是一个体力活儿,虽然后来出现了算筹和算盘,但是这种手工式的计算本身仍然费时费力。

1642年,19岁的法国人Pascal(历史上著名的数学家、物理学家)发明了加法器,它由齿轮构造而成,通过转动齿轮实现加法,用连杆实现进位。这个发明也影响了Pascal的哲学观,他认为人的思维活动与机械运动没什么差别。

三十多年后,学术巨人Leibniz发明四则运算器,影响了上百年。但是这些机器都受机械结构的影响,功能与性能都不怎么好。

到这个时候,用于计算的工具与历史上其他的发明仍然没有什么差别,依然只是完成某件事情的单一工具。只不过这些机器完成的工作是加减乘除。

真正的突破是19世纪英国的数学家Babbage发明的分析机。Babbage意识到计算的工作是多种多样的,如果为某一个特定的工作单独发明一台机器,那就太烦琐了,能不能有一种通用的机器,可以完成所有这些计算工作?于是Babbage想到了将一个任务的计算工作分解成原子步骤(加减),把这些步骤记录下来,让一台机器从某个地方获取这些步骤,然后顺序执行并可以跳转执行。这就是“程序”的萌芽。

为此,在分析机中,Babbage设计了存储装置,可以存储初始数据及中间结果数据;设计了运算装置来执行加减计算;设计了控制装置,通过指令控制操作步骤。这是一台可编程的计算机器(由于工艺限制,直到Babbage去世也没有造出来)。

有一个叫Ada的女孩(英国著名诗人Byron的女儿),还为这台机器写了程序来计算伯努利数,并提出了循环和子程序的概念,她被称为世界上第一个程序员。

到了这个时候,程序的概念就确立了。一台计算机器能做什么工作,取决于程序。给它乘法程序,它就执行乘法,给它音乐程序,它就播放音乐。所以叫它为“可编程通用计算机”如下图所示。

事实上,通用任务也是有范围的,并不是指世界上所有的工作,它的范围就是“计算”。不要以为这个范围很窄,也不要简单地把计算等同于加减乘除,按照现代观点,科学计算、文字处理、记账、绘图、播放音乐、视频、设备控制以及网络通信这些工作都是计算。

到此,可以基于现代的概念来探讨“程序”“计算机”“数字”了。

先看“数字”。平时用0~9,这10个符号表示10个数字,通过位置表示权,人们叫它十进制系统。虽然日常生活中用得最多的是十进制,但其实还会用到其他的进制,如12进制、60进制(在表示时间时会用到)。理论上,任何进制都是等价的。为什么十进制会成为使用最广泛的进制?历史学家认为原因是人正好有10根手指头,用起来比较方便。

这是一本讲解编程的书,笔者尽量少用数学,不过还是会用到一点。从数学上表示进制是这样的:

±(Sk-1S2S1S0S-1S-2S-t)b

S表示符号(比如十进制下的0~9这10个符号),k表示位置,b表示进制基数(如10)。

这个表示的值为:

nSk-1×bk-1+…+S1×b1+S0×b0+S-1×b-1+S-2×b-2+…+S-t×b-t