我们来做大脑操
写下这个题目的时候哈,shellex又一次,情不自禁地,为我们汉语的博大精深而热泪盈眶。多么美妙的翻译啊,大脑操,要是鹰语就不行咯,彻底沦于庸俗:brainfuck。当然了,还有一些女士叫法,比如brainf**k(请看我的文章分类),b*fuck,brainf*ck等等。但是不管你怎么叫它,它都是brainfuck,是为了fuck你的brain而生的。
这个语言绝对是世界上最淫荡的语言之一了。虽然Shellex很早就知道它的淫荡,但是直到今天才介绍给大家,还望见谅咯。
好吧,这么说有点无聊,但是它不是为了fuck你的brain而生的。按照作者的说法,他想写一个最小的图灵完备的计算机语言,那么如果稍微接触一下brainfuck你会发现他也许真的达到目标了。因为brainfuck程序就是像一个图灵机那样运作。
语言说明:
Brainfuck 程序中有一个隐含的指针, 被称为 “the pointer”, 它能在一个长度为30 000字节的数组上来回移动。这个数组总是被初始化为0,而指针则总是被初始化指向数组的头部。
Brainfuck 语言很简单,只有8个指令,都用一个字符来表示
- < 指针左移.
- > 指针右移.
- + 指针自增.
- - 指针自减.
- . 输出当前指针指向的字节.
- , 接受一个输入并储存在当前当前字节.
- [ 如果当前指针不为0,则运行直到遇到]
- ] 如果当前指针不为0,跳回到匹配的 [
Shellex的brainfuck解释器的实现中,还私自添加了一个扩展指令:
- $ 在内存监视器打印程序内存情况.
当然了,Brainfuck的语义可以简洁地用C语言的形式来表达(假设p是一个char *类型的变量)
- > becomes ++p;
- < becomes --p;
- + becomes ++*p;
- - becomes --*p;
- . becomes putchar(*p);
- , becomes *p = getchar();
- [ becomes while (*p) {
- ] becomes }
我靠,这玩意能干嘛?
Shellex告诉你,由于brainfuck符合图灵完备性,所以从理论上你可以在brainfuck上写出任何东西来。比如Linux,比如Vista,比如魔兽世界 之 燃烧的远征,比如尾行3 ….
在Wikipedia的brainfuck词条你可以得到一些常用的算法和程序结构,比如分支/循环结构,四则运算什么的。
比如下面这个,是传说中brainfuck版本的Hello world:
++++++++++ initialises cell zero to 10
[
>+++++++>++++++++++>+++>+<<<<-
] this loop sets the next four cells to 70/100/30/10
>++. print ‘H’
>+. print ‘e’
+++++++. ‘l’
. ‘l’
+++. ‘o’
>++. space
<<+++++++++++++++. ‘W’
>. ‘o’
+++. ‘r’
- – - – - -. ‘l’
- – - – - – - -. ‘d’
>+. ‘!’
>. newline
下面这个稍微复杂一点的东西则是一个半加器,0+1=01, 1+0=01, 1+1=11, 0+0=00
#fill cell[0] with ‘0′
>++++++ +[<+++++++>-]<-
>>
#read two chars into cell[3], cell[4]
>,$>,$
#cell[4]=cell[3]+cell[4]
<[>+<-]>$
#cell[5]=’1′
>>+++ +++ +[<+++ +++ +>-]$
#move back to cell[5]
<
#cell[6]=cell[7]=cell[5]
[>+>+<<-]>-$>-$
#cell[4]=cell[4]-cell[7]
[<<<->>>-]<<<$
#cell[1]=cell[2]=cell[3]=cell[4]
#cell[4]=0
[<+<<+>+>>-]$<<
#move to cell[6]
>>>>$
#cell[2]=cell[2]-cell[6]
[<<<<->>>>-]<<<<$
#if cell[2]!=0
[
#move to cell[0]
<<
#move to cell[1]
>
#clear cell[1] and move to cell[4]
[-]$
>>>
#cell[1]=’1′
+++ +++ +[<<<+++ +++ +>>>-]
<<$
#cell[2]=cell[2]-1
-
#if cell[2]!=0
[
#cell[0]=cell[0]+1
<<+
>>-
]
#clear cell[2]
[-]$
]
#output cell[0] and cell[1]
<<
.>.
当然了,我还很乐意提供一个在线的brainfuck解释器,您只要猛击下面的地址就可以。但是请注意,由于这个解释器的性能和IO都有限制,所以不要用它运行过分复杂的程序;而且由于考虑到IE的javascript性能,所以请使用非IE浏览器来使用这个解释器。
Shellex‘s Brainfuck解释器:http://shellex.info/shellex_toolkits/brainfuck.html(你可以试试上面的源码)
在解释器底部有一些brainfuck相关的资源,包括brainfuck的主页和资源,甚至包括一个支持brainfuck的ACM/ICPC online Judgement 系统: SPOJ(我曾经试图用brainfuck解决该OJ的第一题,但是Shellex实在是缺乏这样的毅力
)。也许你会有兴趣?
