練習寫 Brainfuck Interpreter

Brainfuck,我來晚了!
Brainfuck,我來晚了!
Brainfuck,我來晚了!

很重要,所以~我講了三次…

寫在前頭:


可以從這篇文章得到:

  • 一個簡單的 Brainfuck Interpreter。

無法得到:

  • Brainfuck 完整介紹及更進階的版本。

到底 Brainfuck 是什麼東西?


Wiki 提供了你所有需要的資訊。

簡單來說,它是一個簡單又難讀懂的 程式語言,可以跑在一個簡單的機器模型上,其模型必須具有指令指標、初始化為零的陣列(3000 位元組)、可移動的資料指標(指標初始指向陣列第一個位元組),以及輸入輸出等功能,故用 Brainfuck 確實可以完成一些小型的計算工作。

Brainfuck 簡單到只有八個基本指令: > < + - . , [ ] ,分別是大於、小於、加號、減號、句號、逗號、左括號、右括號。

沒錯,就這八個特殊符號而已,也正因為全是特殊符號,才搞得程式碼十分難看不易理解。

整理 Wiki 上面的東西,得到下面表格:

指令 含義 用 C 表示
> 資料指標往右移 ++ptr;
< 資料指標往左移 —ptr;
+ 資料指標指向的位元組值加一 ++*ptr;
- 資料指標指向的位元組值減一 —*ptr;
. 輸出資料指標指向的內容(ASCII碼) putchar(*ptr);
, 輸入內容到資料指標指向的單元(ASCII碼) *ptr=getchar();
[ 如果資料指標指向的內容為零時,指令指標向後移到對應 "]" 後面的指令 while (*ptr) {
] 如果資料指標指向的內容不為零時,指令指標向前移到對應 "[" 後面的指令 }

動手實作


哇!Wiki 上面的解釋,已經完成一大半了!看來用 C 編寫,滿直覺又簡易,索性就直接用 C 來寫一個吧!

最近,正在玩 Scheme,也試著改寫出一版,很可惜的地方是感覺從 C 硬轉的,完全沒有 FP 的味道!

結語


Brainfuck 是一個很有趣的程式語言,因為~指令少又簡單,故很適合當作練習實作 Interpreter 的題目,網路上有人擴充語法,還寫了編譯器,甚至寫了很多好玩 Brainfuck 程式碼,使這個類似玩具的程式語言更加豐富精采。

TODO: 接下來可以練習加入讀檔,或是什麼好玩的指令。