Brainfuck
维库,知识与思想的自由文库
|
Brainfuck,是一种极小化的计算机语言,它是由Urban Müller在1993年创建的。由於fuck在英語中是髒話,这种语言有时被称为brainf*ck或brainf***,甚至被简称为BF。
[编辑] 概述Müller的目标是建立一种简单的、可以用最小的编译器来实现的、符合图灵完全思想的编程语言。这种语言由八种状态构成,为Amiga机器编写的编译器(第二版)只有240个字节大小! 就象它的名字所暗示的,brainfuck程序很难读懂。尽管如此,brainfuck图灵机一样可以完成任何计算任务。虽然brainfuck的计算方式如此与众不同,但它确实能够正确运行。 这种语言基于一个简单的机器模型,除了指令,这个机器还包括:一个以字节为单位、被初始化为零的数组、一个指向该数组的指针(初始时指向数组的第一个字节)、以及用于输入输出的两个字节流。 下面是这八种状态的描述,其中每个状态由一个字符标识:
(按照更节省时间的简单说法, (第三种同价的说法, Brainfuck程序可以用下面的替换方法翻译成C语言(假设
[编辑] 例子[编辑] Hello World!一个在屏幕上打印"Hello World!"的程序: ++++++++++[>+++++++>++++++++++>+++>+<<<<-] >++.>+.+++++++..+++.>++.<<+++++++++++++++. >.+++.------.--------.>+.>. [编辑] 当前位置清零[-] [编辑] 字符I/O,. 从键盘读取一个字符并输出到屏幕上。 [编辑] 简单的循环,[.,] 这是一个连续从键盘读取字符并回显到屏幕上的循环。注意,这里假定0表示输入结束,事实上有些系统并非如此。以-1和"未改变"作为判断依据的程序代码分别是" [编辑] 指针维护>,[.>,] 通过移动指针保存所有的输入,供后面的程序使用。 [编辑] 加法[->+<] 把当前位置的值加到后面的单元中(破坏性的加,它导致左边的单元被归零)。 [编辑] 条件指令,----------[----------------------.,----------] 这个程序会把从键盘读来的小写字符转换成大写。按回车键退出程序。 首先,我们通过 下面我们把它输出到屏幕。然后接收下一个输入字符,并减去10。如果它是换行符,退出循环;否则,再回到循环的开始,减去22并输出……当循环退出时,因为后面已经没有其他的指令,程序也随之终止。 [编辑] 加法,>++++++[<-------->-],,[<+>-],<.>. 这个程序对两个一位数做加法,并输出结果(如果结果也只有一位数的话): 4+3 7 (现在程序开始有点复杂了。我们要涉及到数组中单元的内容了,比如[0]、[1]、[2]之类。) 第一个输入的数字被放在在[0]中,从中减去48来把它从ASCII码值48到57转换为数值0到9:这是通过在[1]中放入6,然后按照[1]中的次数让一个循环从[0]中多次减去8来完成的(当加上或减去一个大的数值时,这是常用的办法)。下一步,加号被读入[1]中;然后,第二个数字被输入,覆盖掉加号。 下面的循环 然后,指针被移回到指向[0],并输出它的内容([0]里面现在是 a + (b + 48) 的值,因为我们没有修改b的值,这等于 (a + b) + 48,也就是我们想要输出的ASCII值)。然后,把指针指向[1],里面保存着前面输入的换行符;输出换行符,程序结束。 [编辑] 乘法,>,,>++++++++[<------<------>>-] <<[>[>+>+<<-]>>[<<+>>-]<<<-] >>>++++++[<++++++++>-],<.>. 和前一个程序类似,不过这次是乘法而不是加法。 第一个输入的数字被放入[0],星号和第二个数字被放入[1],然后两个数值都被校正:减去48。 现在,程序进入了主循环。我们的基本思想是:每次从[0]中减去一,同时把[1]的值加入到保存乘积的[2]中。在实际操作中,第一个内层循环把[1]的值同时转移到[2]和[3]中,同时[1]清零(这是我们复制数字的基本方法)。下一个内层循环把[3]中的值重新放回到[1],并清零[3]。然后从[0]中减一,结束外层循环。在退出这个循环时,[0]中为零,[1]仍然是输入的第二个数值,[2]则是这两个数值的和。(要是想保存第一个数,我们可以在外层循环中每次给[4]加一,最后把[4]移回[0]。) 在结果中加48,并把换行符读入[3],输出ASCII码的乘积,然后输出刚才保存的换行符。 [编辑] 注注意,这里数组的每个单元都是一个字节大小;-命令允许溢出,它可以用255个+命令来代替。同样,如果数组单元是有限、循环的,<可以用29999个>命令代替。每个修改动作都可以被分解为最多7条指令。可是,两个连在一起的修改动作将会破坏“图灵完全”,因为这会把可能的内存状态限制到有限个数。(更确切的说,从这个角度看,现代的计算机依然不是完全意义上的“图灵完全”。) [编辑] 外部链接
| ||||||||||||||||||||||||||||||||||||||||||||||||||||


