Brainfuck——BT的程序语言

        Brainfuck,是一种极小化的计算机语言,它是由Urban
Müller
在1993年创建的。由于fuck英语中是脏话,这种语言有时被称为brainf*ckbrainf***,甚至被简称为BF

这种语言由八种运算符构成,就象它的名字所暗示的,brainfuck程序很难读懂。虽然brainfuck的计算方式如此与众不同,但它确实能够正确运行。这种语言基于一个简单的机器模型,除了指令,这个机器还包括:一个以字节为单位、被初始化为零的数组、一个指向该数组的指针(初始时指向数组的第一个字节)、以及用于输入输出的两个字节流。

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

  字符 含义
> 指针加一
< 指针减一
+ 指针指向的字节的值加一
- 指针指向的字节的值减一
. 输出指针指向的单元内容(ASCII码)
, 输入内容到指针指向的单元(ASCII码)
[ 如果指针指向的单元值为零,向后跳转到对应的]指令的次一指令处
] 如果指针指向的单元值不为零,向前跳转到对应的[指令的次一指令处

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

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

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

Brainfuck C
> ++ptr;
< --ptr;
+ ++*ptr;
- --*ptr;
. putchar(*ptr);
, *ptr =getchar();
[ while (*ptr) {
] }

以下是一个官方给出的50行Brainfuck语言编译器的源码

Brainfuck.c

<span style="font-size:18px;">#include <stdio.h>;
int  p, r, q;
char a[5000], f[5000], b, o, *s=f;
void interpret(char *c)
{
        char *d;
        r++;
        while( *c ) {
                switch(o=1,*c++) {
                case '<': p--;        break;
                case '>': p++;        break;
                case '+': a[p]++;     break;
                case '-': a[p]--;     break;
                case '.': putchar(a[p]); fflush(stdout); break;
                case ',': a[p]=getchar();fflush(stdout); break;
                case '[':
                        for( b=1,d=c; b && *c; c++ )
                                b+=*c=='[', b-=*c==']';
                        if(!b) {
                                c[-1]=0;
                                while( a[p] )
                                        interpret(d);
                                c[-1]=']';
                                break;
                        }
                case ']':
                        puts("UNBALANCED BRACKETS"), exit(0);
                case '#':
                        if(q>2)
                                printf("%2d %2d %2d %2d %2d %2d %2d %2d %2d %2d/n%*s/n",
                                       *a,a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],3*p+2,"^");
                        break;
                default: o=0;
                }
                if( p<0 || p>100)
                        puts("RANGE ERROR"), exit(0);
        }
        r--;
}
void main(int argc,char *argv[])
{
        FILE *z;
        q=argc;
         if(z=fopen(argv[1],"r")) {
                while( (b=getc(z))>0 )
                        *s++=b;
                *s=0;
                interpret(f);
        }
}</span>

这份源码是基于标准C的,可以再任何平台上编译运行。执行文件后生成Brainfuck.exe

以下是可以被解释成Hello World!的文本文件,

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

将这个文件保存为1.txt文件,与Brainfuck的可执行文件放在同一目录下。在CMD中跳转到这个目录,执行:

Brainfuck 1.txt,即可看到执行结果

下面是解释:

