编辑“︁
Brainfuck
”︁
跳转到导航
跳转到搜索
Template:Editnotice load/content
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
{{Refimprove|time=2022-09-27T06:59:08+00:00}} {{NoteTA |G1 = IT }} '''Brainfuck''',简称'''BF''',是一种极小化的[[程序语言]],由[[Urban Müller]]在1993年创造。[[Fuck]]在[[英語]]中是[[髒話]],所以这种语言有时称为'''Brainf*ck'''或'''Brainf***''',或者只用简称。 == 概述 == Müller的目标是创建一种简单的、可以用最小的[[编译器]]来实现的、符合[[图灵完全]]思想的编程语言。这个语言由八种[[运算符]]构成,为[[Amiga]]机器编写的编译器(第二版)只有240个[[字节]]大小。<ref>{{cite web |url=http://www.aminet.net/package.php?package=dev/lang/brainfuck-2.lha |archive-url=https://web.archive.org/web/20051106213924/http://www.aminet.net/package.php?package=dev%2Flang%2Fbrainfuck-2.lha |dead-url=yes |archive-date=2005-11-06 |title=dev/lang/brainfuck-2.lha |publisher=Aminet |date= |accessdate=2013-10-30 }}</ref> Brainfuck的名字已经暗示出来,它的[[计算机程序|程序]]代码很难读懂。尽管如此,Brainfuck仍然可以像[[图灵机]]一般完成任何计算任务。它虽然计算方式与众不同,但确实能够正确运行。 这种语言基于一个简单的机器模型。这个机器除了指令以外,还包括:一个以字节为单位、已初始化为零的[[数组]]、一个指向该数组的[[指针]](开始时指向数组的第一个字节)、以及用于输入输出的两个[[字节流]]。 下面是这八种状态的描述,其中每个状态由一个[[字符]]标识: {| class="wikitable" border="1" |- ! 字符 ! 含义 |- | align="center" | <code>></code> || 指针加一 |- | align="center" | <code><</code> || 指针减一 |- | align="center" | <code>+</code> || 指针所指字节的值加一 |- | align="center" | <code>-</code> || 指针所指字节的值减一 |- | align="center" | <code>.</code> || 输出指针所指字节内容([[ASCII码]]) |- | align="center" | <code>,</code> || 向指针所指的字节输入内容(ASCII码) |- | align="center" | <code>[</code> | 若指针所指字节的值为零,则向后跳转,跳转到其对应的<code>]</code>的下一个指令处 |- | align="center" | <code>]</code> | 若指针所指字节的值不为零,则向前跳转,跳转到其对应的<code>[</code>的下一个指令处 |} Brainfuck指令可以逐一替换,翻译成[[C语言]](假设<code>ptr</code>是<code>char *</code>[[資料類型|类型]])的语句之类: {| class="wikitable" border="1" |- ! Brainfuck ! C |- | align="center" | <code>></code> || <code>++ptr;</code> |- | align="center" | <code><</code> || <code>--ptr;</code> |- | align="center" | <code>+</code> | <code>++*ptr;</code> |- | align="center" | <code>-</code> | <code>--*ptr;</code> |- | align="center" | <code>.</code> | <code>putchar(*ptr);</code> |- | align="center" | <code>,</code> | <code>*ptr = getchar();</code> |- | align="center" | <code>[</code> | <code>while (*ptr) {</code> |- | align="center" | <code>]</code> | <code>}</code> |} == 例子 == === Hello World! === 在屏幕上打印[[Hello World!]]: <syntaxhighlight lang="bf"> ++++++++++[>+++++++>++++++++++>+++>+<<<<-] >++.>+.+++++++..+++.>++.<<+++++++++++++++. >.+++.------.--------.>+.>. </syntaxhighlight> === 目前位置归零 === <syntaxhighlight lang="bf"> [-] </syntaxhighlight> === 字符[[I/O]] === <syntaxhighlight lang="bf"> ,. </syntaxhighlight> 从键盘读取一个字符并输出到屏幕上。 === 简单的循环 === <syntaxhighlight lang="bf"> ,[.,] </syntaxhighlight> 这是一个[[程式迴圈|循环]],连续从键盘读取字符,回显到屏幕上。注意,这里假定0表示输入结束,但有些系统并非如此。如果是-1表示输入结束,代码就应是<syntaxhighlight lang="bf" inline>,+[-.,+]</syntaxhighlight>。如果是输入未改变表示输入结束,代码则是<syntaxhighlight lang="bf" inline>,[->+>-<<]>[-<+>]>[[-]<<.[->>+<<],[->+>-<<]>[-<+>]>]</syntaxhighlight>。 === 指针维护 === <syntaxhighlight lang="bf"> >,[.>,] </syntaxhighlight> 移动指针,保存所有的输入,供后面的程序使用。 === 加法 === <syntaxhighlight lang="bf"> [->+<] </syntaxhighlight> 把当前位置的值加到后面的单元中(会让左边的单元归零)。 === 条件指令 === <syntaxhighlight lang="bf"> ,----------[----------------------.,----------] </syntaxhighlight> 从键盘读来小写字符,转成大写。按回车键退出程序。 首先,通过<code>,</code>读入第一个字符并把它减10(10 在大多数情况下为换行符 LF 的值)。如果用户按的是回车键,循环命令(<code>[</code>)就会直接跳转到程序的结尾:因为这时第一个字节已经减到了零。如果输入的字符不是换行符(比如是一个小写字符),程序就进入循环。在这里再减去剩下的22,这样总共减掉32。这是ASCII码中小写字符和大写字符的差值。 下面输出到屏幕。然后接收下一个输入字符,并减去10。如果它是换行符,退出循环;否则,再回到循环的开始,减去22并输出……退出了循环,后面没有了其他指令,程序便随之终止。 === 加法器 add(summand, addend, *sum) === <syntaxhighlight lang="brainfuck"> >>[-]>[-]<<< // 清空 cell #2 和 #3 [->>+>+<<<] // cell #0 的值移到 cell #2 和 #3 > >>[-<<<+>>>]<< // cell #3 的值移到 cell #0 [->+>+<<] // cell #1 的值移到 cell #2 和 #3 >>[-<<+>>]<< // cell #3 的值移到 cell #1 < </syntaxhighlight> 将保存在 cell #0 和 #1 中的两个整数相加,结果保存在 cell #2。 以 cell #3 为临时变量,保证了原来的两个存储单元数值不变,方便以后使用。 代码运行前,指针指向 cell #0, 第一步,先将 cell #2 和 cell #3 清空,确保不会有多余的数据影响运算结果; 第二步,将 cell #0 的值同时转移到 cell #2 和 cell #3,再用 cell #3 来恢复 cell #0 的值; 第三步,将 cell #1 的值同时转移到 cell #2 和 cell #3,再用 cell #3 来恢复 cell #1 的值; 最后,指针归位(回到初始位置),方便后续运算。 === 乘法器 multiply(multiplicand, multiplier, *product) === <syntaxhighlight lang="brainfuck"> >>[-]>[-]>[-]<<<< // 清空 cell #2、 #3 和 #4 [-> // cell #0 的值减 1 [->+>+<<] // cell #1 的值加进 cell #2 和 #3 >> [-<<+>>] // cell #3 的值移回 cell #1 >+< // cell #4 的值加 1,这样外循环结束时 cell #4 的值和 cell #0 原来的值就相等 << <] >>>>[-<<<<+>>>>]<<<< // cell #4 的值移回 cell #0 </syntaxhighlight> 跟上面的“加法器”类似,这个“乘法器”将保存在 cell #0 和 cell #1 的两个整数相乘,结果保存在 cell #2。 同样使用了临时变量,保证了原来的两个存储单元数值不变,方便以后使用。 更多代码解析请参见 https://github.com/moky/BrainFuck {{Wayback|url=https://github.com/moky/BrainFuck |date=20180617135009 }} ==注释== *注意,这里[[数组]]的每个单元大小都是一个字节;<code>-</code>命令允许[[算術溢出|溢出]],1个<code>-</code>等于是255个<code>+</code>。同样,如果数组单元是有限、[[環形緩衝區|循环]]的,1个<code><</code>就等于是29999个<code>></code>。每个修改动作都可以分解为最多7条指令。但是,两个连在一起的修改动作将会破坏“图灵完全”,因为它们会使可能的内存状态从无限个变为有限个。更确切地说,从这个角度看,现代的计算机依然达不到完全意义上的“[[图灵完全]]” ==参考资料== {{Reflist}} ==外部链接== * [http://www.muppetlabs.com/~breadbox/bf/ Brian Raiter, Muppetlabs. '''Brainfuck:八条指令的图灵完全编程语言''']{{Wayback|url=http://www.muppetlabs.com/~breadbox/bf/ |date=20070930053059 }}。这个网站包括一个Brainfuck程序[[自產生程式|quine]]。 * [https://web.archive.org/web/20031206060451/http://esoteric.sange.fi/brainfuck/ Panu Kalliokoski. '''Brainfuck档案''']有许多Brainfuck实现、程序和quine。 * [https://web.archive.org/web/20030207172452/http://www.catseye.mb.ca/esoteric/bf/ Cat's Eye Technologies. '''Brainfuck'''] * [http://home.planet.nl/~faase009/Ha_bf_Turing.html Frans Faase. '''BF is Turing Complete''']{{Wayback|url=http://home.planet.nl/~faase009/Ha_bf_Turing.html |date=20040302032800 }} * [https://web.archive.org/web/20050303201936/http://home.arcor.de/partusch/html_en/bfd.html '''Brainfucked''' - Brainfuck Compiler] * [https://github.com/moky/BrainFuck BrainFuck Codes - moky]{{Wayback|url=https://github.com/moky/BrainFuck |date=20180617135009 }} * [https://esolangs.org/wiki/Brainfuck Brainfuck - Esolang]{{Wayback|url=https://esolangs.org/wiki/Brainfuck |date=20181023084337 }} {{-}} {{程序设计语言|Brainfuck}} [[Category:深奥的编程语言]] [[Category:1993年建立的程式語言]]
摘要:
请注意,所有对Local Chinese Wikipedia的贡献均可能会被其他贡献者编辑、修改或删除。如果您不希望您的文字作品被随意编辑,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源(详情请见
Project:著作权
)。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
导航菜单
个人工具
未登录
讨论
贡献
创建账号
登录
命名空间
页面
讨论
大陆简体
不转换
简体
繁體
大陆简体
香港繁體
澳門繁體
大马简体
新加坡简体
臺灣正體
查看
阅读
编辑
查看历史
更多
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
工具
链入页面
相关更改
特殊页面
页面信息