Brainfuck一种极小化的计算机语言
更新: 2024/12/12 字数: 0 字 时长: 0 分钟
Brainfuck介绍
它是由Urban Müller
在1993年创建的。Müller
的目标是建立一种简单的、可以用最小的编译器来实现的、符合图灵完全思想的编程语言。这种语言由八种状态构成,为Amiga
机器编写的编译器(第二版)只有240个字节大小。
就象它的名字所暗示的,brainfuck
程序很难读懂。尽管如此,brainfuck
图灵机一样可以完成任何计算任务。虽然brainfuck
的计算方式如此与众不同,但它确实能够正确运行。
这种语言基于一个简单的机器模型,除了指令,这个机器还包括:一个以字节为单位、被初始化为零的数组、一个指向该数组的指针(初始时指向数组的第一个字节)、以及用于输入输出的两个字节流。
这种语言,是一种按照Turing complete(图灵完备
思想设计的语言,它的主要设计思路是:用最小的概念实现一种极简的语言,BrainFuck
语言只有八种符号,所有的操作都由这八种符号的组合 来完成。
指令
BF只有8种有效字符,其实就是8种指令:
字符 | 含义 |
---|---|
> | 指针加一 |
< | 指针减一 |
+ | 指针指向的字节的值加一 |
- | 指针指向的字节的值减一 |
. | 输出指针指向的单元内容(ASCⅡ码) |
, | 输入内容到指针指向的单元(ASCⅡ码) |
[ | 如果指针指向的单元值为零,向后跳转到对应的]指令的次一指令处 |
] | 如果指针指向的单元值不为零,向前跳转到对应的[指令的次一指令处 |
这里的指针都是指向一个8位的整数,即char,加减法的溢出规则也是和char型整数的溢出规则一致。
纸带是双向的,和图灵机保持一致。
翻译成C/C++
BF可以简单的翻译成C/C++语言:
Brainfuck | C |
---|---|
> | ++ptr; |
< | --ptr; |
+ | ++*ptr; |
- | --*ptr; |
. | putchar(*ptr); |
, | *ptr =getch(); |
[ | while (*ptr) { |
] | } |
当前位置清零
[-]
将当前指针的值归零
之前位置清零
[[-]<]
将当前指针以及之前的指针归零
字符I/O
,.
从键盘读取一个字符并输出到屏幕上
简单的循环
,[.,]
这是一个连续从键盘读取字符并回显到屏幕上的循环。注意,这里假定0表示输入结束,事实上有些系统并非如此。以-1和"未改变"作为判断依据的程序代码分别是,+[-.,+]
和,[.[-],]
指针维护
>,[.>,]
通过移动指针保存所有的输入,供后面的程序使用。
加法
[->+<]
把当前位置的值加到后面的单元中(破坏性的加,它导致左边的单元被归零)
打印Hello World!
有了打印一个字符的经验和归0操作,接下来就可以输出任意字符了:
Ascii码分别是72,101,108,108,111,32,87,111,114,108,100,33
+++++++++
[->++++++++<]
>.[[-]<]
++++++++++
[->++++++++++<]
>+.[[-]<]
+++++++++
[->++++++++++++<]
>.[[-]<]
+++++++++
[->++++++++++++<]
>.[[-]<]
+++++++++
[->++++++++++++<]
>+++.[[-]<]
++++++++
[->++++<]
>.[[-]<]
++++++++
[->+++++++++++<]
>-.[[-]<]
+++++++++
[->++++++++++++<]
>+++.[[-]<]
+++++++++
[->++++++++++++<]
>++++++.[[-]<]
+++++++++
[->++++++++++++<]
>.[[-]<]
++++++++++
[->++++++++++<]
>.[[-]<]
++++++++
[->++++<]
>+.[[-]<]
BrainFuck解释器
最后推荐一个好用的BrainFuck加密解密网站AmanCTF - Brainfuck/OoK
加密解密Brainfuck/OoK
在线加密解密
https://ctf.bugku.com/tool/brainfuck
如果你发现这篇指南有用,或者有改进建议,请随时联系我们或参与讨论。🎉 🎉 🎉