BT雷人的程序语言
2016-07-29 00:00
363 查看
原文:http://cocre.com/?p=1142酷壳
这个世界从来都不会缺少另类的东西,人类自然世界如此,计算机世界也一样。编程语言方面,看过本站《6个变态的C语言HelloWorld程序》的朋友们一定对BT和另类不会陌生,但那都是些小儿科,真正的BT和另类要是从语言级上来完成。让我们来看看其中一个比较另类的语言BrainFuck。看到这个程序语言的名字,请不要以为这是一个搞笑的语言,这是一个“严肃事情”,请大家用“最虔诚的态度”来阅读本文。
BF基于一个简单的机器模型,除了八个指令,这个机器还包括:一个以字节为单位、被初始化为零的数组、一个指向该数组的指针(初始时指向数组的第一个字节)、以及用于输入输出的两个字节流。
下面是这八种指令的描述,其中每个指令由一个字符标识:
(按照更节省时间的简单说法,]也可以说成“向后跳转到对应的[状态”。这两解释是一样的。)
(第三种同价的说法,[意思是"向前跳转到对应的]“,]意思是”向后跳转到对应的[指令的次一指令处,如果指针指向的字节非零。")
Brainfuck程序可以用下面的替换方法翻译成C语言(假设ptr是char*类型):
01.
#include<stdio.h>;
02.
03.
intp,r,q;
04.
chara[5000],f[5000],b,o,*s=f;
05.
06.
voidinterpret(char*c)
07.
{
08.
char*d;
09.
10.
r++;
11.
while(*c){
12.
//if(strchr("<>;+-,.[]/n",*c))printf("%c",*c);
13.
switch(o=1,*c++){
14.
case'<':p--;break;
15.
case'>;':p++;break;
16.
case'+':a[p]++;break;
17.
case'-':a[p]--;break;
18.
case'.':putchar(a[p]);fflush(stdout);break;
19.
case',':a[p]=getchar();fflush(stdout);break;
20.
case'[':
21.
for(b=1,d=c;b&&*c;c++)
22.
b+=*c=='[',b-=*c==']';
23.
if(!b){
24.
c[-1]=0;
25.
while(a[p])
26.
interpret(d);
27.
c[-1]=']';
28.
break;
29.
}
30.
case']':
31.
puts("UNBALANCEDBRACKETS"),exit(0);
32.
case'#':
33.
if(q>;2)
34.
printf("%2d%2d%2d%2d%2d%2d%2d%2d%2d%2d/n%*s/n",
35.
*a,a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],3*p+2,"^");
36.
break;
37.
default:o=0;
38.
}
39.
if(p<0||p>;100)
40.
puts("RANGEERROR"),exit(0);
41.
}
42.
r--;
43.
//chkabort();
44.
}
45.
46.
main(intargc,char*argv[])
47.
{
48.
FILE*z;
49.
50.
q=argc;
51.
52.
if(z=fopen(argv[1],"r")){
53.
while((b=getc(z))>;0)
54.
*s++=b;
55.
这个世界从来都不会缺少另类的东西,人类自然世界如此,计算机世界也一样。编程语言方面,看过本站《
BF语言介绍
Brainfuck,是一种极小化的计算机语言,它是由UrbanMüller在1993年创建的。由于“绿王八”的原因,这种语言有时被称为brainf**k或brainf***,甚至被简称为BF。这种语言,是一种按照“Turingcomplete(完整图灵机)”思想设计的语言,它的主要设计思路是:用最小的概念实现一种“简单”的语言,BrainF**k语言只有八种符号,所有的操作都由这八种符号的组合来完成。BF基于一个简单的机器模型,除了八个指令,这个机器还包括:一个以字节为单位、被初始化为零的数组、一个指向该数组的指针(初始时指向数组的第一个字节)、以及用于输入输出的两个字节流。
下面是这八种指令的描述,其中每个指令由一个字符标识:
字符 | 含义 |
---|---|
指针加一 | |
指针减一 | |
指针指向的字节的值加一 | |
指针指向的字节的值减一 | |
输出指针指向的单元内容(ASCII码) | |
输入内容到指针指向的单元(ASCII码) | |
如果指针指向的单元值为零,向后跳转到对应的 | |
如果指针指向的单元值不为零,向前跳转到对应的 |
(第三种同价的说法,
Brainfuck程序可以用下面的替换方法翻译成C语言(假设
Brainfuck | C |
---|---|