由于以前没有人发过这篇文章(讽刺),我用java做了一个brainfuck翻译。解释器适合于一个单一的方法,并被设计成可读性、快速性和简洁性,因此请回顾这些内容。我对它进行了测试,以确定它是否有效。
/**
* Interpret program as a brainfuck program with the given standard input
* and output.
*
* @throws IOException
* if thrown by stdin or stdout
*/
public static void brainfuck(String program, OutputStream stdout, InputStream stdin) throws IOException {
int[] commands = program.chars().filter(c -> "><+-./[]".indexOf(c) != -1).toArray();
int commandPointer = 0;
int[] memory = new int[30_000];
int memoryPointer = 0;
while (commandPointer < commands.length) {
switch (commands[commandPointer]) {
case '>':
memoryPointer++;
if (memoryPointer >= memory.length)
memoryPointer = 0;
break;
case '<':
memoryPointer--;
if (memoryPointer < 0)
memoryPointer = memory.length - 1;
break;
case '+':
memory[memoryPointer]++;
if (memory[memoryPointer] > 255)
memory[memoryPointer] = 0;
break;
case '-':
memory[memoryPointer]--;
if (memory[memoryPointer] < 0)
memory[memoryPointer] = 255;
break;
case '.':
stdout.write(memory[memoryPointer]);
break;
case ',':
memory[memoryPointer] = stdin.read();
memory[memoryPointer] %= 256;
break;
case '[':
if (memory[memoryPointer] == 0) {
int depth = 1;
while (depth > 0) {
commandPointer++;
if (commands[commandPointer] == '[')
depth++;
else if (commands[commandPointer] == ']')
depth--;
}
}
break;
case ']':
if (memory[memoryPointer] != 0) {
int depth = 1;
while (depth > 0) {
commandPointer--;
if (commands[commandPointer] == ']')
depth++;
else if (commands[commandPointer] == '[')
depth--;
}
}
break;
}
commandPointer++;
}
}发布于 2016-09-17 07:45:43
你已经达到了两个目标。翻译是非常可读的和非常简洁的。它非常快,但是可以很容易地变得更快,但是这样代码就会变得更长、更复杂。
如果您希望解释器保持可读性,请保持原样。也许可以在Javadoc中记录环绕语义。
您可以更改的一件事是,,命令只是memory[memoryPointer] = stdin.read() & 0xFF;。这比% 256更常见,因为这是关于比特的规定,而不是算术。
https://codereview.stackexchange.com/questions/139015
复制相似问题