游戏开发论坛

 找回密码
 立即注册
搜索
查看: 9336|回复: 10

虚拟机和图灵机原理:专为程序员写的!一看就懂!

[复制链接]

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
发表于 2008-3-23 04:12:00 | 显示全部楼层 |阅读模式
(编辑中。。。)

说明:本帖主要适合程序员阅读。许多讲解,按照程序员容易理解的方式进行

>>什么是图灵机?

首先,我们用IT行业的语言来描述的话就是:

1 图灵机是一个处理器
2 图灵机的正常工作需要1个内存条,内存条中有一定的初始数据
3 图灵机可以对内存条的任何地址,按照一定的规则,进行读/写
4 图灵机能够根据内存条中的数据,计算出一个结果,这个结果记录在内存条上
5 内存条的容量是无限的
6 在计算出结果之前,图灵机可以工作任何时间,只要是有限的
7 内存条,图灵机,可以用任何材料制作,比如纸条,电路,甚至可以用程序模拟

然后,请注意以下几点:

1 图灵机有很多种,作用各不相同
2 每一台图灵机(处理器)都只有一个固定的运行规则,或者说,只有1种功能
3 真正的图灵机是制造不出来的,因为内存有限,计算时间有限,但是可以近似地实现它

!!下文中所说的“图灵机”,也包括近似的图灵机

接下来,我们来看几个图灵机的例子,包括虚构的和实际的:
...在继续阅读之前,我再次强调一遍:“内存条,图灵机,可以用任何材料制作”

ENIAC (不要告诉我你不知道)
加法计算器  (想象一台机器可以计算内存条中开头2个整数的加法)
圆周率计算器  (想象一台机器可以计算圆周率)
Microsoft(r) Virtual PC 简体中文版
Sun(TM) Java 虚拟机
Virtual PC 中运行着的 Java 虚拟机
暗黑破坏神II游戏软件
Windows Media Player 9
DSP芯片
Intel 80x86 32位个人电脑
nVidia 的某款 GPU
一段漂亮的shader代码
更多... ...

!!这里我需要做一个解释:
你的 CPU 并不是加法计算器,它并不能直接计算加法!必须安装软件!
一台加法计算图灵机,一旦运行,就可以直接把内存中的数据做加法运算。
据我所知,世界上并没有任何芯片厂商制造这种机器,因为不赚钱,
但是你可以编程实现它,源代码如下:

char Memory[999999999]; //这只是一个近似的实现
void main()
{
    // 它的内存的初始化:
    ZeroMemory(Memory, sizeof(Memory));
    cin>>Memory[0];
    cin>>Memory[1];

    // 这个图灵机开始工作: //防止溢出,使用short来表示两个char相加的结果
    *((short *)&Memory[2]) = Memory[0] + Memory[1];
    Memory[0] = Memory[2]
    Memory[1] = Memory[3];
    Memory[2] = 0; // 擦除临时数据
    Memory[3] = 0; // 擦除临时数据
    // 注意:到此为止,这个图灵机工作就结束了!

    // 把图灵机计算出的结果输出给用户:
    for(int i=0; i<sizeof(Memory); i++)
        cout<<(short) ( Memory );
}

(编辑中。。。)




362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
 楼主| 发表于 2008-3-23 05:19:00 | 显示全部楼层

Re:虚拟机 和 图灵机 原理 : 专为 程序 员 写的! 一看就懂!

图灵机的数学表示


请不要被“数学”两个字吓倒,实际上,只要具有初中以上水平,
看懂这个不是问题。


我先问大家一个问题,如下所示的东西,是个什么?

00000000045645421245450415646546545645456454464
57445465464650400046454060646446000046454508754
53100006560065470770545554407788657500046454060
87444667979006444140008476579766110000006546545
67077054504156466140797900450415646744645000524
76014798966743725476560656226506560612050560567
05650604000400000744742671560006564514114500000
799657545004464004111000676400000

你可以尝试从以下几个选项中选择一个:

(A)一个EXE文件
(B)一张美女图片
(C)仙剑奇侠传4的通关存档
(D)数学考试的答案短信
(E)一个加密的3D引擎源代码
(F)instemast的QQ密码
(G)上帝的电话号码
(H)你10年后的财产,单位$

正确答案:以上参考选项均不对!
这只是一个自然数!

不要认为自然数就是一个 0 -- 4294967296 的数字!(程序员思维~)
虽然以上数字那么长,但是它的确是一个自然数!!

我们可以把一个自然数,用a,b,n,m...等字母来表示,比如上面那个数:
   a = 000000000456454212454504.....4111000676400000
即 a = 456454212454504.....4111000676400000



