阿八博客
  • 100000+

    文章

  • 23

    评论

  • 20

    友链

  • 最近新加了很多技术文章,大家多来逛逛吧~~~~
  • 喜欢这个网站的朋友可以加一下QQ群,我们一起交流技术。

brainfuck 语言入门

欢迎来到阿八个人博客网站。本 阿八个人博客 网站提供最新的站长新闻,各种互联网资讯。 喜欢本站的朋友可以收藏本站,或者加QQ:我们大家一起来交流技术! URL链接:https://www.abboke.com/rz/2019/1010/116868.html

    不介绍brainfuck这个语言了,没听说过的相信你也不会找到这篇文章,或者你去google. 图灵机相信大家都听说过(我们导论课讲过),有些人还写过相关的程序。我觉得brainfuck和图灵机的编程类似,下面转一篇别人写的比较易懂的教程给你们这些好奇的同学学习。


将八个操作符 < > + - [ ] . , 分别转写为:

> 右< 左+ 上- 下[ 始] 终. 写, 读然后找一张方格纸,对就是小学作文本那种,一支铅笔(不,钢笔不行,Lamy 的也不行),一块橡皮,一张从你的旧 C 语言书上撕下来的 ASCII 码表。 

现在来看 +++[>+<-] 这行程序。按照我们的转写,它变成:上上上始右上左下终。 

接下来在你的方格纸上的第一个格子里写下 0 。 

[0] 

很好。现在我们一边读转写好的程序,一边按照以下规则行事:遇到什么都没写的格子就当里面写了 0右:向右移动一个格子。嗯你盯着它看就行了,什么都不用做 
左:向左移动一个格子 
上:给格子里的数字加上 1,擦掉原来的数字再写回去。现在你知道为什么要用铅笔了吧,少年! 
下:给格子里的数字减去 1 
始:开始重复「始……终」之间的指令,直到你读到「始」之前盯着的那个格子里的数字变成 0 为止。(什么?那个格子里已经是负数了?……不要这么没有下限好不好) 
终:如果当前格子里的数字为 0,就跳过,否则回头到「始」那里 
写:查当前格子里的数字在 ASCII 表上对应的字母,把它写下来(不,别写在格子里,就写在你买来一直立志想用但是没有用的日记本上吧) 
读:随便想一个英文字母,查表找到它对应的数字,写到当前格子里 
我们开始吧。方括号代表当前你盯着看的格子。首先是上,上,上: 
[3] 
接下来,始: 
[3] 
嗯,你要重复做它到「终」之间的事情。首先是「右」: 

   3[0] 
上: 
   3[1] 
左: 
[3]1 
下: 
[2]1 
终: 
碰到「始」之前你盯着的那个格子,你还记得吗?碰巧就是当前这个。目前里面是 2 ,不是 0,所以我们回去「始」。 
右: 
   2[1] 
上: 
   2[2] 
左: 
[2]2 
下: 
[1]2 
终: 
回去「始」 
右: 
   1[2] 
上: 
   1[3] 
左: 
[1]3 
下: 
[0]3 
终: 
格子里是 0 了,你可以跳过「终」读下去了。 这段程序就此完结,但如果你读懂了这些,其实就已经看懂了我那个程序最开始的部分: 

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

无非就是,先把最左边的格子加到 10,然后向右移动,移动到第二个格子里加 3,第三个加 4,第四个加 7,第五个加 10,第六个加 11,然后向左移动五次,回到第一格,减 1。如此重复十次之后,最左边的格子变成 0,循环终止,而我有了如下格子: 

[0] 30 40 70 100 110 

接下来的部分,就是挪到某个格子,加上或者减去若干次 1,直到获得想要字母的 ASCII 代码,然后用 . 把它打印出来。比如紧接着的 >>>++. 就是右移三次,到写了 70 的格子上,加两次 1,得到 ASCII 72 ,大写字母 H,再用 . 把它显示出来。 

很简单吧?学会了?恭喜你…… 

It is practically impossible to teach functional programming to students that have had a prior exposure to brainfuck: as potential programmers they are mentally mutilated beyond hope of regeneration. 
–– Edsger W. Dijkstra (paraphrased)

- 


嘿嘿。

相关文章