1L_a 程式語言 / 語言
1L_a 是一種二維程式語言,這意味著程式碼並不一定按線性順序執行。因此,當程式啟動時,一個指令指標(簡稱 IP)會從第一行的第一個字元開始生成,並向下移動。它將每一步前進並執行它遇到的命令,除非有東西改變了它的方向。
有兩個指令:GO 和 STOP。GO 指令根據 IP 的方向執行不同的操作。(我們將在介紹陣列後討論這些指令。)直譯器將記住程式的第一個字元,每次它遇到該字元時,GO 指令就會執行。其他所有內容都會執行 STOP。我更喜歡使用空格作為 GO 觸發字元,因為這樣可以輕鬆地透過觀察程式來跟蹤 IP 的移動。
1L_a 是基於陣列的,這意味著您可以操作內建陣列。(這裡,陣列是布林型別的。)陣列中的前三個元素,即 TL0、TL1 和 TL2,用於 I/O,我們將在稍後討論。
有一個數據指標(不要與 IP 混淆),簡稱 DP,最初指向 TL2。所有操作都基於資料指標。您可以移動資料指標,或讀取和切換它指向的位。
您可能注意到我說的是讀取和切換,而不是讀取和寫入。這是因為 1L_a 沒有直接設定一位的方法。要將一位設定為 0,您可以編寫以下程式碼:
- 讀取該位。
- 如果該位為 1,則切換它。
TL0 是陣列中的第一個元素。如果它被切換,程式將從 STDIN 讀取輸入或將輸出寫入 STDOUT,這取決於 TL1 和 TL2 的值。這是在這門語言中執行 I/O 的唯一方法。
TL1 是 I/O 開關。當您切換 TL0 時,直譯器將檢查 TL1,如果 TL0 為 0,程式將讀取一位輸入,並將它的值儲存在 TL2 中;如果 TL1 為 1,程式將輸出一位。
TL2 用於註冊要輸出的位或新輸入的位。它更靠近普通位,因此當您要輸出一位時,您可以將它從普通位移動到 TL2,而無需經過其他特殊暫存器(在 1L_a 中,移動您的 DP 非常棘手),並且當您輸入一位時,您可以讀取該位在“回家”的路上。
如前所述,1L_a 中有兩個指令:GO 和 STOP。以下是一個表格顯示了它們執行的操作
| 指令 | IP 方向 | 操作 |
|---|---|---|
| GO | 向上 | DP 向右移動一位。 |
| GO | 向左 | DP 向左移動一位,然後切換 DP 指向的位。(注意:切換的位在新的位置,而不是舊的位置。) |
| GO | 向下 | 不執行任何操作。 |
| GO | 向右 | 不執行任何操作 |
| STOP | 任意 | 向後移動一個單元格(這裡,“向後”是指與 IP 方向相反的方向),並讀取指向的位。如果讀取到 0,IP 將逆時針旋轉,如果讀取到 1,IP 將順時針旋轉。 |
與您可能想象的不同,在這樣的語言中,“不執行任何操作”操作非常有用,因為它可以在不產生任何“副作用”(例如修改陣列)的情況下轉移 IP。
這種語言是基於位的,因此它以位而不是字元輸出。但是,在許多實現中,這些位儲存在一個“緩衝區”中,當緩衝區中已經有 8 位時,這些位將作為 ASCII 程式碼輸出,並且它們將被清除。對於輸入,也會發生類似的事情。當您輸入一個字元時,程式會自動將其分解為 8 位,然後將其儲存在一個“輸入緩衝區”中。當程式想要讀取一位時,它會讀取緩衝區中的一位,並且該位將被刪除。