練習寫 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: 接下來可以練習加入讀檔,或是什麼好玩的指令。