类似地,我们可以把图灵机的内存,在图灵的生活的年代,还没有内存,
只有纸条,所以也叫做“纸带”,我们可以把这个纸带(内存)上的海量数据,
看作1个自然数(天文数字!),并且用1个字母表示出来,
另外为了方便,除了10进制,我们还可以使用2进制,16进制等,
比如下面有一个图灵机的纸带(内存):

m = ( 10100 00001010 )2
m = ( 14 0A )16
m = ( 5130 )10

回想一下我们上面讨论的“加法计算器图灵机”,它将会如下操作该内存 m :
(*我们的表示均是高位在前,低位在后,这样在整体进制转换时不会出现麻烦)

> m = ( 00 00 14 0A )16   即   0x140A == 5130
> m = ( 00 1E 14 0A )16   即   0x1E140A == 1971210
> m = ( 00 00 00 1E )16   即   0x1E == 30

就是说,纸带中原始数据为10,20两个数,然后被这台图灵机加了起来,结果为30

上面的过程可以用函数方法表达为下:

Add ( 5130 ) == 30

其中,Add 就是一台图灵机

更加一般化,

Add ( m ) == p

其中,m表示纸带, p 表示加法器“Add”的计算结果.

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
 楼主| 发表于 2008-3-23 06:21:00 | 显示全部楼层

Re:虚拟机 和 图灵机 原理 : 专为 程序 员 写的! 一看就懂!



图灵机的号码


上面我们已经把内存(纸带)给数学化了,
但是图灵机本身还没有被数学化...

一台图灵机,代表了一种对内存数据的计算方法(算法)
这种算法,可以按照某种规则,用一串数字来表示(可能是个天文数字)

实际上世间万物都可以编码成数字,所以图灵机(算法)当然也可以!

不过,具体怎么编码,并没有一个统一的规范,你可以自由编码,
比如上面的加法器: Add ,你可以编码为:

(455610002344645400)10

也可以编码为

(2167791092408424993949399001203200058924787910010045)10

当然,你怎么编码的,如果不告诉我,我肯定看不懂。


在某种编码规范下,一台图灵机对应一个代码,
反过来,一个代码也对应于一台图灵机。

比如,在某个编码规范下,(9998884545011575751100057777)10 可能
表示一台减法计算器。

自然数有无数个,图灵机也有无数台,每台对应于一个编码(自然数),
所以我们经常把编码为 n 的图灵机记作:

  T n

另外,我们经常用 m 表示内存(纸带), 用 p 表示计算结果,

则,一台编码为 n 的图灵机的行为,可以表示为:

  T n ( m ) == p

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
 楼主| 发表于 2008-3-23 06:37:00 | 显示全部楼层

Re:虚拟机 和 图灵机 原理 : 专为 程序 员 写的! 一看就懂!

下去吃个早饭,然后回来继续讲 -- 万能图灵机 , 也就是现在你正在使用的PC

(编辑中。。。)

34

主题

443

帖子

478

积分

中级会员

Rank: 3Rank: 3

积分
478
发表于 2008-3-23 11:02:00 | 显示全部楼层

Re:虚拟机和图灵机原理:专为程序员写的!一看就懂!

建议斑竹加精

7

主题

96

帖子

535

积分

高级会员

Rank: 4

积分
535
QQ
发表于 2008-3-23 17:48:00 | 显示全部楼层

Re:虚拟机和图灵机原理:专为程序员写的!一看就懂!

跟着学,等待更新

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
 楼主| 发表于 2008-3-23 22:19:00 | 显示全部楼层

Re:虚拟机和图灵机原理:专为程序员写的!一看就懂!

普适(万能)图灵机


    引子

    严格地说,ENIAC不是“1台”图灵机,而是“若干台”图灵机。
    为了让ENIAC完成不同的任务,工作人员们必须改变它的电路结构。。。
    即,ENIAC的每一个电路结构,都是1个不同的图灵机。



我们回到上面的图灵机的函数表达式中,继续我们的数学讨论。

回想一下,我们说:
一台编码为 n 的图灵机的行为,可以表示为:

  T n ( m ) == p


请注意,这里的“T n”中的“ n ”也是一个变量!

故上式也可以看成是 n, m 这两个变量,到 结果 p 的映射。即,

  ( n , m )  -->  p

实际上也只不过是表达式的书写形式变了


我们举个具体的例子来说明,
比方说,假如在某个编码规范下, 0x45454545代表加法器,0x8888ffff1111代表减法器,
0x123456789abcdefedcba87654321代表圆周率计算器,等等......

加法器  T 45454545 ( m )  ==  p  其实,也可以记作:

  ( 0x45454545, m )  -->  p

减法器  T 888899991111 ( m )  ==  p  也可以记作:
  
  ( 0x8888ffff1111, m )  -->  p

而理论上有无数台图灵机,所以,编码为 n 的图灵机,可以表示为:

  ( n, m )  -->  p


