一门能让你五分钟学会的语言-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
一门能让你五分钟学会的语言-Brainfuck的更多相关文章
- [分享] 史上最简单的封装教程,五分钟学会封装系统(以封装Windows 7为例)
[分享] 史上最简单的封装教程,五分钟学会封装系统(以封装Windows 7为例) 踏雁寻花 发表于 2015-8-23 23:31:28 https://www.itsk.com/thread-35 ...
- 五分钟学会 Kotlin 语法
为什么使用Kotlin 项目一期在收尾了终于有时间折腾了,一个多月以来Kotlin从入门到现在,坚持用来开发的切身感受.因为语法与Java的区别挺大的一开始很想放弃,如果不是因为项目在使用,想必很少人 ...
- 五分钟学会Python装饰器,看完面试不再慌
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Python专题的第12篇文章,我们来看看Python装饰器. 一段囧事 差不多五年前面试的时候,我就领教过它的重要性.那时候我Pyt ...
- 喝咖啡写脚本,顺便再加一点点CSS语法糖 2.五分钟学会Less
CoffeeScript + Html5 + Less这个新组合,看上去Less更容易拿下,先尝尝糖吧. Less这么小个东西,竟然要FQ,真是没有天理,简直不可理喻,先不管那么多了,那就看这个吧.h ...
- 五分钟学会centos配置gitlab
下载gitlab 亲测: centos6.5 安装依赖包: : yum install curl policycoreutils policycoreutils-python openssh-serv ...
- 五分钟学会悲观乐观锁-java vs mysql vs redis三种实现
1 悲观锁乐观锁简介 乐观锁( Optimistic Locking ) 相对悲观锁而言,乐观锁假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果 ...
- 五分钟学会HTML5的WebSocket协议
1.背景 很多网站为了实现推送技术,所用的技术都是Ajax轮询.轮询是在特定的的时间间隔由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器.这种传统的模式带来很明显的缺点 ...
- 五分钟学会conda常用命令
文章目录 conda常用命令 1. 获取版本号 2. 获取帮助 3. 环境管理 4. 分享环境 5. 包管理 conda常用命令 1. 获取版本号 conda --version 或 conda -V ...
- 五分钟学会generator函数
什么是generator函数? 常规函数只会返回一个单一值(或者不返回任何值). 而 Generator 可以按需一个接一个地返回("yield")多个值.它们可与 iterabl ...
随机推荐
- RocketMQ之消费者启动与消费流程
vivo 互联网服务器团队 - Li Kui 一.简介 1.1 RocketMQ 简介 RocketMQ是由阿里巴巴开源的分布式消息中间件,支持顺序消息.定时消息.自定义过滤器.负载均衡.pull/p ...
- HCNP Routing&Switching之DHCP中继
前文我们聊了下BFD相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/16487842.html:今天来聊一聊DHCP中继相关话题: DHCP的作用 DH ...
- 使用JAVA CompletableFuture实现流水线化的并行处理,深度实践总结
大家好,又见面啦. 在项目开发中,后端服务对外提供API接口一般都会关注响应时长.但是某些情况下,由于业务规划逻辑的原因,我们的接口可能会是一个聚合信息处理类的处理逻辑,比如我们从多个不同的地方获取数 ...
- mysql导出bug备注
注:yiicms库和area表均存在
- Vue ref属性 && props配置项
1 // # ref属性: 2 // # 1.用来给元素或者子组件注册引用信息(id的替代者) 3 // # 2.应用在html标签上获取的是真实的DOM元素,应用在组件标签上是组件实例对象(vc) ...
- Docker-Compose和Docker Network的应用
1 # Docker-Compose分为两部分 2 # 一.Docker-Compose.yml 3 # 二.Docker-Compose 命令 4 5 # 桌面板的Docker(Win.Mac)会默 ...
- JPA作持久层操作
JPA(Hibernate是jpa的实现) jpa是对实体类操作,从而通过封装好的接口直接设置数据库的表结构.虽然jpa可以直接通过编写java代码来操作数据库表结构,避免了sql的编写,但别忘了需要 ...
- Python 中MATLABspline函数的替代函数
调用scipy模块,其中有对应的函数UnivariateSpline.与MATLAB中spline函数不同的是,这个函数返回值是一个插值函数,而非插值结果. import scipy spline = ...
- WPF开发快速入门【7】WPF的拖放功能(Drag and Drop)
概述 本文描述WPF的拖放功能(Drag and Drop). 拖放功能涉及到两个功能,一个就是拖,一个是放.拖放可以发生在两个控件之间,也可以在一个控件自己内部拖放.假设界面上有两个控件,一个Tre ...
- 微信小程序/校园社区论坛/微信云开发/云函数
一.框架来源 1.非常非常感谢B站up主"梦千的曾哥哥"的开源框架. 没有他就没有这个小程序.如果有想做的同学,可以直接移步他的视频那里开始学习.我水平不够,就不教具体怎么配置环境 ...