频道导航:Blog - 收集 - 资源服务 - 苏慧伦在线试听 - 关于
娱乐一下,介绍一种语言——brainfuck
语言一共只有8个符号
+-><.,[]
brainfuck的程序全部都由这8个符号构成
初始化的时候,有一个连续的两个方向都无限长的内存,内存的每个字节值是0。
有一个指针p,指向其中一个字节。
每个符号的意义如下:
+  指针指向的这个字节自加
-   指针指向的这个字节自减
>  指针向右移一个字节
<  指针向左移一个字节
.   输出指针指向的这个字节
,   输入这个字节,存在指针指向的这个字节
[   如果指针指向的这个字节,则进入循环节
]   回到匹配的[(比如[--.[++>.[+]---].-],^指着的两个是匹配的])
                               ^              ^

以下程序输出“cjaizss”
 
CODE:
++++++++++[>++++++++++[>+<-]<-]>>-.+++++++.---------.++++++++.
>>++++[<++++[<+>-]>-]<<+.-------..
 
C语言解释器:
/*bf.c*/
#include <stdio.h>
#include <stdlib.h>
char s[30000]={0};
char code[100000];
int len = 0;
int  stack[100];
int stack_len=0;
int main(int argc,char**argv)
{
        char c;
        int i=0,j,k,x=0;
        FILE* f;
        char* p=s+10000;
        if(argc==2) {
                f=fopen(argv[1],"r");
                if(f==NULL) {
                        perror("fopen");
                                return 1;
                }
                while(fread(&code[len],1,1,f)==1) {
                        len++;
                }
        } else {
                fprintf(stderr,"%s:%d\n",__FILE__,__LINE__);
                return 2;
        }
        setbuf(stdout,NULL);
        while(i<len) {
                switch(code[i]) {
                        case '+':
                                (*p)++;
                                break;
                        case '-':
                                (*p)--;
                                break;
                        case '>':
                                p++;
                                break;
                        case '<':
                                p--;
                                break;
                        case '.':
                                putchar((int)(*p));
                                //printf("put:%hd\n",*p);
                                break;
                        case ',':
                                *p=getchar();
                                break;
                        case '[':
                                if(*p) {
                                        stack[stack_len++]=i;
                                } else {
                                        for(k=i,j=0;k<len;k++) {
                                                code[k]=='['&&j++;
                                                code[k]==']'&&j--;
                                                if(j==0)break;
                                        }
                                        if(j==0)
                                                i=k;
                                        else {
                                                fprintf(stderr,"%s:%d\n",__FILE__,__LINE__);
                                                return 3;
                                        }
                                }
                                break;
                        case ']':
                                i=stack[stack_len-- - 1]-1;
                                break;
                        default:
                                break;
                }
                i++;
                //x++;
                //printf("%d : i=%d\n",x,i);
        }
        return 0;
}