這個世界從來都不會缺少另類的東西,人類自然世界如此,計算機世界也一樣。編程語言方面,看過本站《6個變態的C語言Hello World程序》的朋友們一定對BT和另類不會陌生,但那都是些小兒科,真正的BT和另類要是從語言級上來完成。讓我們來看看其中一個比較另類的語言BrainFuck。看到這個程序語言的名字,請不要以爲這是一個搞笑的語言,這是一個“嚴肅事情”,請大家用“最虔誠的態度”來閱讀本文。
BF語言介紹
Brainfuck,是一種極小化的計算機語言,它是由Urban Müller在1993年創建的。由於“綠王八”的原因,這種語言有時被稱爲brainf**k或brainf***,甚至被簡稱爲BF。這種 語言,是一種按照“Turing complete(完整圖靈機)”思想設計的語言,它的主要設計思路是:用最小的概念實現一種“簡單”的語言,BrainF**k 語言只有八種符號,所有的操作都由這八種符號的組合來完成。
BF基於一個簡單的機器模型,除了八個指令,這個機器還包括:一個以字節爲單位、被初始化爲零的數組、一個指向該數組的指針(初始時指向數組的第一個字節)、以及用於輸入輸出的兩個字節流。
下面是這八種指令的描述,其中每個指令由一個字符標識:
字符 含義
> 指針加一
< 指針減一
+ 指針指向的字節的值加一
- 指針指向的字節的值減一
. 輸出指針指向的單元內容(ASCII碼)
, 輸入內容到指針指向的單元(ASCII碼)
[ 如果指針指向的單元值爲零,向後跳轉到對應的]指令的次一指令處
] 如果指針指向的單元值不爲零,向前跳轉到對應的[指令的次一指令處
(按照更節省時間的簡單說法,]也可以說成“向後跳轉到對應的[狀態”。這兩解釋是一樣的。)
(第三種同價的說法,[意思是"向前跳轉到對應的]“,]意思是”向後跳轉到對應的[指令的次一指令處,如果指針指向的字節非零。")
Brainfuck程序可以用下面的替換方法翻譯成C語言(假設ptr是char*類型):
Brainfuck C
> ++ptr;
< --ptr;
+ ++*ptr;
- --*ptr;
. putchar(*ptr);
, *ptr =getchar();
[ while (*ptr) {
] }
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'相關鏈接:
BF的官網:http://www.muppetlabs.com/~breadbox/bf/。
BF的Wikipedia:http://en.wikipedia.org/wiki/Brainfuck。
其它另類語言
如果你要覺得BF已經很BT了,那麼你就錯了,下面這些程序語言更BT。
WhiteSpace語言
這是一種只用空白字符(空格,TAB和回車)編程的語言,而其它可見字符統統爲註釋。下面是它的一個示例:
什麼?你什麼也沒有看見,這就對了,因爲這正是這門語言的獨特之處。訪問下面這個鏈接查看Hello,World示例。記得按Ctrl+A來查看程序。
官網:http://compsoc.dur.ac.uk/whitespace/index.php。
LOLCODE語言
LOLCODE是一種建立在高度縮寫的網絡英語之上的編程語言,一般來說如果一個人能理解這種網絡英語就能在未經訓練的情況下讀懂LOLCODE程序源代碼。下面是其Hello,World例程:
HAI
CAN HAS STDIO?
VISIBLE "HAI WORLD!"
KTHXBYE官網:http://lolcode.com/
中文編程語言
不要以爲只有老外才那麼BT,咱們中國也有自己的BT編程語言。
中文Basic
中文指令 對應於的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
官網無法訪問了,只能看看Wikipedia了:http://en.wikipedia.org/wiki/Chinese_BASIC
中蟒語言(中文Python)
下面的程序是不是很Cool?
#!/usr/local/bin/cpython
回答 = 讀入('你認爲中文程式語言有存在價值嗎 ? (有/沒有)')
如 回答 == '有':
寫 '好吧, 讓我們一起努力!'
不然 回答 == '沒有':
寫 '好吧,中文並沒有作爲程式語言的價值.'
否則:
寫 '請認真考慮後再回答.'官網:http://www.chinesepython.org/
差不多了,該結束了,再次說明,這是一篇很嚴肅的文章。
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/haoel/archive/2009/07/13/4343566.aspx