一门能让你五分钟学会的语言-Brainfuck
看到标题,不出意外的话,你肯定开始骂我了:**标题党,什么编程语言五分钟就能学会?
其实我本来也是不相信的,但是学过了才知道这是真的。
1、Brainfuck
看到这个小标题,不要误会,我没有骂人。
这就是今天文章的主人公,也就是让你们五分钟能够学会的一门编程语言——Brainfuck。
Brainfuck,简称BF,是一种极小化的编程语言,由Urban Müller在1993年创造。
目标是创建一种简单的、可以用最小的编译器来实现的、符合图灵完全思想的编程语言。
PS:不得不佩服大佬命名方式,或许这就是大佬吧!!!
2、语法
学习编程语言,首先就要学习其语法。
Brainfuck 编程语言 由 8 个命令组成:
语法 | 含义 |
---|---|
> | 指针向右移动一格 |
< | 指针向左移动一格 |
+ | 使指针当前格的字节数值加1 |
- | 使指针当前格的字节数值减1 |
. | 把当前格数值按 ASCII 表输出到终端 |
, | 接受一个字节的输入,将其值存储在数据指针的字节中。 |
[ | 当指针当前值为 0 时,程序跳转至与之对应的 ] 之后;否则程序正常执行 |
] | 程序跳转回与之对应的 [ 处 |
自此,你学完了 Brainfuck 语言的所有语法,我想都用不了五分钟吧。
3、Hello World
老规矩,新语言上手的第一步就是要能输出 Hello World。
问题:这里我们先练习如何在屏幕打印一个字母 ‘A’ ?
3.1 菜鸟版
分析:
因为 ASCII 表中 'A' 对应的值为 65。所以你可能很快就会有第一种编程方案:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.
这里 +
有65个,然后通过 .
将其输出到终端,如下:
看上去解决了这个问题,但是这里的 +
实在太多了,我们编程的时候很容易少写或者多写,那么有没有什么方法能简化呢?
3.2 进阶版
ASCII 表中 'A' 对应的值为 65。为了少打几个 +
,我们很自然的想到乘法运算,65 = 13*5.
所以我们可以通过循环来改进上面的方法:
+++++
[
>+++++++++++++
<-
]
>.
这里我解释一下上面的语法:
①、第一行,有5个 +
,表示当前格子数加到 5;
②、第二行,一个 [
,表示进入一个循环;
③、第三行,表示指针向右移动一格,并且该格子数值为 13;
④、第四行,表示指针向左移动一格,并且该格子数值减 1(初始化值为5);
⑤、第五行,循环的结束语句,判断指针所在格子是否为0,不为0,移动到第3行代码继续执行,为零则退出循环。
⑥、第六行,指针向右移动一格,并且向终端输出该格子的值。
下面通过动图给大家演示一下:
3.3 输出 Hello World!
++++++++++[>+++++++>++++++++++>+++>+<<<<-]
>++.>+.+++++++..+++.>++.<<+++++++++++++++.
>.+++.------.--------.>+.>.
4、总结
不知道大家学完这门语言之后有什么感想。
首先我要说的是,这门语言并不是为了设计实际软件而设计的,而是为了挑战计算机编程的界限。
我们知道计算机界最高奖项叫图灵奖,图灵在1936年发表的 "On Computable Numbers, with an Application to the Entscheidungsproblem"(《论可计算数及其判定性问题的应用》)中提出的数学模型——图灵机(Turing Machine),描述了它是什么,并且证明了只要图灵机可以被实现,就可以用来解决任何可计算问题,感兴趣的大家可以去研究研究。
这门语言对于我们去理解图灵思想也是很有帮助的。
比如,一门新的语言,我们要证明其是否是图灵完备的,如果用数学证明的方式必然会比较复杂,但是如果你能用这门新语言实现一个 Brainfuck 的解释器,那么就必然证明其是图灵完备的。
彩蛋
Brainfuck 语言图形化演示:https://openprocessing.org/sketch/516467
最新文章
- Linux cat命令
- vc++6.0各种报错合集(附:VC++6.0调出打印窗口的方法)
- mysql 5.6并行复制事件分发机制
- A + B Problem II
- Go语言学习资源
- WPF的MVVM模式
- BZOJ 1600: [Usaco2008 Oct]建造栅栏( dp )
- Angularjs 基于karma和jasmine的单元测试
- 关于int全区变量读写的原子性
- 修改maven的默认JDK
- 《java入门第一季》之面向对象静态内部类和非静态内部类的区别
- 第四周java学习总结
- sql父子表结构,常用脚本
- [转]python3之paramiko模块(基于ssh连接进行远程登录服务器执行命令和上传下载文件的功能)
- 菜鸟要做架构师(二)——java性能优化之for循环
- Android病毒家族及行为(一)
- C++ map.insert: pair和make_pair区别
- iptables 指令语法
- 20145327 《网络对抗》MSF基础应用
- Just a Hook (线段树)