--- tags: 學習歷程 --- # Brainfuck --- ~~如果你的性癖比較特殊一點(?)~~,或是你又電又電,又或是你在哪裡得到了什麼神奇小知識,那我想你應該聽過Brainfuck --- ## Brainfuck是什麼 Brainfuck是一種極小化的程式語言,1993年由Urban Müller(一位瑞士工程師)創造 因為fuck是髒話,所以brainfuck會被稱為Brainf\*ck或Brainf\*\*\*或是簡寫BF --- ## Urban Müller的照片 右一為Urban Müller 你看他笑得多麼開心 ![](https://cdn.discordapp.com/attachments/720304918228893746/919609812512296960/1998-11-15_042.png =450x) --- ## 為什麼創造Brainfuck Müller的目標是建立一種簡單的、可以用最小的編譯器來實現的、符合圖靈完全思想的程式語言 這種語言由八種運算子構成,為Amiga機器編寫的編譯器(第二版),只有240個位元組大小 ---- ### 為什麼會叫Brainfuck? 因為他有夠難懂就像在fuck你的大腦 --- ## Brainfuck簡易介紹 接下來介紹一下來Brainfuck裡的八種運算子 ---- ### Brainfuck運算子 | 字元 | 含義 | | -------- | -------- | | > |指標加一 | |< | 指標減一 | | + | 指標指向的位元組的值加一 | | - | 指標指向的位元組的值減一 | | . |輸出指標指向的單元內容(ASCII碼) | | , | 輸入內容到指標指向的單元(ASCII碼) | | \[ | 如果指標指向的單元值為零,向後跳轉到對應的\]指令的次一指令處 | | \] | 如果指標指向的單元值不為零,向前跳轉到對應的\[指令的次一指令處 | ---- ### Brainfuck對應至C語言 | Brainfuck | C | | -------- | -------- | | > |++ptr; | |< | --ptr; | | + | ++\*ptr; | | - | --\*ptr; | | . |putchar(\*ptr); | | , | \*ptr = getchar(); | | \[ | while (\*ptr) \{ | | \] | \} | ---- ### 你各位應該都很熟悉的ASCII碼表 ![](https://upload.wikimedia.org/wikipedia/commons/1/1b/ASCII-Table-wide.svg) --- ## 使用Brainfuck ### 以下為你展示使用Brainfuck寫的Hello World ```bf= >++++++++[<+++++++++>-]<.>++++[<+++++++>-]<+.+++++++..+++.>>++++++[<+++++++>-]<+ +.------------.>++++++[<+++++++++>-]<+.<.+++.------.--------.>>>++++[<++++++++>- ]<+. ``` ---- 感受到大腦被fuck的感覺了嗎? 我們可以讓這code好看一點,排版一下,降低你的痛苦 ---- 這樣應該有比較好懂一點,每行各代表我們會輸出的字元 ```bf= >++++++++[<+++++++++>-]<. >++++[<+++++++>-]<+. +++++++.. +++. >>++++++[<+++++++>-]<++. ------------. >++++++[<+++++++++>-]<+. <. +++. ------. --------. >>>++++[<++++++++>-]<+. ``` --- 那就讓我們來學如何輸出H吧 ---- ```bf >++++++++[<+++++++++>-]<. ``` 首先右移一格,然後在那格加8次(+) 接下來便進入迴圈( [] ),左移一格回到第0格( < ),在那格加9( + ),再來向右移( > ),將第一格減1( - )。迴圈會執行到儲存格剩0為止,所以迴圈會執行8次,每次都會向第0格加9。 最後輸出( . ),前面執行完,第0格的值為72,對應至ACSII的H,所以輸出H。 ---- 成功輸出H了,那就換e吧 ---- ```bf >++++[<+++++++>-]<+. ``` 接下來應該就好懂多了,因為這就跟我們H時做的差不多,只是第0格的數字不一樣。我們會把28(4乘以7)加到第0格,迴圈結束時會再加1,此時第0格的值為101,對應至ASCII的e ---- ## 結束 接著如何執行後面的,就像上面說的,繼續下去就能輸出Hello World了 恭喜你學會如何Brainfuck了 おめでとう🎉 --- ## 資料來源: * ASCII碼表: https://en.m.wikipedia.org/wiki/File:ASCII-Table-wide.svg * 如何Brainfuck: https://zh.wikipedia.org/wiki/Brainfuck https://therenegadecoder.com/code/hello-world-in-brainfuck/ * Urban Müller: https://www.amigaforever.com/news-events/19981113-computer-98/ ---- ## 額外延伸: * 圖靈完全思想: https://zh.wikipedia.org/wiki/%E5%9C%96%E9%9D%88%E5%AE%8C%E5%82%99%E6%80%A7 * HackMD: https://hackmd.io/@whitebearOuO/Brainfuck