这个世界从来都不会缺少另类的东西,人类自然世界如此,计算机世界也一样。编程语言方面,看过CoolShell站的《
6个变态的C语言Hello World程序》的朋友们一定对BT和另类不会陌生,但那都是些小儿科,真正的BT和另类要是从语言级上来完成。让我们来看看其中一个比较另类的语言BrainFuck。看到这个程序语言的名字,请不要以为这是一个搞笑的语言,这是一个“严肃事情”,请大家用“最虔诚的态度”来阅读本文。
BF语言介绍Brainfuck,是一种极小化的计算机语言,它是由Urban Müller在1993年创建的。由于“绿王八”的原因,这种语言有时被称为
brainf**k或
brainf***,甚至被简称为
BF。这种 语言,是一种按照“Turing complete(完整图灵机)”思想设计的语言,它的主要设计思路是:用最小的概念实现一种“简单”的语言,BrainF**k 语言只有八种符号,所有的操作都由这八种符号的组合来完成。
BF基于一个简单的机器模型,除了八个指令,这个机器还包括:一个以字节为单位、被初始化为零的数组、一个指向该数组的指针(初始时指向数组的第一个字节)、以及用于输入输出的两个字节流。
下面是这八种指令的描述,其中每个指令由一个字符标识:
BF解释器因为 BrainFuck 只有八种指令,并且没有关键字,也不允许自定义标识符,因此它的编译器实现起来非常简单,初学 C 语言不久的人都可以自己编出来,尽管在座的各位每人都可以自己编一个,不过为了引起大家的兴趣,我这里还是给出大家一个官方发布的版本。这个程序只有短短 50 多行,并且完全由 ANSI C 写成,因此你随便找个 C 语言编译器,把它编译一下。
01.#include <stdio.h>;
02.
03.
int p, r, q;
04.
char a[5000], f[5000], b, o, *s=f;
05.
06.
void interpret(
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("UNBALANCED BRACKETS"),
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("RANGE ERROR"),
exit(0);
41. }
42. r--;
43. // chkabort();
44.}
45.
46.main(
int argc,
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. *s=0;
56. interpret(f);
57. }
58.}
当然,如果你觉得用C语言来实现BrainFuck语言的解释器是对BrainFuck这种语言的一种侮辱的话,我们的BrainFuck社区是绝对不能容忍你有这种想法的。因为我们有一个使用100%纯brainfuck写成的一个BrainFuck编译器
awib:
http://code.google.com/p/awib/
Hello World++++++++++[>+++++++>++++++++++>+++>+<<<<-] >++.>+.+++++++..+++.>++.<<+++++++++++++++. >.+++.------.--------.>+.>.怎么?看不懂吗?下面是解释:
+++ +++ +++ + 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'
相关链接:
LOLCODE是一种建立在高度缩写的网络英语之上的编程语言,一般来说如果一个人能理解这种网络英语就能在未经训练的情况下读懂LOLCODE程序源代码。下面是其Hello,World例程:
HAI CAN HAS STDIO? VISIBLE "HAI WORLD!" KTHXBYE