跳轉到內容

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。

旁註:I/O 緩衝區

[編輯 | 編輯原始碼]

這種語言是基於位的,因此它以位而不是字元輸出。但是,在許多實現中,這些位儲存在一個“緩衝區”中,當緩衝區中已經有 8 位時,這些位將作為 ASCII 程式碼輸出,並且它們將被清除。對於輸入,也會發生類似的事情。當您輸入一個字元時,程式會自動將其分解為 8 位,然後將其儲存在一個“輸入緩衝區”中。當程式想要讀取一位時,它會讀取緩衝區中的一位,並且該位將被刪除。

華夏公益教科書