一門能讓你五分鐘學會的語言-Brainfuck

2022-09-23 12:00:26

看到標題,不出意外的話,你肯定開始罵我了:**標題黨,什麼程式語言五分鐘就能學會?

其實我本來也是不相信的,但是學過了才知道這是真的。

1、Brainfuck

看到這個小標題,不要誤會,我沒有罵人。

這就是今天文章的主人公,也就是讓你們五分鐘能夠學會的一門程式語言——Brainfuck。

Brainfuck,簡稱BF,是一種極小化的程式語言,由Urban Müller在1993年創造。

目標是建立一種簡單的、可以用最小的編譯器來實現的、符合圖靈完備思想的程式語言。

PS:不得不佩服大佬命名方式,或許這就是大佬吧!!!

2、語法

學習程式語言,首先就要學習其語法。

Brainfuck 程式語言 由 8 個命令組成:

語法 含義
> 指標向右移動一格
< 指標向左移動一格
+ 使指標當前格的位元組數值加1
- 使指標當前格的位元組數值減1
. 把當前格數值按 ASCII 表輸出到終端
, 接受一個位元組的輸入,將其值儲存在資料指標的位元組中。
[ 當指標當前值為 0 時,程式跳轉至與之對應的 ] 之後;否則程式正常執行
] 程式跳轉回與之對應的 [ 處

自此,你學完了 Brainfuck 語言的所有語法,我想都用不了五分鐘吧。

3、Hello World

老規矩,新語言上手的第一步就是要能輸出 Hello World。

問題:這裡我們先練習如何在螢幕列印一個字母 ‘A’ ?

3.1 菜鳥版

分析:

因為 ASCII 表中 'A' 對應的值為 65。所以你可能很快就會有第一種程式設計方案:

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.

這裡 + 有65個,然後通過 . 將其輸出到終端,如下:

看上去解決了這個問題,但是這裡的 + 實在太多了,我們程式設計的時候很容易少寫或者多寫,那麼有沒有什麼方法能簡化呢?

3.2 進階版

ASCII 表中 'A' 對應的值為 65。為了少打幾個 +,我們很自然的想到乘法運算,65 = 13*5.

所以我們可以通過迴圈來改進上面的方法:

+++++
[
>+++++++++++++
<-
]
>.

這裡我解釋一下上面的語法:

①、第一行,有5個 +,表示當前格子數加到 5;

②、第二行,一個 [,表示進入一個迴圈;

③、第三行,表示指標向右移動一格,並且該格子數值為 13;

④、第四行,表示指標向左移動一格,並且該格子數值減 1(初始化值為5);

⑤、第五行,迴圈的結束語句,判斷指標所在格子是否為0,不為0,移動到第3行程式碼繼續執行,為零則退出迴圈。

⑥、第六行,指標向右移動一格,並且向終端輸出該格子的值。

下面通過動圖給大家演示一下:

3.3 輸出 Hello World!

++++++++++[>+++++++>++++++++++>+++>+<<<<-]
>++.>+.+++++++..+++.>++.<<+++++++++++++++.
>.+++.------.--------.>+.>.

4、總結

不知道大家學完這門語言之後有什麼感想。

首先我要說的是,這門語言並不是為了設計實際軟體而設計的,而是為了挑戰計算機程式設計的界限。

我們知道計算機界最高獎項叫圖靈獎,圖靈在1936年發表的 "On Computable Numbers, with an Application to the Entscheidungsproblem"(《論可計算數及其判定性問題的應用》)中提出的數學模型——圖靈機(Turing Machine),描述了它是什麼,並且證明了只要圖靈機可以被實現,就可以用來解決任何可計算問題,感興趣的大家可以去研究研究。

這門語言對於我們去理解圖靈思想也是很有幫助的。

比如,一門新的語言,我們要證明其是否是圖靈完備的,如果用數學證明的方式必然會比較複雜,但是如果你能用這門新語言實現一個 Brainfuck 的直譯器,那麼就必然證明其是圖靈完備的。

彩蛋

Brainfuck 語言圖形化演示:https://openprocessing.org/sketch/516467
程式設計師必讀電子書領取:https://mp.weixin.qq.com/s?__biz=MzUwOTQwNTUzNQ==&mid=2247488293&idx=1&sn=1515e62492388c321717dbdc7209990d&chksm=f913e315ce646a03a6daf8a1621f1d127a95fe9ea10a442fc1b0b9eb2dddc5531bac722f3656&token=1554842810&lang=zh_CN