轉自:http://coolshell.cn/articles/1142.html
這個世界從來都不會缺少另類的東西,人類自然世界如此,電腦世界也一樣。程式設計語言方面,看過本站《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 語言編譯器,把它編譯一下。
| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
#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/
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常式:
HAICAN 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/
差不多了,該結束了,再次說明,這是一篇很嚴肅的文章。