当前位置: 首页 > news >正文

五分钟学会一门编程语言?

大家好,我是可乐。

看到标题,不出意外的话,你肯定开始骂我了:**标题党,什么编程语言五分钟就能学会?

其实我本来也是不相信的,但是学过了才知道这是真的。

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

海量电子书获取:https://mp.weixin.qq.com/s?__biz=MzUwOTQwNTUzNQ==&mid=2247488293&idx=1&sn=1515e62492388c321717dbdc7209990d&chksm=f913e315ce646a03a6daf8a1621f1d127a95fe9ea10a442fc1b0b9eb2dddc5531bac722f3656#rd

相关文章:

  • 【Python数据分析 - 11】:DataFrame索引操作(pandas篇)
  • [Vue]数据代理
  • VSCODE 系列(二)常用插件
  • 【zabbix】解决zabbix在web页面显示中文乱码问题
  • ESP32/ESP8266自动下载电路波形,ESP32/ESP8266不能UART流控自动下载的解决方法
  • c语言分层理解(枚举和联合体)
  • 网站死链抓取sitemap递交工具
  • 大意了,一次多线程操作不当导致的线上事故...
  • [Spring boot] Spring boot 实现Excel批量导入数据并将文件保存到本地
  • linux下安装javaJDK和hadoop
  • Java数据结构——代码实现双向链表的方法
  • 蓝牙耳机哪款延迟低?延迟最低的真无线蓝牙耳机推荐
  • 使用OpenCV快速解决迷宫问题
  • springcloud-Ribbon详解(含java代码)
  • AI自主图像生成 之 stable-diffusion—运行效果展示
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • JavaScript HTML DOM
  • Vue.js源码(2):初探List Rendering
  • vue--为什么data属性必须是一个函数
  • 百度地图API标注+时间轴组件
  • 当SetTimeout遇到了字符串
  • 前端js -- this指向总结。
  • 如何在 Tornado 中实现 Middleware
  • 网页视频流m3u8/ts视频下载
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • #1014 : Trie树
  • #每日一题合集#牛客JZ23-JZ33
  • $.ajax()参数及用法
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (八十八)VFL语言初步 - 实现布局
  • (备忘)Java Map 遍历
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (四)Linux Shell编程——输入输出重定向
  • (一)appium-desktop定位元素原理
  • (一)kafka实战——kafka源码编译启动
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • (转)visual stdio 书签功能介绍
  • (转)母版页和相对路径
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • (转)人的集合论——移山之道
  • (转)使用VMware vSphere标准交换机设置网络连接
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .NET Core中的去虚
  • .NET 动态调用WebService + WSE + UsernameToken
  • .Net中的集合
  • .php文件都打不开,打不开php文件怎么办
  • ::什么意思
  • @DateTimeFormat 和 @JsonFormat 注解详解