最小的图灵完备语言——BrainFuck

发布于 2020-01-07  21 次阅读


最小的图灵完备语言——BrainFuck

图灵完备性(Turing completness)


在可计算性理论(computability theory)中,图灵等价指的是:对于两个计算机A和B,如果A可以模拟B,B可以模拟A,就称他们是图灵等价的。

根据“丘奇-图灵”理论,图灵机是表达能力最强大的计算系统,对现实世界中的任何计算机,都可以用图灵机1来模拟它。腻不腻害!

如果某个系统能够模拟图灵机,那么就称该系统是图灵完备的。

可不是,都能完全模拟图灵机了可不是就完备了。

图灵完备语言

套用上面的定义,如果一个编程语言可以完全模拟图灵机,那么它就是图灵完备的。

图灵机的定义是很简单的,仅有少量操作和一种数据类型。所以很容易验证某一个语言是图灵完备的。写个模拟器呗。

大部分编程语言都是图灵完备的,因为他们需要解决各种问题的通用能力,而这正是图灵机所具备的。确实存在一些语言不是图灵完备的,他们通常是被设计用来解决某些特殊的问题,比如,你猜对了,SQL2以及正则表达式。

以经验来看,凡带有分支,跳转能力,并且支持数组状数据结构的语言基本上就是图灵完备的。

BrainFuck

下面是由BrainFuck写的一段小程序quine:

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

BrainFuck是由Urban Müller在1993年创建的,最小的具有图灵完备性的语言。一共由8种运算符组成,其编译器长度只有两百多个字节。(显然比这篇文章的长度要短)

就象它的名字所暗示的,brainfuck程序很难读懂。尽管如此,brainfuck图灵机一样可以完成任何计算任务。虽然brainfuck的计算方式如此与众不同,但它确实能够正确运行。

-- 维基百科

好了我要开始复制粘贴了!(以下内容均来自维基百科)

这种语言基于一个简单的机器模型,除了指令,这个机器还包括:一个以字节为单位、被初始化为零的数组、一个指向该数组的指针(初始时指向数组的第一个字节)、以及用于输入输出的两个字节流。

下面是这八种状态的描述,其中每个状态由一个字符标识:

按照更节省时间的简单说法,]也可以说成“向前跳转到对应的[状态”。这两解释是一样的。

第三种同价的说法,[意思是"向后跳转到对应的]",]意思是"向前跳转到对应的[指令的次一指令处,如果指针指向的字节非零。"

Brainfuck程序可以用下面的替换方法翻译成C语言(假设ptr是char*类型):

嗯,来个简单点的.一个在屏幕上打印"Hello World!"的程序:

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

更多

维基百科上有一个“深奥的编程语言”分类,如果吃饱了没事做可以去看看:跳转连接

参考资料

via 最小的图灵完备语言——BrainFuck


造故事的手艺工人,见习现代魔法师。