因为有意思就转一下啦,老早的帖子了,今天偶然才发现。

以下转自一个很古老的帖子。来自ChinaUnix的flw发表于 2005-6-2 17:56

BrainFuck 语言,是一种按照“Turing complete”思想设计的语言,它的主要设计思路是:用最小的概念实现一种“简单”的语言,BrainFuck 语言只有八种符号,所有的操作都由这八种符号的组合来完成。

BrainFuck 基于一个简单的机器模型,除了八个指令,这个机器还包括:一个以字节为单位、被初始化为零的数组、一个指向该数组的指针(初始时指向数组的第一个字节)、以及用于输入输出的两个字节流。

因为 BrainFuck 只有八种指令,并且没有关键字,也不允许自定义标识符,
因此它的解释器实现起来非常简单,初学 C 语言不久的人都可以自己编出来,尽管在座的各位每人都可以自己编一个,不过为了引起大家的兴趣,我这里还是给出大家一个官方发布的版本:(转载者注:这个版本好像不能编译,在这里有一份源代码和编译好的在windows下的可执行文件,或去这里获取更多的相关资料。)

#include <stdio.h>;

int  p, r, q;
char a[5000], f[5000], b, o, *s=f;

void interpret(char *c)
{
        
char *d;

        r
++;
        
while*c ) {
                
//if(strchr("<>;+-,.[]\n",*c))printf("%c",*c);
                switch(o=1,*c++) {
                
case '<': p--;        break;
                
case '>;': p++;        break;
                
case '+': a[p]++;     break;
                
case '-': a[p]--;     break;
                
case '.': putchar(a[p]); fflush(stdout); break;
                
case ',': a[p]=getchar();fflush(stdout); break;
                
case '[':
                        
for( b=1,d=c; b && *c; c++ )
                                b
+=*c=='[', b-=*c==']';
                        
if(!b) {
                                c[
-1]=0;
                                
while( a[p] )
                                        interpret(d);
                                c[
-1]=']';
                                
break;
                        }
                
case ']':
                        puts(
"UNBALANCED BRACKETS"), exit(0);
                
case '#':
                        
if(q>;2)
                                printf(
"%2d %2d %2d %2d %2d %2d %2d %2d %2d %2d\n%*s\n",
                                       
*a,a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],3*p+2,"^");
                        
break;
                
default: o=0;
                }
                
if( p<0 || p>;100)
                        puts(
"RANGE ERROR"), exit(0);
        }
        r
--;
//        chkabort();
}

main(
int argc,char *argv[])
{
        FILE 
*z;

        q
=argc;

        
if(z=fopen(argv[1],"r")) {
                
while( (b=getc(z))>;0 )
                        
*s++=b;
                
*s=0;
                interpret(f);
        }
}

这个程序只有短短 50 多行,并且完全由 ANSI C 写成,因此你随便找个 C 语言编译器,把它编译一下:

gcc -o bfi bfi.c

之后,你就可以用它来运行 BrainFuck 程序了。

和所有的计算机语言一样,下面我给出一个“Hello World”程序:

>;+++++++++[<++++++++>;-]<.>;+++++++[<++++>;-]<+.+++++++..+++.[-]>;++++++++[<++++>;-]
<.#>;+++++++++++[<+++++>;-]<.>;++++++++[<+++>;-]<.+++.------.--------.[-]>;++++++++[
<++++>;-]<+.[-]++++++++++.

是不是很恐怖?
呵呵,我来给大家运行一下:



下面是 BrainFuck 的全部语法:

字符         含义
>;         指针加一
<         指针减一
+         指针指向的字节的值加一
-         指针指向的字节的值减一
.         输出指针指向的单元内容(ASCII码)
,         输入内容到指针指向的单元(ASCII码)
[         如果指针指向的单元值为零,向前跳转到对应的]指令的次一指令处
]         如果指针指向的单元值不为零,向后跳转到对应的[指令的次一指令处

下面这个程序则允许用户输入一个数字,
然后程序将输出小于这个数字的所有质数。

>;++++++++[<++++++++>;-]<++++++++++++++++.[-]>;++++++++++[<++++++++++>;-]<
++++++++++++++.[-]>;++++++++++[<++++++++++>;-]<+++++.[-]>;++++++++++[<+++
+++++++>;-]<+++++++++.[-]>;++++++++++[<++++++++++>;-]<+.[-]>;++++++++++[<+
+++++++++>;-]<+++++++++++++++.[-]>;+++++[<+++++>;-]<+++++++.[-]>;+++++++++
+[<++++++++++>;-]<+++++++++++++++++.[-]>;++++++++++[<++++++++++>;-]<+++++
+++++++.[-]>;+++++[<+++++>;-]<+++++++.[-]>;++++++++++[<++++++++++>;-]<++++
++++++++++++.[-]>;++++++++++[<++++++++++>;-]<+++++++++++.[-]>;+++++++[<++
+++++>;-]<+++++++++.[-]>;+++++[<+++++>;-]<+++++++.[-]+[->;,----------[<+>;-
------------------------------------->;[>;+>;+<<-]>;>;[<<+>;>;-]<>;>;>;+++++++++
[
<<<[>;+>;+<<-]>;>;[<<+>;>;-]<[<<+>;>;-]>;>;-]<<<[-]<<[>;+<-]]<]>;>;[<<+>;>;-]<<>;+<-[
>;+[>;+>;+<<-]>;>;[<<+>;>;-]<>;+<-->;>;>;>;>;>;>;>;+<<<<<<<<[>;+<-<[>;>;>;+>;+<<<<-]>;>;>;>;[<<
<<+>;>;>;>;-]<<<>;[>;>;+>;+<<<-]>;>;>;[<<<+>;>;>;-]<<<<>;>;>;[>;+>;+<<-]>;>;[<<+>;>;-]<<<[>;>;>;
>;>;+<<<[>;+>;+<<-]>;>;[<<+>;>;-]<[>;>;[-]<<-]>;>;[<<<<[>;+>;+<<-]>;>;[<<+>;>;-]<>;>;>;-]<<
<-<<-]+>;>;[<<[-]>;>;-]<<>;[-]<[>;>;>;>;>;>;[-]<<<<<<-]<<>;>;[-]>;[-]<<<]>;>;>;>;>;>;>;>;[-<
<<<<<<[-]<<[>;>;+>;+<<<-]>;>;>;[<<<+>;>;>;-]<<<>;>;[>;+<-]>;[[>;+>;+<<-]>;>;[<<+>;>;-]<>;+
++++++++<[>;>;>;+<<[>;+>;[-]<<-]>;[<+>;-]>;[<<++++++++++>;>;-]<<-<-]+++++++++>;[<
->;-]<[>;+<-]<[>;+<-]<[>;+<-]>;>;>;[<<<+>;>;>;-]<>;+++++++++<[>;>;>;+<<[>;+>;[-]<<-]>;[
<+>;-]>;[<<++++++++++>;>;>;+<-]<<-<-]>;>;>;>;[<<<<+>;>;>;>;-]<<<<>;[-]<<+>;]<[[>;+<-]+
++++++[<+++++++>;-]<->;<.[-]>;>;[<<+>;>;-]<<-]>;++++[<++++++++>;-]<.[-]>;>;>;>;>;>;>;
]
<<<<<<<<>;[-]<[-]<<-]++++++++++.[-]




Posted on 2007-11-13 01:42  Soli  阅读(1619)  评论(4编辑  收藏  举报