Brainfuck是由 Urban Müller 于 1993 年设计的,是一种深奥的编程语言,在设计时并没有考虑到实用性。相反,它的目标是拥有尽可能最小的编译器,同时仍然是图灵完备的。
图灵完备是指机器执行任何其他可编程计算机能够执行计算的能力。简单来说,一切可计算的问题都能计算,这样的虚拟机或者编程语言就叫图灵完备的。这个词源于引入图灵机概念的数学家艾伦·图灵。
Brainfuck仅使用 8 个命令,提供了一种简约的编码方法。这是完整的语言。这组稀疏的命令操作一个存储单元数组,所有单元都初始化为零。
命令 | 含义 |
---|---|
> | increases memory pointer, or moves the pointer to the right 1 block. (指针指向下一个存储单元) |
< | decreases memory pointer, or moves the pointer to the left 1 block. (指针指向上一个存储单元) |
+ | increases value stored at the block pointed to by the memory pointer (指针指向的存储单元的数据加1) |
- | decreases value stored at the block pointed to by the memory pointer (指针指向的存储单元的数据减1) |
. | output the character signified by the cell at the pointer; like c putchar(). print 1 character to the console (输出指针指向的数据单元所表示的字符) |
, | input a character and store it in the cell at the pointer; like c getchar(). input 1 character. (输入一个字符,将其存储在指针指向的存储单元内) |
[ | jump past the matching ] if the cell at the pointer is 0; like c while(cur_block_value != 0) loop. (如果指针指向的存储单元的数据为0,则跳过匹配的]) |
] | jump back to the matching [ if the cell at the pointer is nonzero; if block currently pointed to’s value is not zero, jump back to [ (如果指针指向的存储单元的数据非0,则跳转回匹配的[) |
其它规则:
(1)Brainfuck对一组存储单元进行操作,每个存储单元最初都设置为零。存在有一个指针,最初指向第一个存储单元。
(2)Brainfuck编译器一般会提供具有30,000个1字节内存块组成的数组空间。
(3)Brainfuck编译器在编译时除上述的8个字符之外的任意字符都会被忽略,即都认为是注释。
(4)循环可以根据需要嵌套任意次数,但是所有[命令必须有一个对应的]命令。
Brainfuck语言的基础代码案例:
(1)循环语句
+++++[-]
等价于
*p=+5;
while(*p != 0){
*p--;
}
(2)基于ASCII码,打印"Hello, World!"
>+++++++++[<++++++++>-]<.>+++++++[<++++>-]<+.+++++++..+++.[-]
>++++++++[<++++>-] <.>+++++++++++[<++++++++>-]<-.--------.+++
.------.--------.[-]>++++++++[<++++>- ]<+.[-]++++++++++.