Brainfuck 仅由八个简单的命令和一个指令指针组成。虽然它是图灵完备的,但它的初衷并不是为了实际应用,而是为了挑战和娱乐程序员。
BrainFuck 仅包含 8 个字符命令,这使得即使执行简单的任务也变得颇具挑战性——
- > 命令将数据指针向右递增(指向右侧的下一个单元格)。
- < 命令将数据指针向左递减(指向左侧的下一个单元格)。
- + 命令将数据指针处的字节递增(加一)。
- – 命令将数据指针处的字节递减(减一)。
- . 命令输出数据指针处的字节。
- , 命令接受一个字节的输入,并将其值存储在数据指针处的字节中。
- [ – 如果数据指针处的字节为零,则不是将指令指针向前移动到下一个命令,而是将其向前跳转到匹配的 ] 命令之后的命令。
- ] – 如果数据指针处的字节非零,则不是将指令指针向前移动到下一个命令,而是将其向后跳转到匹配的 [ 命令之后的命令。
- (或者,] 命令也可以被解释为无条件跳转到对应的 [ 命令,反之亦然;程序的行为将保持不变,但由于不必要的双重搜索,运行速度会变慢。)
- [ 和 ] 的匹配方式通常与括号一样:每个 [ 精确匹配一个 ],反之亦然,[ 在前,并且两者之间不能有不匹配的 [ 或 ]。
> 注意:每个 [ 必须有一个对应的 ],反之亦然。如果不匹配(例如,一个不匹配的 [ 或 ]),解释器将无法执行程序或产生意外结果。正确匹配 [ 和 ] 对于编写有效的 Brainfuck 程序至关重要。
>
> (或者,] 命令也可以被解释为无条件跳转到对应的 [ 命令,反之亦然;程序的行为将保持不变,但由于不必要的双重搜索,运行速度会变慢。)
>
> [ 和 ] 的匹配方式通常与括号一样:每个 [ 精确匹配一个 ],反之亦然,[ 在前,并且两者之间不能有不匹配的 [ 或 ]。
由于 BrainFuck 仅由这 8 个命令组成,因此为 BrainFuck 构建一个解释器非常简单。在本文中,我们将构建一个简单的程序,它接受 BrainFuck 代码作为输入并产生所需的输出。我们只需将 BrainFuck 代码作为字符串接收,通过解析该字符串并检查每个字符的实际功能来产生输出。内存由一个字节数组表示,模拟最大 65535 位的内存,范围从 0 到 65534(65535 是可以用无符号 16 位二进制数表示的最大数字)。变量 ptr 指的是内存数组的当前索引。
在本文中,我们将不讨论用 BrainFuck 编写程序的细节。有关编写 BrainFuck 程序的更多详细信息,请参阅以下链接:
示例:
Input :
Output : Hello World!
Input :
Output : GEEKS FOR GEEKS
BrainFuck 解释器的 Java 实现-
Java
`
import java.util.*;
class BrainFuck
{
private static Scanner ob = new Scanner(System.in);
private static int ptr; // Data pointer
// Max memory limit. It is the highest number which
// can be represented by an unsigned 16-bit binary
// number. Many computer programming environments
// beside brainfuck may have predefined
// constant values representing 65535.
private static int length = 65535;
// Array of byte type simulating memory of max
// 65535 bits from 0 to 65534.
private static byte memory[] = new byte[length];
// Interpreter function which accepts the code
// a string parameter
private static void interpret(String s)
{
int c = 0;
// Parsing through each character of the code
for (int i = 0; i moves the pointer to the right
if (s.charAt(i) == ‘>‘)
{
if (ptr == length - 1)//If memory is full
ptr = 0;//pointer is returned to zero
else
ptr ++;
}
// < moves the pointer to the left
else if (s.charAt(i) == '<')
{
if (ptr == 0) // If the pointer reaches zero
// pointer is returned to rightmost memory
// position
ptr = length - 1;
else
ptr --;
}
// + increments the value of the m