大道至简,计算机也一样,任何复杂的背后有着非常纯粹、简单的原理,对计算机模型来说离不开对图灵机的认识。
本文摘自外文:link
图灵机是数学家艾伦·图灵
在 1936 年提出的一种假象的机器。尽管它看起来很简单,但该机器可以模拟任何计算机算法,无论算法是多么复杂!
上图是图灵机一个非常简单的表示,它表示一条无限长的纸带,纸带的每个格子都可以记录符号(类似于传统计算机里面的内存、或其他存储介质)。纸带上的格子在开头处往往是空白的,每个格子都可以被写入任何符号。在本文的场景中,我们假设图灵机只能处理0、1、""(空白格)三种符号,称为3-符号
图灵机。
任何时候都有一个控制头悬在纸带某格子的上方,通过这个控制头图灵机能执行3种非常简单的操作:
- 读取当前所指格子的符号内容
- 对所指格子进行新符号的写入(或擦除)操作
- 每次向左或向右滑动一格纸带,使得控制头能对相邻的格子进行下一步操作
一个简单的例子
为方便描述,我们先尝试在空白的纸带上写入1、1、0三个符号:
首先,在控制头下方先写入1:
然后,将纸带向左移动一格:
现在再开始写入1:
按此操作执行后,纸带最终的状态为:
一个简单的程序
上面纸带已经包含了1、1、0三个字符,我们尝试将纸带上的符号1全部替换为0(0也换为1),这个操作称为位反转
。我们可以将下方的指令注入到图灵机,图灵机可以读取指令并执行相应的动作,这些指令组成了一个简单的程序:
我们做个演示来看看图灵机是如何执行每个指令的:图灵机会先读取控制头下方的符号并做写入操作,然后向左或向右滑动纸带,以此反复执行完所有指令。
当前指向的符号是0,所以控制头开始写入1并将纸带向右滑动一格。
现在执行的符号是1,因此写入0并把纸带继续向右滑动一格:
接下来还是读取到1,开始执行一样的操作:
最后将读到空白的格子,按上述编写的程序,图灵机的控制头读到空白格后不做其它处理,将一直保持在重复读空白格的状态。
实际上这个程序是不完整的,程序什么时候无休止的重复执行指令、什么时候进入到终止状态,程序需要新增一个状态
的概念来告诉图灵机。
机器状态
要让程序能完整地执行,必须考虑程序执行过程中状态变化。下表新增了“状态”列,可以称为是状态表:
每个指令执行后都将转移到一个新的状态,按上表的设定,图灵机将一直在原状态下不断执行读-写-移动纸带
的操作(除非读到空格)。如果读到空格,图灵机将进入到停止状态,表示程序结束。我们将上面编写的程序新增一个状态属性,使得图灵机在该状态下会执行对应的指令。
有限状态机
单单加个状态属性似乎还不能很好体现出其意义,现在我们对程序新增一个状态,该状态下将对格子的0、0、1符号进行反转,复原到原先的1、1、0符号值。有了两个状态后,图灵机更像是在执行一个有限状态机,被称为3-符号
、两状态
图灵机。
对于写指令,把“无操作”替换为“写空白”来统一描述。
除了用表格描述,也可以用状态图表达:
之前的程序读到空格时将处于“无操作”或停止状态,新的程序在切换到状态1前将会把纸带向左移动一格。
如上图,控制头开始指向符号:0,进入到状态1后将开始做位取反操作,期间将向左滑动纸带(而不是右):
最后将读到空白格,按指令将向右滑动纸带一格并进入到终止状态。
通过向程序注入更多状态,我们可以驱动图灵机执行更复杂的功能,现代计算机借助此思想可以运行任何算法。