今天早上我寫了一個 Brainf**k 到 C 轉譯器。我總共花了大約一個小時。
整個內容不到 50 行 C 程式碼。你可以在這裡看到它。
這是一種深奧的編碼語言。由瑞士學生於 1993 年發明,它幾乎是被認為是圖靈完整的最低要求。
它也是現存最著名的埃索蘭語之一。
語法極為簡單:只有 8 個字符,其餘的將被忽略。
>++++++++[<+++++++++>-]<.>++++[<+++++++>-]<+.+++++++..+++.>>++++++[<+++++++>-]< ++.------------.>++++++[<+++++++++>-]<+.<.+++.------.--------.>>>++++[<++++++++ >-]<+.
猜猜它的作用是什麼。猜猜看。
這是一個你好,世界!節目。
本質上,在 Brainf**k 中,你會得到一個 30000 位元組的陣列和一個遊標。您可以使用 > 移動遊標和<。您可以使用 和 - 修改內存,這將增加或減少單元格中的值。您可以使用 [ 和 ] 建立循環。最後,您可以使用 讀取單一位元組作為輸入,並使用 ..
列印目前儲存格的值
> ; Increments cursor position < ; Decrements cursor position + ; Increments cell value - ; Decrements cell value . ; Prints the current cell value as an ASCII character , ; Reads a singly byte and stores it in the current cell [ ; Opens a loop that continues until the cell value is 0 ] ; Closes a loop
這幾乎就是 Brainf**k 的一切。
我之前在 Assembly 中編寫過更多函數式程式。
我寫這個編譯器完全是因為我很無聊,而且我找到了大量的解釋器,所以我認為世界需要一個 Brainf**k 編譯器。
儘管如此,不可否認,如果你想要一個非常好的 Brainf**k 編譯器,請查看
這個。
很多原因:
最後一個原因:整數溢位。通常,這是人們討厭的壞事。這可能就是發明單元測試(呃)的原因。但 Brainf**k 不同。記憶體磁帶中的數字上限為 255,如果超過該上限,則應重設為 0。此外,如果該值低於 0,則應重設為 255。 C 會自行執行此操作;我不需要為它編寫任何程式碼。
更高層次的概述:
它將 Brainf**k 程式碼從檔案讀取到 code[] 中。
然後,它設定了一個基本的 C 程式:
#include <stdio.h> int main() {char t[30000]={0};int p=0;
您可能已經注意到它缺少右括號。那是因為更多的程式碼加入了 char[].
如果您想知道,char t[30000] 是給您的記憶體。我使用 t 作為磁帶的縮寫形式,但將其縮短,因為這些程式並不適合人類可讀。
接下來,它會循環遍歷程式碼數組,該數組是單一字元的數組。對於每個字符,它將其轉換為 C 代碼:
character | becomes |
---|---|
> | p |
< | p-- |
- | t[p]-- |
t[p] | |
. | putchar(t[p]) |
, | t[p]=getchar() |
[ | while(t[p] != 0) |
] | } |
您可以查看上面的內容來了解這些符號的作用。
這些值將會加到程式輸出中,其中將包含有效的 C 程式碼。
最後,將此程式碼加入最終輸出:
>++++++++[<+++++++++>-]<.>++++[<+++++++>-]<+.+++++++..+++.>>++++++[<+++++++>-]< ++.------------.>++++++[<+++++++++>-]<+.<.+++.------.--------.>>>++++[<++++++++ >-]<+.輸出的程式到此結束。然後,轉譯器將此代碼列印到標準輸出,以便使用者可以按照自己的意願進行操作。
最後的想法
在寫這篇文章時我有一些改進的想法。我不認為我可以做太多事情來讓它更快,但我可以做一些事情來讓它更安全、更好。
您可以在此處查看最終程式碼。
如果您願意,您也可以做出任何形式的貢獻。
感謝您的閱讀!
以上是您見過的最小的轉譯器的詳細內容。更多資訊請關注PHP中文網其他相關文章!