以前学编译的都喜欢用Lisp练手,现在貌似改Brainfuck(参见:维基、Wiki)了。
Brainfuck更简单(就八个命令),而且还是Turing完备的。Brainfuck简直就是对Turing机的直接模拟:一条初始为零的带子、一个指针。不过,Turing机的纸带似乎具有代码和数据双重功能,而Brainfuck更像是把纸带当容器)。
Brainfuck的语法如下:
指令 | 动作 |
---|---|
> | 右移一格 |
< | 左移一格 |
+ | 指针指向的字节的值加一 |
- | 指针指向的字节的值减一 |
. | 输出指针指向的单元内容(ASCII码) |
, | 输入内容到指针指向的单元(ASCII码) |
[ | 向後跳转到对应的] |
] | 向前跳转到对应的[ 指令的次一指令处,如果指针指向的字节非零 |
前六条都还好理解,最后两条就不那么直观了(Turing机里是没有直接对应的)。
pc就是指针(program counter)。
纸带:
这就体现出高阶语言的好处了:不用考虑分配内存,近乎无限的纸带。
test.bf 的内容:
Wiki 上有解释:
P.S. 本文代码源自一篇介绍如何用PyPy写解释器(已被墙)的文章,不过前半部分与PyPy没什么关系。
P.P.S 还好一般不译语言的名字,不然Brainfuck是该译成“脑残”好呢,还是“脑袋被驴踢了”
P.P.P.S 本着“Python能干的事情Ruby也能做”的理念,我用Ruby改写了一遍:
P.P.P.P.S 有人写过一个很丑但很短的Ruby版Brainfuck解释器。真的很丑-_-!