+++ +++ +++ + initialize counter (cell #0) to 10

[ use loop to set the next four cells to 70/100/30/10

> +++ +++ + add 7 to cell #1

> +++ +++ +++ + add 10 to cell #2

> +++ add 3 to cell #3

> + add 1 to cell #4

<<< < - decrement counter (cell #0)

]

>++ . print ‘H‘

>+. print ‘e‘

+++ +++ +. print ‘l‘

. print ‘l‘

+++ . print ‘o‘

>++ . print ‘ ‘

<<+ +++ +++ +++ +++ ++. print ‘W‘

>. print ‘o‘

+++ . print ‘r‘

--- --- . print ‘l‘

--- --- --. print ‘d‘

>+. print ‘!‘

>. print ‘\n‘

Brainfuck——BT的程序语言

时间: 2024-10-29 03:12:33

Brainfuck——BT的程序语言的相关文章

了解的应用领域 程序语言的岗位

各种常见的编程语言最广泛应用的领域分别是 C 操作系统.嵌入式.自动化控制C++ 游戏.游戏服务器框架及游戏引擎.一些GUI框架.科研.编译器.图形学C# Windows Phone.Windows桌面应用..NET webJava Web.AndroidGo 服务器.据说设计的初衷是代替C++,具体如何还要观望Erlang 高并发服务器Python Web.科学计算.运维Ruby WebPerl 运维.文本处理Lisp 科研.Emacs. Haskell 商业应用蛮少的记得有个比较有名的做金融

6个变态的C语言Hello World程序 之 雷人的程序语言

以下的六个程序片段主要完毕这些事情: 输出Hello, World 混乱C语言的源码 以下的全部程序都能够在GCC下编译通过,仅仅有最后一个须要动用C++的编译器g++才干编程通过. hello1.c 1 2 3 4 5 6 7 8 9 10 11     #define _________ }     #define ________putchar     #define _______ main     #define _(a) ________(a);     #define ______

程序语言的奥妙:算法解读 &mdash;&mdash;读书笔记

算法(Algorithm) 是利用计算机解决问题的处理步骤. 算法是古老的智慧.如<孙子兵法>,是打胜仗的算法. 算法是古老智慧的结晶,是程序的范本. 学习算法才能编写出高质量的程序. 懂得了算法,游戏水平会更高. 比如下棋,如果懂得棋谱,就不需要每次考虑"寻找最好的一步棋",按照棋谱 就可以走出最好的几步棋.棋谱是先人们智慧的结果,因此掌握多种棋谱的人更 容易在对弈中获得胜利. 算法的学习类似学习游戏攻略. 算法是编写好程序的"棋谱". 算法必须满足&

关于《程序语言-平台优越性》一文补充说明

尊敬的各位读者,大家好 ! 关于24号发表的 <程序语言-平台优越性>一文有很多读者反馈,批评,对此,我对自己片面的程序认识表示歉意! 发表该文,意义不在与程序如何使用,而是各个语言平台在将来市场中对使用者造成的影响如何?哪个平台才能经久不衰,提供给用户最实用.最贴心的服务?鉴于此,我言语不当,意表不明,还望见谅! 在以后的日子里,我会继续研究和认知语言平台相互的优劣势,另外在言语表述方面也会注意恰当用此,做到言表易明,争取让每个人都能看得懂! 再次,我表述一下<程序语言-平台优越性&g

2014年最流行的10种程序语言

通过计算机行业记者Nick Diakopoulos的努力,IEEE Spectrum从10个信息源(包括 IEEE Xplore,Google和GitHub等等)获取数据,并通过12个指标加权和组合,来对当今最流行的程序语言进行排名(如下图所示). 排名前十位的依次分别是:Java,C,C++,C#,Python,Java script,Php,Ruby,Sql,Matlab. 如果你不赞成这种取权重的方式,想要看到更多的程序语言,或者在某个特殊领域哪种程序语言占主导地位,比如手机行业,也可以进

简单易懂的程序语言入门小册子(9):环境,引入环境

\newcommand{\mt}[1]{\text{#1}} \newcommand{\mE}{\mathcal{E}} \newcommand{\tup}[1]{\left<{#1}\right>} 环境类似于其他语言(C++.JAVA等)的"符号表". 所谓符号表,是一张将变量名与变量代表的内容联系起来的一张表. 不过这里我们抛弃符号表的观点,单纯地从算法角度上引入环境这一概念. 引入环境 通过修改解释器求值过程的算法,可以很自然的引入环境这个概念. 在前面基于文本替换

简单易懂的程序语言入门小册子(6):基于文本替换的解释器,引入continuation

当我写到这里的时候,我自己都吃了一惊. 环境.存储这些比较让人耳熟的还没讲到,continuation先出来了. 维基百科里对continuation的翻译是"延续性". 这翻译看着总有些违和感而且那个条目也令人不忍直视. 总之continuation似乎没有好的中文翻译,仿佛中国的计算机科学里没有continuation这个概念似的. Continuation这个概念相当于过程式语言里的函数调用栈. 它是用于保存"现在没空处理,待会再处理的事"的数据结构. 这样说

[MATH] - 数学语言和程序语言的对比

共同之处:都使用字符串或数值来引用一个客观实体.当然数字和字符串也可以作为实体对象,这取决于人的解释. 不同之处:数学语句每一行都给出了一个结论, 程序语句的每一行都定义了一个过程.注意这里所指的程序语句不局限于计算机编程语言,在进行数值逼近解微分方程的时候,表达式成为了程序语句. 数学语句的每一行都是一个结论,在给定范围内,每个符号只能引用同一个实体,换句换说,每个符号都是”给定“或”任意给定” 的!意味着这行语句可以成为所有后来出现的结论的前提条件.但是在程序语言中,一个符号可以引用不同的实

王垠:如何掌握程序语言(转)

王垠:如何掌握程序语言 学习程序语言是每个程序员的必经之路.可是这个世界上有太多的程序语言,每一种都号称具有最新的“特性”.所以程序员的苦恼就在于总是需要学习各种稀奇古怪的语言,而且必须紧跟“潮流”,否则就怕被时代所淘汰. 学习程序语言是每个程序员的必经之路.可是这个世界上有太多的程序语言,每一种都号称具有最新的“特性”.所以程序员的苦恼就在于总是需要学习各种稀奇古怪的语言,而且必须紧跟“潮流”,否则就怕被时代所淘汰. 作为一个程序语言的研究者,我深深的知道这种心理产生的根源.程序语言里面其实有