BrainFuck
http://www.muppetlabs.com/~breadbox/bf/
Brainfuck,简称BF,是一种极小化的程序语言,由Urban Müller在1993年创造。Fuck在英语中是脏话,所以这种语言有时称为Brainf*ck或Brainf***,或者只用简称。
Müller的目标是创建一种简单的、可以用最小的编译器来实现的、符合图灵完全思想的编程语言。这个语言由八种运算符构成,为Amiga机器编写的编译器(第二版)只有240个字节大小。[1]
Brainfuck 的名字已经暗示出来,它的程序代码很难读懂。尽管如此,Brainfuck仍然可以像图灵机一般完成任何计算任务。它虽然计算方式与众不同,但确实能够正确运行。
这种语言基于一个简单的机器模型。这个机器除了指令以外,还包括:一个以字节为单位、已初始化为零的数组、一个指向该数组的指针(开始时指向数组的第一个字节)、以及用于输入输出的两个字节流。
下面是这八种状态的描述,其中每个状态由一个字符标识:
| 字符 | 含义 |
|---|---|
| > | 指针加一 |
| < | 指针减一 |
| + | 指针所指字节的值加一 |
| - | 指针所指字节的值减一 |
| . | 输出指针所指字节内容(ASCII码) |
| , | 向指针所指的字节输入内容(ASCII码) |
| [ | 若指针所指字节的值为零,则向后跳转,跳转到其对应的]的下一个指令处 |
| ] | 若指针所指字节的值不为零,则向前跳转,跳转到其对应的[的下一个指令处 |
Brainfuck指令可以逐一替换,翻译成C语言(假设ptr是char *类型)的语句之类:
| Brainfuck | C |
|---|---|
| > | ++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;
}