前言
本篇博文是操作系统基础系列之一;本文为作者的原创作品,转载需注明出处;
背景
在 1936 年以前,人们一直在寻求一种能够通过机器自动帮我们进行复杂运算的方法;当时的机器要么只能算加法,要么只能算乘法;我们需要一种通用的机器,能够帮我们自动的进行任意的复杂的运算;直到图灵在 1936 年的时候,提出了图灵机,一种理论,可以通过一种通用的规则使得机器自动的帮我们进行一系列(可计数范围内的)复杂的运算;
模型
基本元素
先来看一下一个模拟图灵机的装置,
可以看到,它由如下几个部分组成,
无限长的纸带
(原文叫 Tape),带有无限多个方格;且方格有个特性,就是可以被读写;Tap Head
指针头,- 它始终指向当前的一个方格,当前方格的位置称作 current
Position
; - 它可以读取当前方格中的内容,该内容成为当前值 current Value;
- 它可以在当前方格中写入,如果当前方格已经有内容了,擦除后重写;
- 它始终指向当前的一个方格,当前方格的位置称作 current
State
,每一个 currentPosition
都有一个状态 State,它告诉当前的Tap Head
该做什么,是对当前的方格进行只读或者读写?处理完以后,下一步是左移还是右移?
AState
$\to$ ARule
,每一个 State 对应一个 Rule,正是这个 Rule 告诉 Tap Head 在当前位置该如何操作;
理论
有限状态机
图灵机其实是一个带规则的有限状态机,什么是有限状态机,看一张概念图,
针对图中的每一个节点,状态机五要素如下,
- 当前状态 current State
- 输入
- 规则 Rule,在当前状态下执行的规则,该规则指定 next State;
- 输出
- 下一个状态 next State
有限状态机,则需要在状态机上加上一个起始状态 init State 和结束状态 final State,通常 final State 有成功和失败两种状态;图灵机就是一种有限状态机
图灵机
图灵机的有限状态机有如下元素,
- 状态
包含起始状态、中间状态和结束状态;起始状态用 $q_0$ 表示,结束状态用 $q_a$ 表示; - 输入
ascii 码值,输入是由 Tap Head 所读到的内容; - 输出
ascii 码值,输出是由 Tap Head 写出的内容; - 移动
${L, R, N}$ 中的一个,其中 L 表示读写头向左移一格,R 表示读写头向右移一格,N 表示读写头不动
图灵机的规则(Rule)定义,看一个例子
current State | 输入值 | 输出值 | 移动 | next State |
---|---|---|---|---|
$q_0$ | 1 | 0 | R | $q_1$ |
$q_0$ | 0 | 0 | R | $q_1$ |
$q_1$ | 1 | 0 | N | $q_a$ |
$q_1$ | 0 | 0 | N | $q_a$ |
我们来解读一下这个状态机,
- 从起始状态 $q_0$ 开始,
- 若当前值(输入值)为 1,则用 0 覆盖当前值,指针头右移一位,然后进入 $q_1$;
- 若当前值(输入值)为 0,则不变,指针头右移一位,然后进入 $q_1$;
- 进入中间状态 $q_1$,
- 若当前值(输入值)为 1,则用 0 覆盖当前值,指针头不动,最后进入结束状态 $q_a$,退出;
- 若当前值(输入值)为 0,则不变,指针头不动,最后进入结束状态 $q_a$,退出;
上面这个状态机要做的事情非常的简单,就是用我们定义的规则通过图灵机把 11、10 或者 01 变成了 00;可以用如下状态机进行表述,
实例
一进制加法
什么是一进制?1 表示 1,11 表示 2, 111 表示 3;那么自然 111+11=11111;这是最简单的加法运算;下面,我们是否可以输入一种规则,能够使得图灵机能够模拟人脑,实现任意多个 1 和另外任意多个 1 的加法?
假设,我们在纸带上输入公式,111+11=,如图,注意,B 表示 Blank 空格;
那么要如何使用图灵机完成该运算呢?我们定义如下图灵机规则,1
2
3
4
5
6
7
8
9
10
11q0,1,C,R,q1
q0,+,C,R,q0
q1,+,+,R,q1
q1,1,1,R,q1
q1,=,=,R,q1
q1,B,1,L,q2
q2,1,1,L,q2
q2,=,=,L,q2
q2,+,+,L,q2
q2,C,C,R,q0
q0,=,C,R,qa
表达式中,C
表示 Clear,表示被指针头给擦除后的空格;任意多个 1 的加法的逻辑可以提炼成把左边的 5 个 1 依次移动到=
符号的右边,然后将左边剩余的符号全部清除;把上述执行步骤的逻辑概括如下,
- 从起始位置开始,将 1 逐个移动到等号的右边,过程中清除
+
- 最后清除
=
号 - 剩下的部分便是最终的结果
图灵机的计算过程,如下图所示,
上述的图灵规则可以放到图灵模拟器中去执行 https://landonwong.top/Tur/tur.html ,在规则表中写入规则,在表达式中写入 $111+11=$,然后点击设置,继续按钮即可执行;
上述一进制加法的图灵机对应的有限状态机,如下图所示,
二进制加法
规则如下,
1 | q0,1,1,R,q0 |
注意如下规则,
K
表示当前位已经被处理过,a
表示需要进入进位状态,比如 $1+1$,这个时候 $a=0$ 但是需要进入进位状态进位状态
,不断左移,如果遇到 0 则加为 1,若遇到1,则改写为0,继续进位;
图灵机的计算过程如下,
可见,只要规则设置得当,图灵机完全可以帮助我们自动的去计算任意二进制数的加法;
总结
通过图灵规则和有限状态机,我们可以实现任意的可计数范围内的复杂计算;同样可以引申至乘除法;不过,这也能够让我们直观的体会到,即使是让图灵机自动的帮我们计算一个简单的二进制加法,所需要的规则也是非常复杂的!
感谢
很难找到通过图灵机实现加法的实现规则,因为一个简单的加法,规则也如此的复杂;这里非常感谢 LandonWong 的文章,https://blog.csdn.net/qq_16551309/article/details/88901940 ,文章中他详细的给出了如何实现加法的图灵规则和推演的详细过程;
意义
图灵机的伟大意义在于,它能够通过定义一套通用的规则,使得让机器可以自动的进行(可计数内的)任意复杂的计算;使得使用机器模拟人脑进行计算成为可能;为现代计算机奠定了理论基础;
不足
虽然图灵机可以自动完成任意复杂的运算,但是,它的不足之处是,
- 一系列定义的规则只适合一种数学运算,图灵机的规则复杂且使用范围单一;
- 没有保存运算中间结果;
- 完美的图灵机其实是实现不了的,因为我们无法提供无限长的纸带条;
能否将多种数学运算合二为一?能否存储中间结果?正是这两方面的原因,使得现代操作系统的概念呼之欲出!于是冯诺依曼提供了现代操作系统模型,
- 提供了中间结果存储器,通过中间结果,使得可以同时完成相互依赖的多种数学运算;(这里的一种数学运算就等价于现代计算机的一个计算指令)
- 并且将一种数学计算化简为一个计算机指令,比如一个加法指令(对比上述图灵机的加法,是不是简单了许多),这样使得数学计算的设计更为简单;
Reference
图灵机论文: https://www.cs.virginia.edu/~robins/Turing_Paper_1936.pdf
wolfram’s price Turing: https://www.wolframscience.com/prizes/tm23/turingmachine.html
图灵机在线模拟器: https://landonwong.top/Tur/tur.html
剑桥大学: https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/turing-machine/one.html
LandonWong 的博文: https://blog.csdn.net/qq_16551309/article/details/88901940