一些隐写题中可能会出此现这种东西,下面我来大概介绍一下:
官方网站: http://www.muppetlabs.com/~breadbox/bf/
BrainFuck, (An Eight-Instruction Turing-Complete Programming Language), 这个语言本身的语言模型很简单, 有一个byte指针, 有一个初始化为0长度为30000 bytes的数组, byte指针可以在数组内任意移动, 支持下面的八种操作, 指针初始化指向数组的开始. 这个语言只是作者为了写一个很简单的编译器, 才设计的一门语言, 语言和名字一样, 很难读懂, 简单的一些操作用BrainFuck来写都很复杂难读.
八种操作符定义如下:
字符 |
含义 |
> |
指针加一 |
< |
指针减一 |
+ |
指针指向的字节的值加一 |
- |
指针指向的字节的值减一 |
. |
输出指针指向的单元内容(ASCII码) |
, |
输入内容到指针指向的单元(ASCII码) |
[ |
如果指针指向的单元值为零,向后跳转到对应的]指令的次一指令处 |
] |
如果指针指向的单元值不为零,向前跳转到对应的[指令的次一指令处 |
Brainfuck程序可以用下面的替换方法翻译成C语言(假设ptr是char*类型):
Brainfuck |
C |
> |
++ptr; |
< |
–ptr; |
+ |
++*ptr; |
- |
–*ptr; |
. |
putchar(*ptr); |
, |
*ptr =getchar(); |
[ |
while (*ptr) { |
] |
} |
举个例子:
++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>++.>+.+++++++..+++.<<++.>+++++++++++++++.>.+++.------.--------.<<+.<.
这个编译后就是 ‘Hello World!’
其实只要工具就好了!!!
贴一个python实现的解释器:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
| import os import sys def mainloop(program, bracket_map): pc = 0 tape = Tape() while pc < len(program): code = program[pc] if code == ">": tape.advance() elif code == "<": tape.devance() elif code == "+": tape.inc() elif code == "-": tape.dec() elif code == ".": os.write(1, chr(tape.get())) elif code == ",": tape.set(ord(os.read(0, 1)[0])) elif code == "[" and tape.get() == 0: pc = bracket_map[pc] elif code == "]" and tape.get() != 0: pc = bracket_map[pc] pc += 1 class Tape(object): def __init__(self): self.thetape = [0] self.position = 0 def get(self): return self.thetape[self.position] def set(self, val): self.thetape[self.position] = val def inc(self): self.thetape[self.position] += 1 def dec(self): self.thetape[self.position] -= 1 def advance(self): self.position += 1 if len(self.thetape) <= self.position: self.thetape.append(0) def devance(self): self.position -= 1 def parse(program): parsed = [] bracket_map = {} leftstack = [] pc = 0 for char in program: if char in ('[', ']', '<', '>', '+', '-', ',', '.'): parsed.append(char) if char == '[': leftstack.append(pc) elif char == ']': left = leftstack.pop() right = pc bracket_map[left] = right bracket_map[right] = left pc += 1 return "".join(parsed), bracket_map def run(fp): program_contents = "" while True: read = os.read(fp, 4096) if len(read) == 0: break program_contents += read os.close(fp) program, bm = parse(program_contents) mainloop(program, bm) if __name__ == '__main__': run(os.open(sys.argv[1], os.O_RDONLY, 0777))
|
c编写的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| include <stdio.h>; int p, r, q; char a[5000], f[5000], b, o, *s=f; void interpret(char *c) { char *d; r++; while( *c ) { switch(o=1,*c++) { case '<': p--; break; case '>': p++; break; case '+': a[p]++; break; case '-': a[p]--; break; case '.': putchar(a[p]); fflush(stdout); break; case ',': a[p]=getchar();fflush(stdout); break; case '[': for( b=1,d=c; b && *c; c++ ) b+=*c=='[', b-=*c==']'; if(!b) { c[-1]=0; while( a[p] ) interpret(d); c[-1]=']'; break; } case ']': puts("UNBALANCED BRACKETS"), exit(0); case '#': if(q>2) printf("%2d %2d %2d %2d %2d %2d %2d %2d %2d %2d/n%*s/n", *a,a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],3*p+2,"^"); break; default: o=0; } if( p<0 || p>100) puts("RANGE ERROR"), exit(0); } r--; } void main(int argc,char *argv[]) { FILE *z; q=argc; if(z=fopen(argv[1],"r")) { while( (b=getc(z))>0 ) *s++=b; *s=0; interpret(f); } }
|
编译一下就可以用了。
嗯,就这些。