计算机系统3-> 现代计算机基石 | 图灵机理论
在理解CPU之前,我们有必要先了解一下现代计算机理论的基石——图灵机,这个抽象模型决定了现代计算机可以被实现。这个模型的工作原理也投射到了CPU的工作实现上。图灵机的知识可深可浅,换句话说,上手容易,但是意义深远。
下面是一个可以在线学习图灵机的网站:
Online Turing Machine Simulator
主要参考
- 《嵌入式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只能支持运行有限个指令,任何复杂的运算(任何应用程序)最终都可以分解成有限个基本指令来完成。
计算机系统3-> 现代计算机基石 | 图灵机理论的更多相关文章
- 计算机系统4-> 计组与体系结构1 | 基础概念介绍
在大二上学期学习数字逻辑的过程中,我对计算机如何运作产生了兴趣,因此开了这个系列来记录自己在这方面的学习过程,此前三篇分别是: 计算机系统->Hello World的一生 | 程序如何运行,从大 ...
- 计算机系统5-> 计组与体系结构2 | MIPS指令集(上)| 指令系统
系列的上一篇计算机系统4-> 计组与体系结构1 | 基础概念与系统评估,学习了一些计算机的基础概念,将一些基本的计算机组成部分的功能和相互联系了解了一下,其中很重要的一个抽象思想就是软硬件的接口 ...
- Deep Learning中的Large Batch Training相关理论与实践
背景 [作者:DeepLearningStack,阿里巴巴算法工程师,开源TensorFlow Contributor] 在分布式训练时,提高计算通信占比是提高计算加速比的有效手段,当网络通信优化到一 ...
- p,np,npc,np难问题,确定图灵机与非确定图灵机
本文转自豆瓣_燃烧的影子 图灵机与可计算性 图灵(1912~1954)出生于英国伦敦,19岁进入剑桥皇家学院研究量子力学和数理逻辑.1935年,图灵写出了"论高斯误差函数"的论文, ...
- 【学习笔记】大数据技术原理与应用(MOOC视频、厦门大学林子雨)
1 大数据概述 大数据特性:4v volume velocity variety value 即大量化.快速化.多样化.价值密度低 数据量大:大数据摩尔定律 快速化:从数据的生成到消耗,时间窗口小,可 ...
- 数据结构和算法(Golang实现)(10)基础知识-算法复杂度主方法
算法复杂度主方法 有时候,我们要评估一个算法的复杂度,但是算法被分散为几个递归的子问题,这样评估起来很难,有一个数学公式可以很快地评估出来. 一.复杂度主方法 主方法,也可以叫主定理.对于那些用分治法 ...
- NoSql的三大基石:CAP理论&BASE&最终一致性
关系型数据库的局限 NoSql出现在关系型数据库之后,主要是为了解决关系型数据库的短板,我们先来看看随着软件行业的发展,关系型数据库面临了哪些挑战: 1.高并发 一个最典型的就是电商网站,例如双11, ...
- 大数据理论篇HDFS的基石——Google File System
Google File System 但凡是要开始讲大数据的,都绕不开最初的Google三驾马车:Google File System(GFS), MapReduce,BigTable. 为这一切的基 ...
- 读《计算机系统要素:从零开始构建现代计算机》的思考:CodeGen
掌握目标语言的使用.编写 是非常重要的!!! 如果你要实现的Jack语言编译器是把Jack语言代码编译成虚拟机VM代码.或者直接成汇编代码,要完成源代码中unit A——> 目标语言代码转写此u ...
随机推荐
- 动态规划系列(零)—— 动态规划(Dynamic Programming)总结
动态规划三要素:重叠⼦问题.最优⼦结构.状态转移⽅程. 动态规划的三个需要明确的点就是「状态」「选择」和「base case」,对应着回溯算法中走过的「路径」,当前的「选择列表」和「结束条件」. 某种 ...
- 会话-cookie
package com.hopetesting.cookie;import javax.servlet.ServletException;import javax.servlet.annotation ...
- VectorCAST软件自动化测试方案
VectorCAST 是主要用于对C/C++/Ada程序进行软件自动化测试,并能够在Windows和Linux等多种开发环境下运行.其主要功能包含自动化的单元测试.集 成测试.覆盖率分析.回归测试.代 ...
- ABP.VNext-模块
一.什么是ABP.Vnext? ABP.Vnext是一个基于Asp.Net Core Web应用程序框架.主要目的是用来快速开发Web应用, ABP.Vnext不仅提供完整Web应用程序开发模板,而且 ...
- Sentry 监控 - 私有 Docker Compose 部署与故障排除详解
内容整理自官方开发文档 系列 1 分钟快速使用 Docker 上手最新版 Sentry-CLI - 创建版本 快速使用 Docker 上手 Sentry-CLI - 30 秒上手 Source Map ...
- Mysql资料 存储索引
- Python matplotlib绘图设置图例
一.语法简介 plt.legend(loc=2,edgecolor='red',facecolor='green',shadow='True',fontsize=10) #edgecolor 图例边框 ...
- w4sp-lab安装
扯淡 i春秋有个答题活动,苟了个奖品,我选了一本书:<wireshark与metasploit实战指南>,里面有个配套环境,本来看着书上说使用docker搭建的,以为很简单,只需要pull ...
- Java应用日志如何与Jaeger的trace关联
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- 在mysql5.8中用json_extract函数解析json
背景:某个字段的数据中是JSON,需要提取其中的卡号部分,如: {"objType":"WARE","orderId":6771254073 ...