分类:
2009-08-20 21:07:56
这个世界从来都不会缺少另类的东西,人类自然世界如此,计算机世界也一样。编程语言方面,看过本站《》 的朋友们一定对BT和另类不会陌生,但那都是些小儿科,真正的BT和另类要是从语言级上来完成。让我们来看看其中一个比较另类的语言BrainFuck。 看到这个程序语言的名字,请不要以为这是一个搞笑的语言,这是一个“严肃事情”,请大家用“最虔诚的态度”来阅读本文。
字符 | 含义 |
---|---|
> |
指针加一 |
< |
指针减一 |
+ |
指针指向的字节的值加一 |
- |
指针指向的字节的值减一 |
. |
输出指针指向的单元内容(ASCII码) |
, |
输入内容到指针指向的单元(ASCII码) |
[ |
如果指针指向的单元值为零,向后跳转到对应的] 指令的次一指令处 |
] |
如果指针指向的单元值不为零,向前跳转到对应的[ 指令的次一指令处 |
]
也可以说成“向后跳转到对应的[
状态”。这两解释是一样的。)[
意思是"向前跳转到对应的]
“,]
意思是”向后跳转到对应的[
指令的次一指令处,如果指针指向的字节非零。")ptr
是char*
类型):Brainfuck | C |
---|---|
> |
++ptr; |
< |
--ptr; |
+ |
++*ptr; |
- |
--*ptr; |
. |
putchar(*ptr); |
, |
*ptr =getchar(); |
[ |
while (*ptr) { |
] |
} |
因为 BrainFuck 只有八种指令,并且没有关键字,也不允许自定义标识符,因此它的编译器实现起来非常简单,初学 C 语言不久的人都可以自己编出来,尽管在座的各位每人都可以自己编一个,不过为了引起大家的兴趣,我这里还是给出大家一个官方发布的版本。这个程序只有短短 50 多行,并且完全由 ANSI C 写成,因此你随便找个 C 语言编译器,把它编译一下。
01.
#include ;
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.
}
++++++++++[>+++++++>++++++++++>+++>+<<<<-]
>++.>+.+++++++..+++.>++.<<+++++++++++++++.
>.+++.------.--------.>+.>.
+++ +++ +++ + 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'
HAI
CAN HAS STDIO?
VISIBLE "HAI WORLD!"
KTHXBYE
中文指令 | 对应于的Applesoft BASIC | |
10 卜=0 | 10 Y=0 | |
20 入 水, 火 | 20 INPUT E, F | |
30 從 日 = 水 到 火 | 30 FOR A = E TO F | |
40 卜 = 卜+對數(日) | 40 Y = Y + LOG (A) | |
50 下一 日 | 50 NEXT A | |
60 印 卜 | 60 PRINT Y |
#!/usr/local/bin/cpython
回答 = 读入('你认为中文程式语言有存在价值吗 ? (有/没有)')
如 回答 == '有':
写 '好吧, 让我们一起努力!'
不然 回答 == '没有':
写 '好吧,中文并没有作为程式语言的价值.'
否则:
写 '请认真考虑后再回答.'