(1)brainfuck语言
就象它的名字所暗示的,brainfuck程序很难读懂。尽管如此,brainfuck图灵机一样可以完成任何计算任务。是的,你没看错,虽然brainfuck的计算方式如此与众不同,但它确实能够正确运行。哈哈,是不是一听这个名字就很带感,这种语言由八种运算符构成,只有240个字节大小。
一个在屏幕上打印"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'
相关链接:
下面是这八种状态的描述,其中每个状态由一个字符标识:
字符 | 含义 |
---|---|
> |
指针加一 |
< |
指针减一 |
+ |
指针指向的字节的值加一 |
- |
指针指向的字节的值减一 |
. |
输出指针指向的单元内容(ASCII码) |
, |
输入内容到指针指向的单元(ASCII码) |
[ |
如果指针指向的单元值为零,向后跳转到对应的] 指令的次一指令处 |
] |
如果指针指向的单元值不为零,向前跳转到对应的[ 指令的次一指令处 |
Brainfuck | C |
---|---|
> |
++ptr; |
< |
--ptr; |
+ |
++*ptr; |
- |
--*ptr; |
. |
putchar(*ptr); |
, |
*ptr =getchar(); |
[ |
while (*ptr) { |
] |
} |
因为 BrainFuck 只有八种指令,并且没有关键字,也不允许自定义标识符,因此它的编译器实现起来非常简单,初学 C 语言不久的人都可以自己编出来,尽管在座的各位每人都可以自己编一个,不过为了引起大家的兴趣,我这里还是给出大家一个官方发布的版本。这个程序只有短短 50 多行,并且完全由 ANSI C 写成,因此你随便找个 C 语言编译器,把它编译一下。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
#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 ) {
//if(strchr("<>;+-,.[]\n",*c))printf("%c",*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--;
// chkabort();
}
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);
}
}
|
当然,如果你觉得用C语言来实现BrainFuck语言的解释器是对BrainFuck这种语言的一种侮辱的话,我们的BrainFuck社区是绝对不能容忍你有这种想法的。因为我们有一个使用100%纯brainfuck写成的一个编译器awib:http://code.google.com/p/awib/
(2)WhiteSpace语言
这是一种只用空白字符(空格,TAB和回车)编程的语言,而其它可见字符统统为注释。下面是它的一个示例:
这是一种只用空白字符(空格,TAB和回车)编程的语言,而其它可见字符统统为注释。下面是它的一个示例:
什么?你什么也没有看见,这就对了,因为这正是这门语言的独特之处。访问下面这个链接查看Hello,World示例。记得按Ctrl+A来查看程序。
官网:http://compsoc.dur.ac.uk/whitespace/index.php。
附上几个链接再:http://coolshell.cn/articles/1142.html
http://stackoverflow.com/questions/1995113/strangest-language-feature
http://www.aqee.net/strangest-language-feature/