Brainfuck语言的前世今生

218 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第18天,点击查看活动详情

Brainfuck

Brainfuck简介

Brainfuck是一种极小化的计算机语言,它是由Urban Müller在1993年创建的。由于fuck在英语中是脏话,这种语言有时被称为brainf*ck或brainf**k,甚至被简称为BF。

创始人Müller的目标是建立一种简单的、可以用最小的编译器来实现的、符合图灵完全思想的编程语言。这种语言由八种状态构成,为Amiga机器编写的编译器(第二版)只有240个字节大小!

就象它的名字所暗示的,brainfuck程序很难读懂。尽管如此,brainfuck图灵机一样可以完成任何计算任务。虽然brainfuck的计算方式如此与众不同,但它确实能够正确运行。

这种语言基于一个简单的机器模型,除了指令,这个机器还包括:一个以字节为单位、被初始化为零的数组、一个指向该数组的指针(初始时指向数组的第一个字节)、以及用于输入输出的两个字节流。

这种语言,是一种按照“Turing complete(图灵完备)”思想设计的语言,它的主要设计思路是:用最小的概念实现一种“简单”的语言,BrainF**k 语言只有八种符号,所有的操作都由这八种符号的组合来完成。

Brainfuck的组成

在上面我们知道了Brainfuck语言由八种符号(也就是八个命令)组成

下面我们来简单看一下这八种命令

语法含义
>指针向右移动一格
<指针向左移动一格
+使指针当前格的字节数值加1
-使指针当前格的字节数值减1
.把当前格数值按 ASCII 表输出到终端
,接受一个字节的输入,将其值存储在数据指针的字节中
[当指针当前值为 0 时,程序跳转至与之对应的 ] 之后;否则程序正常执行
]程序跳转回与之对应的 [ 处

Brainfuck的应用

我们以输出A为例子,看一下它的语法是怎么用的

首先我们知道A的ASCII码值是65

我们就可以通过六十五个+和.将它输出出来

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.

但是,看上去解决了问题,但是这里的 + 实在太多了,我们编程的时候很容易少写或者多写,所以我们可以想个办法将之简化

于是自然而然的可以想到乘法运算,65 = 13*5.

所以我们可以通过循环来改进上面的方法(//后为注释):

+++++  //5个 `+`,表示当前格子数加到 5;
[      //一个 `[`,表示进入一个循环;
>+++++++++++++ //表示指针向右移动一格,并且该格子数值为 13;
<-    //表示指针向左移动一格,并且该格子数值减 1(初始化值为5);
]     //循环的结束语句,判断指针所在格子是否为0,不为0,移动到第3行代码继续执行,为零则退出循环
>.   //指针向右移动一格,并且向终端输出该格子的值

可以合起来写

+++++ [ >+++++++++++++ <- ] >.

以此类推

我们输出一下Hello World!

++++++++++[>+++++++>++++++++++>+++>+<<<<-] >++.>+.+++++++..+++.>++.<<+++++++++++++++. >.+++.------.--------.>+.>.

它的语法是这样的,

当然,它的应用场景并不是要我们去表示字符串,

而是我们遇到的时候能够认识Brainfuck,并解出中间的字符串

大家也可以通过Brainfuck图形化演示网站来看一下它的运行过程

Brainfuck 语言图形化演示:openprocessing.org/sketch/5164…