brainfuck,是一種極小化的計算機語言,它是由urban müller在1993年建立的。由于“綠王八”的原因,這種語言有時被稱為brainf**k或brainf***,甚至被簡稱為bf。這種 語言,是一種按照“turing complete(完整圖靈機)”思想設計的語言,它的主要設計思路是:用最小的概念實作一種“簡單”的語言,brainf**k 語言隻有八種符号,所有的操作都由這八種符号的組合來完成。
bf基于一個簡單的機器模型,除了八個指令,這個機器還包括:一個以位元組為機關、被初始化為零的數組、一個指向該數組的指針(初始時指向數組的第一個位元組)、以及用于輸入輸出的兩個位元組流。
下面是這八種指令的描述,其中每個指令由一個字元辨別:
字元
含義
<code>></code>
指針加一
<code><</code>
指針減一
<code>+</code>
指針指向的位元組的值加一
<code>-</code>
指針指向的位元組的值減一
<code>.</code>
輸出指針指向的單元内容(ascii碼)
<code>,</code>
輸入内容到指針指向的單元(ascii碼)
<code>[</code>
如果指針指向的單元值為零,向後跳轉到對應的<code>]</code>指令的次一指令處
<code>]</code>
如果指針指向的單元值不為零,向前跳轉到對應的<code>[</code>指令的次一指令處
(按照更節省時間的簡單說法,<code>]</code>也可以說成“向後跳轉到對應的<code>[</code>狀态”。這兩解釋是一樣的。)
(第三種同價的說法,<code>[</code>意思是"向前跳轉到對應的<code>]</code>“,<code>]</code>意思是”向後跳轉到對應的<code>[</code>指令的次一指令處,如果指針指向的位元組非零。")
brainfuck程式可以用下面的替換方法翻譯成c語言(假設<code>ptr</code>是<code>char*</code>類型):
brainfuck
c
<code>++ptr;</code>
<code>--ptr;</code>
<code>++*ptr;</code>
<code>--*ptr;</code>
<code>putchar(*ptr);</code>
<code>*ptr =getchar();</code>
<code>while (*ptr) {</code>
<code>}</code>
因為 brainfuck 隻有八種指令,并且沒有關鍵字,也不允許自定義辨別符,是以它的編譯器實作起來非常簡單,初學 c 語言不久的人都可以自己編出來,盡管在座的各位每人都可以自己編一個,不過為了引起大家的興趣,我這裡還是給出大家一個官方釋出的版本。這個程式隻有短短 50 多行,并且完全由 ansi c 寫成,是以你随便找個 c 語言編譯器,把它編譯一下。
<code>01.</code><code>#include <stdio.h>;</code>
<code>02.</code><code> </code>
<code>03.</code><code>int</code> <code>p, r, q;</code>
<code>04.</code><code>char</code> <code>a[5000], f[5000], b, o, *s=f;</code>
<code>05.</code><code> </code>
<code>06.</code><code>void</code> <code>interpret(</code><code>char</code> <code>*c)</code>
<code>07.</code><code>{</code>
<code>08.</code><code> </code><code>char</code> <code>*d;</code>
<code>09.</code><code> </code>
<code>10.</code><code> </code><code>r++;</code>
<code>11.</code><code> </code><code>while</code><code>( *c ) {</code>
<code>12.</code><code> </code><code>//if(strchr("<>;+-,.[]/n",*c))printf("%c",*c);</code>
<code>13.</code><code> </code><code>switch</code><code>(o=1,*c++) {</code>
<code>14.</code><code> </code><code>case</code> <code>'<'</code><code>: p--; </code><code>break</code><code>;</code>
<code>15.</code><code> </code><code>case</code> <code>'>;'</code><code>: p++; </code><code>break</code><code>;</code>
<code>16.</code><code> </code><code>case</code> <code>'+'</code><code>: a[p]++; </code><code>break</code><code>;</code>
<code>17.</code><code> </code><code>case</code> <code>'-'</code><code>: a[p]--; </code><code>break</code><code>;</code>
<code>18.</code><code> </code><code>case</code> <code>'.'</code><code>: </code><code>putchar</code><code>(a[p]); </code><code>fflush</code><code>(stdout); </code><code>break</code><code>;</code>
<code>19.</code><code> </code><code>case</code> <code>','</code><code>: a[p]=</code><code>getchar</code><code>();</code><code>fflush</code><code>(stdout); </code><code>break</code><code>;</code>
<code>20.</code><code> </code><code>case</code> <code>'['</code><code>:</code>
<code>21.</code><code> </code><code>for</code><code>( b=1,d=c; b && *c; c++ )</code>
<code>22.</code><code> </code><code>b+=*c==</code><code>'['</code><code>, b-=*c==</code><code>']'</code><code>;</code>
<code>23.</code><code> </code><code>if</code><code>(!b) {</code>
<code>24.</code><code> </code><code>c[-1]=0;</code>
<code>25.</code><code> </code><code>while</code><code>( a[p] )</code>
<code>26.</code><code> </code><code>interpret(d);</code>
<code>27.</code><code> </code><code>c[-1]=</code><code>']'</code><code>;</code>
<code>28.</code><code> </code><code>break</code><code>;</code>
<code>29.</code><code> </code><code>}</code>
<code>30.</code><code> </code><code>case</code> <code>']'</code><code>:</code>
<code>31.</code><code> </code><code>puts</code><code>(</code><code>"unbalanced brackets"</code><code>), </code><code>exit</code><code>(0);</code>
<code>32.</code><code> </code><code>case</code> <code>'#'</code><code>:</code>
<code>33.</code><code> </code><code>if</code><code>(q>;2)</code>
<code>34.</code><code> </code><code>printf</code><code>(</code><code>"%2d %2d %2d %2d %2d %2d %2d %2d %2d %2d/n%*s/n"</code><code>,</code>
<code>35.</code><code> </code><code>*a,a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],3*p+2,</code><code>"^"</code><code>);</code>
<code>36.</code><code> </code><code>break</code><code>;</code>
<code>37.</code><code> </code><code>default</code><code>: o=0;</code>
<code>38.</code><code> </code><code>}</code>
<code>39.</code><code> </code><code>if</code><code>( p<0 || p>;100)</code>
<code>40.</code><code> </code><code>puts</code><code>(</code><code>"range error"</code><code>), </code><code>exit</code><code>(0);</code>
<code>41.</code><code> </code><code>}</code>
<code>42.</code><code> </code><code>r--;</code>
<code>43.</code><code> </code><code>// chkabort();</code>
<code>44.</code><code>}</code>
<code>45.</code><code> </code>
<code>46.</code><code>main(</code><code>int</code> <code>argc,</code><code>char</code> <code>*argv[])</code>
<code>47.</code><code>{</code>
<code>48.</code><code> </code><code>file</code> <code>*z;</code>
<code>49.</code><code> </code>
<code>50.</code><code> </code><code>q=argc;</code>
<code>51.</code><code> </code>
<code>52.</code><code> </code><code>if</code><code>(z=</code><code>fopen</code><code>(argv[1],</code><code>"r"</code><code>)) {</code>
<code>53.</code><code> </code><code>while</code><code>( (b=</code><code>getc</code><code>(z))>;0 )</code>
<code>54.</code><code> </code><code>*s++=b;</code>
<code>55.</code><code> </code><code>*s=0;</code>
<code>56.</code><code> </code><code>interpret(f);</code>
<code>57.</code><code> </code><code>}</code>
<code>58.</code><code>}</code>
怎麼?看不懂嗎?下面是解釋:
相關連結:
如果你要覺得bf已經很bt了,那麼你就錯了,下面這些程式語言更bt。
whitespace語言
這是一種隻用空白字元(空格,tab和回車)程式設計的語言,而其它可見字元統統為注釋。下面是它的一個示例:
lolcode語言
lolcode是一種建立在高度縮寫的網絡英語之上的程式設計語言,一般來說如果一個人能了解這種網絡英語就能在未經訓練的情況下讀懂lolcode程式源代碼。下面是其hello,world例程:
中文程式設計語言
不要以為隻有老外才那麼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
中蟒語言(中文python)
下面的程式是不是很cool?
差不多了,該結束了,再次說明,這是一篇很嚴肅的文章。
(全文完)