互联网上的奇怪东西——BrainFuck

最后更新于 2023-01-03 347 次阅读


BrainFuck

http://www.muppetlabs.com/~breadbox/bf/

Brainfuck,简称BF,是一种极小化的程序语言,由Urban Müller在1993年创造。Fuck在英语中是脏话,所以这种语言有时称为Brainf*ckBrainf***,或者只用简称。

Müller的目标是创建一种简单的、可以用最小的编译器来实现的、符合图灵完全思想的编程语言。这个语言由八种运算符构成,为Amiga机器编写的编译器(第二版)只有240个字节大小。[1]

Brainfuck 的名字已经暗示出来,它的程序代码很难读懂。尽管如此,Brainfuck仍然可以像图灵机一般完成任何计算任务。它虽然计算方式与众不同,但确实能够正确运行。

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

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

字符含义
>指针加一
<指针减一
+指针所指字节的值加一
-指针所指字节的值减一
.输出指针所指字节内容(ASCII码)
,向指针所指的字节输入内容(ASCII码)
[若指针所指字节的值为零,则向后跳转,跳转到其对应的]的下一个指令处
]若指针所指字节的值不为零,则向前跳转,跳转到其对应的[的下一个指令处

Brainfuck指令可以逐一替换,翻译成C语言(假设ptr是char *类型)的语句之类:

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

例子

Hello World!

在屏幕上打印Hello World!:

++++++++++[>+++++++>++++++++++>+++>+<<<<-]
>++.>+.+++++++..+++.>++.<<+++++++++++++++.
>.+++.------.--------.>+.>.

BF翻译成C++

string translate(char c)
{
    switch (c)
    {
        case '>':
            return "p++";
        case '<':
            return "p--";
        case '+':
            return "*p = *p + 1";
        case '-':
            return "*p = *p - 1";
        case '.':
            return "cout<<char(p)"; 
        case ',': 
            return "p=getchar()";
        case '[':
            return "while(*p){";
        case ']':
            return "}";
        default:
            return "";
    }
}

int main()
{
    char c;
    while (cin >> c) {
        cout << translate(c);
        if (c != '[') cout << ";\n";
    }
    return 0;
}