!!问题:上式中的“n”“m”代表什么?你没有忘记吧?

----上面的 n 代表某种编码规范下的图灵机(处理器)代码,m 代表纸带(内存)中的数据。
他们是不同的概念。打个比方, n 就类似于程序代码,m就类似于程序数据。


    图灵机的缺点

    还记得吗?每一台特定的图灵机 T n1 ,只能完成一个特定的功能,比如 加法。
    如果需要完成其他功能,就需要更换另一台图灵机 T n2 ,
    比如ENIAC,为了作不同的计算就需要修改电路结构。
    那么这就相当麻烦,成本也很大。。。


好吧,回到正题。
我们说,某台图灵机 n ,可以表示为 ( n, m ) --> p  这个映射。


请问大家:图灵机是干什么用的阿?
----做数学计算用的。

我们知道,图灵机可以计算很多东西,比如2个数字的加法,减法,
某个函数,圆周率,等等,各种各样的图灵机,可以代替人脑完成各种各样的运算。

那么,同样存在某台图灵机,可以完成“ ( n, m ) --> p ” 这个计算!!
这台图灵机,叫做“普适(万能)图灵机”,记作 " U " 。而且同样也有一个编码!

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
 楼主| 发表于 2008-4-20 20:42:00 | 显示全部楼层

Re:虚拟机和图灵机原理:专为程序员写的!一看就懂!

说明:周末回家特地把《皇帝新脑》翻出来重看了图灵机的部分,于是重写了本文。

-----------------------------------------------------------------------------
警告:本文某些地方的论述,含有“递归”思想,请大家谨慎,千万不要绕晕了哦!!
-----------------------------------------------------------------------------

声明:本文参考了牛津大学教授罗杰·彭罗斯在《皇帝新脑》中的图灵机论述,
彭罗斯在书中介绍的并不完全是图灵机的原型,但本质上是一样的,实际上彭罗斯
完全采用了2进制系统,以及按位访问方式,把问题简单化了,也适合程序员阅读。

提示:除此之外,本文还会告诉你,如何编写一个超级大整数的运算算法。
要知道,CPU只支持8-64位整数运算。。。


>>什么是算法?

天哪,如果你不知道,那么老兄我劝你放弃编程而去当律师或卡车司机。


>>图灵机能够干什么?

一台图灵机能够且仅仅能够完成某一个特定的算法。


>>那么究竟什么是图灵机(严格地说)?

图灵机具有有限个“内态”,这些内态可以被编号;
一台严格的图灵机需要无限的“磁带”,磁带由一个个“格子”组成,每个格子里有一个数字;
磁带可以左右移动,或者说,(相对运动!)图灵机可以左右运动;
虽然磁带是无限的,但是它上面的输入、计算和输出必须是有限的!


>>罗杰·彭罗斯的图灵机是什么样的?

为了简单化,彭罗斯规定:磁带上每个格子里只可能有2种数字: 0 和 1 。 0表示空白。
图灵机一次只能读取1个格子。
为了方便,磁带不移动,相反,图灵机移动,而且一次只能移动1个格子,或者停机。


>>图灵机怎么工作呢?


首先需要给定一个初始状态的号码,一般是0。
图灵机每次从当前位置(注意是当前位置!)读取一个格子,
然后,按照机器制造者制定的某种规则,改变当前的内态,
并且向左或向右移动一格,或者停机。


>>现在能给一个简单的例子吗?

不,不过快了。我们还需要了解彭罗斯的“扩展2进制”编码。


>>为什么需要“扩展2进制”编码?

假如,我们需要用2进制,在磁带上存储 2 个整数,那么问题来了:
怎样编码才能分开这两个数字呢?--实际上2进制编码做不到。

“楼主是不是脑CAN啊!?”

我们这里说的“整数”不是 0--2^32 范围内的整数,而是任意大的整数!

假如 1111111111111111111111111111111111111 那么请问,这代表哪两个数呢??

显然不能分开,所以我们需要重新考虑编码问题。还需要至少为“逗号”编码:

0 ---- 0
1 ---- 10
, ---- 110

1100,1010

101000110100100

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
 楼主| 发表于 2008-11-7 01:49:00 | 显示全部楼层

Re:虚拟机和图灵机原理:专为程序员写的!一看就懂!

发现 simulation 中需要用到这个知识。是故UP之。

42

主题

137

帖子

137

积分

注册会员

Rank: 2

积分
137
发表于 2008-11-17 21:55:00 | 显示全部楼层

Re:虚拟机和图灵机原理:专为程序员写的!一看就懂!

感觉我们现在电脑结构有两个最大的特点:1.确定的输入就有确定的结果 2.有序
但上面图灵机的概念里好象没有这两点
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-6 14:48

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表