一门能让你五分钟学会的语言-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 ...
随机推荐
- SpringMVC指定配置文件位置和名称,控制Servlet的加载时间
1. 2.
- 【跟着大佬学JavaScript】之节流
前言 js的典型的场景 监听页面的scroll事件 拖拽事件 监听鼠标的 mousemove 事件 ... 这些事件会频繁触发会影响性能,如果使用节流,降低频次,保留了用户体验,又提升了执行速度,节省 ...
- buu第二页
33.被劫持的神秘礼物 打开后直接搜索HTTP,发现了以POST方式提交的数据,追踪HTTP流,根据题目提示,把name和word拼在一起 再根据题目提示,用MD5解密 这样就得到了flag 34.刷 ...
- react配置postcss-pxtorem适配
适配移动端操作如下: 安装 postcss-pxtorem .amfe-flexible npm i postcss-pxtorem npm i amfe-flexible amfe-flexible ...
- STM32与物联网01-ESP8266基本操作
ESP8266物联网简介 ESP8266简介 ESP8266 是上海乐鑫公司开发的一款具有 WiFi 功能的控制芯片,它带有完整的 TCP/IP 协议栈,因此可以用作物联网开发. ESP8266 本身 ...
- MIT 6.824 Llab2B Raft之日志复制
书接上文Raft Part A | MIT 6.824 Lab2A Leader Election. 实验准备 实验代码:git://g.csail.mit.edu/6.824-golabs-2021 ...
- APISpace 让你快速获取安徒生童话故事
<安徒生童话>是丹麦作家安徒生创作的童话集,共由166篇故事组成.该作爱憎分明,热情歌颂劳动人民.赞美他们的善良和纯洁的优秀品德:无情地揭露和批判王公贵族们的愚蠢.无能.贪婪和残暴. 接口 ...
- 图像处理——相位恢复(GS,TIE,改进型角谱迭代法)
利用GS,TIE,改进型角谱迭代算法进行相位恢复 角谱传播理论 角谱传播理论可以翻阅傅里叶光学的书,就能找到定量分析的计算公式,可以分析某个平面的角谱垂直传播到另外一个平面的角谱,得到其振幅与相位信息 ...
- 透过Redis源码探究Hash表的实现
转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com/archives/667 本文使用的Redis 5.0源码 概述 我们在学习 Redis ...
- Stream流中的常用方法foeEach和Stream流中的常用方法filter
延迟方法:返回值类型仍然是Stream接口自身类型的方法,因此支持链式调用.(除了中介方法外,其余方法均为延迟方法) 终结方法:返回值类型不再是Stream接口自身类型的方法,因此不再支持类似Stri ...