首頁 > 後端開發 > C++ > 您見過的最小的轉譯器

您見過的最小的轉譯器

DDD
發布: 2024-12-17 21:28:15
原創
523 人瀏覽過

The tiniest transpiler you

今天早上我寫了一個 Brainf**k 到 C 轉譯器。我總共花了大約一個小時。

整個內容不到 50 行 C 程式碼。你可以在這裡看到它。

什麼是brainf**k?

這是一種深奧的編碼語言。由瑞士學生於 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 編譯器,請查看
這個。

為什麼是C?

很多原因:

  • 我想要更多練習
  • 速度很快
  • 它主要是便攜式的
  • 很普遍
  • 無論如何,我不需要太多程式碼。

最後一個原因:整數溢位。通常,這是人們討厭的壞事。這可能就是發明單元測試(呃)的原因。但 Brainf**k 不同。記憶體磁帶中的數字上限為 255,如果超過該上限,則應重設為 0。此外,如果該值低於 0,則應重設為 255。 C 會自行執行此操作;我不需要為它編寫任何程式碼。

如何?

更高層次的概述:

  • 從檔案或標準輸入讀取碼到記憶體
  • 將每個字元轉換為 C 代碼
  • 列印完成的 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中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門推薦
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板