计算机系统3-> 现代计算机基石 | 图灵机理论
在理解CPU之前,我们有必要先了解一下现代计算机理论的基石——图灵机,这个抽象模型决定了现代计算机可以被实现。这个模型的工作原理也投射到了CPU的工作实现上。图灵机的知识可深可浅,换句话说,上手容易,但是意义深远。
下面是一个可以在线学习图灵机的网站:
- 《嵌入式C语言自我素养》
- 百度百科以及大佬博客
- b站视频
- 《数字逻辑》课程
00 内容概括
图灵机的概念产生于英国数学家艾伦·图灵在1936年在《伦敦数学协会会刊》上发表的那篇改变世界的论文——《论可计算数及其在判定问题中的应用》,论文本身很难很复杂,但对于计算机科学而言,可以简单概括为:
“任何复杂的运算都可以分解为基本运算指令。”
而图灵机则是图灵机理论中提出的理想模型,可以用简若干指令的组合就实现任意复杂的计算。
01 基本构造
图灵机的构造如下图所示:
-
一条无限长的纸带-Tape
这是要处理的对象,被划分为一个个大小相等的小方格。每个小方格都可以存放一个符号,可以存放数字、字母、空白等。
-
一个读写头-Head
可以在纸带上左右移动,它能读出当前所指的格子上的符号,并能改变当前格子上的符号。
-
一套控制规则/状态转换规则-Table
根据当前机器所处的状态以及当前读写头所指的格子上的符号来确定读写头下一步的动作,并改变状态寄存器的值,令机器进入一个新的状态。
-
一个状态寄存器
用来保存图灵机当前所处的状态。图灵机的所有可能状态的数目是有限的,并且有一个特殊的状态,称为停机状态。
02 工作原理与思想
02-1 工作原理
这个东西是有数学推导的,我在此简化具体一下:
想象自己是一只小猫,我们会有饿和饱的状态,面对不同的食物,我们吃或者不吃,最终是饱或者饿。
上图就是我们理想化的Table,即状态转换规则。
在这个例子中,猫就是一个读写头Head,可以存储一个状态我们假设猫会根据自己饿与不饿以及格子里是否是食物来决定“吃”或是“等待”。
上图中的当前状态就是读写头中状态寄存器的当前存储值,格子里的食物就是纸带(Tape)格子里的值,两者决定了读写头(Head)的下一状态与读写头的移动(对应“等待”和“吃”这两个行为)
值得一提的是上面提到过的停机问题(这是
这样,一个图灵机就这样建立了。
02-2 基本思想
把上面的通过类比讲解的原理稍微抽象一下,我们来思考一下图灵机的基本思想:
-
图灵机基本思想是用机器来模拟人们用纸笔进行数学运算的过程。
-
图灵机主要有两个动作(模拟人):
-
在纸上写上或擦除某个符号;
-
把注意力从纸的一个位置移动到另一个位置;
-
-
而在每个阶段,人要决定下一步的动作,依赖于
-
此人当前所关注的纸上某个位置的符号->当前状态
-
此人当前思维的状态->Table
-
03 运行实例
我想在这里实际操作两个图灵机的工作过程,来加深一下对于图灵机的理解,手写推导。想看更多示例的可以 ->
03-1 实现两个数字的相加
A 示例纸带
B 状态转移表
读写头当前状态 | table值0 | table值1 |
---|---|---|
q1 | 1Rq2 | 1Rq1 |
q2 | 0Lq3 | 1Rq2 |
q3 | 0Nq3 | 0Nq3 |
C 步骤演示
03-2 将一串连续的1后面再加一位1
A 示例纸带
B 状态转移图
虽然我们在前面的构造和原理部分多用一个表来表示Table,实际上和状态机一样,也可以用图来表示。
Table图的设计取决于A中我们要实现什么样的功能。在这个图中:
-
从0开始,遇到0格子我们继续赋给它0,右移;
-
碰到1时,把它修改为1,右移;
-
当碰到1后第一个0时我们就把它下一状态改为1,左移
-
左移再碰到1,就保持其值,继续左移;
-
左移遇到0,保持其值不变,停止。
C 步骤演示
04 图灵机Verilog实现的探索
这时候我就在想一个问题,我已经学过了数字逻辑与Verilog设计,图灵机肉眼可见地与状态机极其相似,那么我是否可以用Verilog实现一个图灵机呢,功能复刻就可以。
自己想了想,按照状态机的套路,对状态进行编码,但读写头Head的左移右移的模拟是一个问题,我开始怀疑这个东西是不是真的可以。去FPGA的群里问了问大佬,大佬的回复是:
“可以,这就是用Verilog写一个CPU soft core了,一个point,一段register,就能组成图灵机,并且fpga可以做。”
所以,想要实现图灵机,我们需要继续向下了解CPU的一些知识。
05 谈谈意义
05-1 类比现代计算机
将图灵机原型与现代计算机比较,会有很多相似之处,我们可以联想一下:
-
无限长的纸带Tape == 程序代码
-
读写头Head == 程序计数器PC
-
状态转换表Table == CPU的有限指令集
-
状态寄存器 == 程序或计算机的状态输出
不同架构的CPU,主要差别是指令集的不同,支持运行的机器指令也不同,但有一条是相同的:即CPU只能支持运行有限个指令,任何复杂的运算(任何应用程序)最终都可以分解成有限个基本指令来完成。