源代碼下載: brainfuck-cn.bf
Brainfuck 是一個極小的只有8個指令的圖靈完全的編程語言。
除"><+-.,[]"之外的的任何字符都會被忽略 (不包含雙引號)。
Brainfuck 包含一個有30,000個單元為0的數組,和
一個數據指針指向當前的單元。
8個指令如下:
+ : 指針指向的單元的值加1
- : 指針指向的單元的值減1
> : 將指針移動到下一個單元(右邊的元素)
< : 將指針移動到上一個單元(左邊的元素)
. : 打印當前單元的內容的ASCII值 (比如 65 = 'A').
, : 讀取一個字符到當前的單元
[ : 如果當前單元的值是0,則向後調轉到對應的]處
] : 如果當前單元的值不是0,則向前跳轉到對應的[處
[ 和 ] 組成了一個while循環。很明顯,它們必須配對。
讓我們看一些基本的brainfuck 程序。
++++++ [ > ++++++++++ < - ] > +++++ .
這個程序打印字母'A'。首先,它把 #1 增加到6,使用它來作為循環條件,
然後,進入循環,將指針移動到 #2 ,將 #2 的值增加到10,然後
移動回 #1,將單元 #1 的值減1,然後繼續。循環共進行了6次。
這時,我們在 #1,它的值為0,#2 的值為60,我們移動到
#2,將 #2 的內容加上5,然後將 #2 的內容打印出來,65在
ASCII中表示'A', 所以'A'就會被打印出來。
, [ > + < - ] > .
這個程序從用户的輸入中讀取一個字符,然後把它複製到 #1。
然後我們開始一個循環,移動到 #2,將 #2 的值加1,再移動回 #1,將 #1
的值減1,直到 #1的值為0,這樣 #2 裏就保存了 #1 的舊值,循環結束時我們
在 #1,這時我們移動到 #2,然後把字符以ASCII打印出來。
而且要記住的一點就是,空格在這裏只是為了可讀性,你可以將他們寫成這樣:
,[>+<-]>.
試着思考一下這段程序是幹什麼的:
,>,< [ > [ >+ >+ << -] >> [- << + >>] <<< -] >>
這段程序從輸入接收2個參數,然後將他們相乘。
先讀取2個輸入,然後開始外層循環,以 #1 作為終止條件,然後將指針移動到
#2,然後開始 #2 的內層循環,將 #3 加1。但是這裏有一個小問題,在內層
循環結束的時候,#2 的值是0了,那麼下次執行外層循環的時候,就有問題了。
為了解決這個問題,我們可以增加 #4 的值,然後把 #4 的值複製到 #2,
最後結果就保存在 #3 中了。
好了這就是brainfuck了。也沒那麼難,是吧?為了好玩,你可以寫你自己的 brainfuck程序,或者用其他語言寫一個brainfuck的解釋器,解釋器非常容易 實現,但是如果你是一個自虐狂的話,你可以嘗試用brainfuck寫一個brainfuk的 解釋器。
有建議?或者發現什麼錯誤?在Github上開一個issue,或者發起pull request!
原著Prajit Ramachandran,並由0個好心人修改。
Translated by: lyuehh
© 2022 Prajit Ramachandran, Mathias Bynens
本作品採用 CC BY-SA 3.0 協議進行許可。