Brainfuck——让你脑子凌乱的程序语言

++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.
      你能猜猜这段字符在运行后会输出什么吗? 



       哈哈,告诉你它被Brainfuck编译器解释后就是Hello World!

       Brainfuck,是一种极小化的计算机语言,它是由Urban Müller在1993年创建的。由于fuck英语中是脏话,这种语言有时被称为brainf*ckbrainf***,甚至被简称为BF

        这种语言由八种运算符构成,就象它的名字所暗示的,brainfuck程序很难读懂。虽然brainfuck的计算方式如此与众不同,但它确实能够正确运行。这种语言基于一个简单的机器模型,除了指令,这个机器还包括:一个以字节为单位、被初始化为零的数组、一个指向该数组的指针(初始时指向数组的第一个字节)、以及用于输入输出的两个字节流。

 下面是这八种状态的描述,其中每个状态由一个字符标识:

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

(按照更节省时间的简单说法,]也可以说成“向前跳转到对应的[状态”。这两解释是一样的。)

(第三种同价的说法,[意思是"向后跳转到对应的]",]意思是"向前跳转到对应的[指令的次一指令处,如果指针指向的字节非零。")

Brainfuck程序可以用下面的替换方法翻译成C语言(假设ptrchar*类型):

BrainfuckC
>++ptr;
<--ptr;
+++*ptr;
---*ptr;
.putchar(*ptr);
,*ptr =getchar();
[while (*ptr) {
]}

以下是一个官方给出的50行Brainfuck语言编译器的源码。当然如果你有兴趣的话,也可以自己动手实现一个。

Brainfuck.c

<span style="font-size:18px;">#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 ) {
                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--;
}
void 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);
        }
}</span>

       这份源码是基于标准C的,可以再任何平台上编译运行。执行文件后生成Brainfuck.exe

        以下是可以被解释成Hello World!的文本文件,

      将文章开头的字段保存为1.txt文件,与Brainfuck的可执行文件放在同一目录下。在CMD中跳转到这个目录,执行:

Brainfuck 1.txt,即可看到执行结果

下面是解释:

+++ +++ +++ + initialize counter (cell #0) to 10
[ use loop to set the next four cells to 70/100/30/10
> +++ +++ + add 7 to cell #1
> +++ +++ +++ + add 10 to cell #2
> +++ add 3 to cell #3
> + add 1 to cell #4
<<< < - decrement counter (cell #0)
]
>++ . print 'H'
>+. print 'e'
+++ +++ +. print 'l'
. print 'l'
+++ . print 'o'
>++ . print ' '
<<+ +++ +++ +++ +++ ++. print 'W'
>. print 'o'
+++ . print 'r'
--- --- . print 'l'
--- --- --. print 'd'
>+. print '!'
>. print '\n'


  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Brainfuck,是一种极小化的计算机语言,它是由Urban Müller在1993年创建的。由于fuck在英语中是脏话,这种语言有时被称为brainf*ck或brainf***,甚至被简称为BF。 【内含:BF解释器,BF解释器源码,BF写的几个小程序】 ReadMe: Brainfuck 编程语言 [图灵完全] [8条指令] 语法: > 指针加一 < 指针减一 + 指针指向的字节的值加一 - 指针指向的字节的值减一 . 输出指针指向的单元内容(ASCII码) , 输入内容到指针指向的单元(ASCII码) [ 如果指针指向的单元值为零,向后跳转到对应的]指令的次一指令处 ] 如果指针指向的单元值不为零,向前跳转到对应的[指令的次一指令处 特性: 8KB 环状内存(初始化为0) <>操作不会越界 加减操作环状 +-操作不会溢出(0xFF + 为 0x00) 文件说明: bf.exe 解释器 Usage: bf [-options] source where options include: -b buffered input (default mode) 缓冲输入(按回车才输入,默认) -i not buffered input 无缓冲输入 -e not buffered input without echo 无缓冲输入且不回显 bf.cpp 解释器的源代码(纯C实现) hello.txt HelloWorld程序 up.txt 这个程序将你的输入(小写字母)转换为大写(回车结束) add.txt 这个程序对两个一位数做加法,并输出结果(如果结果也只有一位数的话)(例如:输入2+3) mul.txt 这个程序对两个一位数做乘法,并输出结果(如果结果也只有一位数的话)(例如:输入2*3) factor.txt 这个程序分解多位数的因子,并输出结果(例如:输入1000) numwarp.txt 这个程序输入 ()-./0123456789abcdef 和空格的字符串,显示很有趣的排列结果(例如:输入520 1314) prime.txt 这个程序输入一个多位整数,输出从1到这个整数间的所有素数(例如:输入100) quine.txt 这个程序输出源代码本身 [以上程序,基本上依靠回车确认]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值