LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 5156|回复: 4

[计算理论] 图灵机和简单语言

[复制链接]
发表于 2008-5-24 19:43:38 | 显示全部楼层 |阅读模式
前些天偶然看到的关于图灵机和“简单语言”的介绍,挺有趣的。
图灵机听说的比较多;“简单语言”则是第一次接触到,先说说它吧。当然,凡是接触过计算理论的朋友对什么图灵机、歌德尔数、停机问题等等都有了解,而我只是一个外行新手。

[color="Blue"]简单语言:只有“自加”、“自减”、“循环” 这三种语句的语言(真是够简单的:yun:)
[color="Blue"]其他假定:只有整数运算(浮点数可以通过整数模拟);另外还有存储器支持(内存或外存),就是说无论是变量还是常数,都分配有一个存储器地址(且假定存储器无限大)。

数学家们目前认为图灵机和简单语言是等价的。自加、自减、循环语句,貌似无法完成高级语言中各种复杂的语义动作,其实不然,简单语言的能力和C、C++、Java、Pascal之类的高级语言是等价的,也就是说,目前流行的高级语言的功能都可以用简单语言来实现!下面举一些例子说明简单语言是如何实现赋值、相加、相减、条件判断等高级语言中的语句的:

我用C语言来模拟简单语言的基本语句(当然,只能用C语言中的"++,--,while"三种语句,还有是变量定义语句(相当于分配存储器))。

0、基本类型
  1. typedef short TYPE;
  2. /*******************************
  3. Basic operation definitions.
  4. ALL the operands (i.e. x,y,z,tmp etc.)
  5. should be TYPE variables
  6. *******************************/
复制代码

1、先看看如何把一个变量x置为0
  1. /* reset x to 0.
  2. when x is large, it sucks :-< */
  3. #define _SLOW_RESET(x) while(x){ --x; }
  4. /* fast reset x to 0.
  5. this version BREAKS the SIMPLE LANGUAGE RULES,
  6. however it's fast, you know why :-) */
  7. #define _FAST_RESET(x) x&=0
  8. /* The default RESET edition is the slow one, to obey the rules.
  9. You can set it to the fast one by defining compiling parameters, like
  10. "-DFAST_RESET" for gcc compiler. */
  11. #ifdef FAST_RESET
  12.     #define RESET(x) _FAST_RESET(x)
  13. #else
  14.     #define RESET(x) _SLOW_RESET(x)
  15. #endif
复制代码

2、赋值语句
  1. /* x:=y; value of y won't be altered */
  2. #define ASSIGN(x,y) do{\
  3.         RESET(x); \
  4.         TYPE tmp1;\
  5.         RESET(tmp1);\
  6.         while(y){\
  7.             ++x;\
  8.             ++tmp1;\
  9.             --y;\
  10.         }\
  11.         while(tmp1){\
  12.             ++y;\
  13.             --tmp1;\
  14.         }\
  15.     }while(0)
复制代码

3、加法语句
  1. /* x:=y+z; values of y,z won't be altered */
  2. #define ADD(x,y,z) do{\
  3.         ASSIGN(x,y);\
  4.         TYPE tmp2;\
  5.         ASSIGN(tmp2,z);\
  6.         while(tmp2){\
  7.             ++x;\
  8.             --tmp2;\
  9.         }\
  10.     }while(0)
复制代码

4、减法语句
  1. /* x:=y-z; values of y,z won't be altered */
  2. #define SUB(x,y,z) do{\
  3.         ASSIGN(x,y);\
  4.         TYPE tmp3;\
  5.         ASSIGN(tmp3,z);\
  6.         while(tmp3){\
  7.             --x;\
  8.             --tmp3;\
  9.         }\
  10.     }while(0)
复制代码
发表于 2008-6-10 21:40:33 | 显示全部楼层
简单 + 简单 =复杂 。
其实多了就是 复杂
回复 支持 反对

使用道具 举报

发表于 2008-12-4 16:56:55 | 显示全部楼层
呵呵2楼说的对多了就复杂了
回复 支持 反对

使用道具 举报

发表于 2011-6-16 10:48:02 | 显示全部楼层
那么说如何实现if语句??
回复 支持 反对

使用道具 举报

发表于 2011-9-26 03:50:21 | 显示全部楼层
内存地址, 地址一个编号。所有信息都是整数。
if的条件可以用简单语句判断, 貌似简单语句可以完成所有吧。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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