3.2.1 图灵机和BF语言
图灵机是由图灵提出的一种抽象计算模型。机器有一条无限长的纸带,纸带分成了一个一个的小方格,每个方格有不同的颜色,这类似于计算机中的内存。同时机器有一个探头在纸带上移来移去,类似于通过内存地址来读写内存上的数据。机器头有一组内部计算状态,还有一些固定的程序(更像一个哈佛结构)。在每个时刻,机器头都要从当前纸带上读入一个方格信息,然后根据自己的内部状态和当前要执行的程序指令将信息输出到纸带方格上,同时更新自己的内部状态并进行移动。
图灵机虽然不容易编程,但是非常容易理解。有一种极小化的BrainFuck计算机语言,它的工作模式和图灵机非常相似。BrainFuck由Urban Müller在1993年创建的,简称为BF语言。Müller最初的设计目标是建立一种简单的、可以用最小的编译器来实现的、符合图灵完全思想的编程语言。这种语言由八种状态构成,早期为Amiga机器编写的编译器(第二版)只有240个字节大小!
就象它的名字所暗示的,brainfuck程序很难读懂。尽管如此,brainfuck图灵机一样可以完成任何计算任务。虽然brainfuck的计算方式如此与众不同,但它确实能够正确运行。这种语言基于一个简单的机器模型,除了指令,这个机器还包括:一个以字节为单位、被初始化为零的数组、一个指向该数组的指针(初始时指向数组的第一个字节)、以及用于输入输出的两个字节流。这是一种按照图灵完备的语言,它的主要设计思路是:用最小的概念实现一种“简单”的语言。BrainFuck 语言只有八种符号,所有的操作都由这八种符号的组合来完成。
下面是这八种状态的描述,其中每个状态由一个字符标识:
字符 | C语言类比 | 含义 |
---|---|---|
> | ++ptr; | 指针加一 |
< | --ptr; | 指针减一 |
+ | ++*ptr; | 指针指向的字节的值加一 |
- | --*ptr; | 指针指向的字节的值减一 |
. | putchar(*ptr); | 输出指针指向的单元内容(ASCⅡ码) |
, | *ptr = getch(); | 输入内容到指针指向的单元(ASCⅡ码) |
[ | while(*ptr) {} | 如果指针指向的单元值为零,向后跳转到对应的 ] 指令的次一指令处 |
] | 如果指针指向的单元值不为零,向前跳转到对应的 [ 指令的次一指令处 |
下面是一个 brainfuck 程序,向标准输出打印"hi"字符串:
++++++++++[>++++++++++<-]>++++.+.
理论上我们可以将BF语言当作目标机器语言,将其它高级语言编译为BF语言后就可以在BF机器上运行了。
学员评价