Forth PL 程式簡單易行!

77 阅读6分钟

Forth PL 程式簡單易行!

不相信? !你做的沒錯,只要選擇合適的語言和環境,程式設計就會變得多麼簡單。這門程式設計課程以解決實際問題為基礎。

這種 PL(程式語言)的語法極為簡單,幾乎可以忽略不計。它只有一條主要規則:所有單字(也就是語言運算子和使用者自訂函數詞)和數字之間必須至少用一個空格、製表符和換行符分隔(即「任意空格符,分隔符」)。

SP-Forth 程式設計環境非常適合我們的需求。您可以從官方網站快速下載並安裝最新版本,然後立即免費使用此控制台應用程式進行程式設計。我們將使用解釋器模式進行操作。

這意味著啟動 SP-Forth 編程系統後,您可以輸入命令或整個程序,然後按下 鍵,應用程式將處理代碼並給出預期結果。下載和安裝 SP-Forth 應該不會有任何困難,因此我們在此省略此過程。

從歷史上看,程式設計的基礎知識是從第一個在螢幕上顯示「Hello, World!」的程式開始學習的,這個程式在俄語中是「你好,世界!」的意思。

Forth 程式語言的程式碼如下:

.( Hello world!)

或者 S" Hello, World!" TYPE

之後,上述訊息將顯示在螢幕上。 Forth 程式語言的運算元 <.(> 和 <S">:第一個運算元取得其後直到結束引號 - "(行尾指示符)的文字並將其列印在螢幕上;第二個運算元建立一個字串,其位址及其長度會傳送到堆疊。然後,TYPE 運算元使用這些數字、位址及其長度作為參數,也列印一條訊息。

最重要的是「TYPE」應該立即執行,以避免執行過程中出現錯誤,這是系統的特性。注意空格-在 Forth 中,空格用於分隔語言中的單字。如果第一個選項比較簡單、更短,為什麼還需要第二個選項?因為它是通用的,所以這就是 Forth 中行的定義方式,將來會很有用。

同一程式的第三個版本將如下所示:

  : Hello_World ." Hello, World!" ; Hello_World

不同之處在於,我們定義了一個同名的單詞,然後調用它。前兩個選項在解釋模式下運作,而這個選項是編譯模式(在 Forth 字典中建立一個新單字)。由於它是通用的,它可以在程式的不同位置多次調用,甚至可以在你的庫中使用這段程式碼。

這樣,我們第一個完整的程式就寫好了。你可以把它命名為 Start 或任何你喜歡的名字,而不是 Hello_World。關鍵在於遵循一個簡單的規則:名字應該資訊豐富。 Forth 程式語言的程式設計風格與其他語言並無二致,以後再了解一下會很有幫助。

這樣我們就定義了一個新詞。字的定義以冒號開頭,然後是任意分隔符號(空格、製表符或換行符)。接下來是詞名(你可以自己想出),然後是程式碼——也就是實作(一系列運算子、數字和其他已定義的詞),中間用空格分隔。詞的定義以分號結尾,也用空格與代碼分隔。

一切已成定局。 Forth 程式設計初學者課程的第一個程式看起來相當簡單。

我們來加入一些註解:

通常情況下,每個新詞的定義後都會添加註釋,說明該詞從堆疊中取得哪些參數,以及哪些參數留在堆疊中。讓我們重寫第一個 Forth 字:

: Hello_World ( -> ) ." Hello, World!" ; Hello_World

由於 Hello_World 保留堆疊不變(不觸碰堆疊),因此箭頭前後沒有任何內容。註釋是括號的內容。

還有第二種方法可以將程式碼註解到行尾。這就是符號 - “\”。

: Hello_World ( -> ) ." Hello, World!" ; Hello_World \ это программа, выводящая сообщение «Hello, World!»

即使對於完全的初學者來說,自己程式設計也不是特別困難。這不是 C 或 C++ 程式語言。一切都非常清晰簡單。您可以在線上或離線練習程式設計。對於第一個選擇,有一個 Forth 語言的腳本翻譯器。我們將重點介紹一種特定的方言 - SP-Forth。它適用於所有流行的系統(Windows、Linux)。

通常,學習程式設計的第二個任務是編寫計算器。在 Forth 中,你不需要寫計算器,因為它原生支援基本運算,只不過採用了一種不太常見的格式,稱為逆波蘭表示法或後綴表示法。

在數學中,你習慣於用中綴形式編寫公式,如(1 + 2)* 5(4-5),其中二進制運算符號寫在數字之間,例如,在 Lisp 中,運算在前,然後是操作數,而在 Forth 中則相反,首先我們將操作數發送到堆棧,然後操作對它們執行操作數,並將結果留在那裡。

堆疊只是記憶體中的一個位置,由硬體層級維護,因此對其的所有操作都執行得非常快,我們的中間資料將儲存在那裡。

我們的計算器工作原理如下:

操作數1 操作數2 運算。也就是說,在 Forth 中,我們應該寫“1 2 +”,而不是“1 + 2”。

`1 2 +`

 Ok ( 3 )                              \ 1+2=3 в скобках – это содержимое стека

1 2 *

 Ok ( 3 2 )                            \ 1*2=2 очередной результат на вершине стека

1 2 -

 Ok ( 3 2 4294967295(-1) )             \ 1-2=-1 4294967295 – это без знаковый вариант числа -1

1 2 /

 Ok ( 3 2 4294967295(-1) 0 )           \ 1/2=0 – это целочисленное деление, потому результат нуль

1 2 MOD

Ok ( 3 2 4294967295(-1) 0 1 )          \ остаток от деления 1/2

1 2 /MOD

Ok ( [7].. 4294967295(-1) 0 1 1 0 )    \ остаток от деления 1/2 и целая часть 1/2

你可以說用 Python 程式設計的可能性要豐富得多,這沒錯。但 Forth 速度更快,而且作為第一個程式語言,它更簡單易學,最重要的是,更容易理解。在我看來,學習 Pascal 程式設計已經不再有意義了。

雖然它很適合研究各種演算法,但它已不再是一種現代程式語言,存在著許多冗餘的結構和語法。

我們來舉幾個 SP-Forth 程式設計的例子。

: ^2 ( A -> A^2 ) DUP * . ;          \ возведение числа в квадрат`

: ^3 ( A -> A^3 ) DUP DUP * * . ;    \ возведение числа в куб`

: ^4 ( A -> A^4 ) DUP * DUP * . ;    \ возведение числа в четвертую степень`

DUP 是一個單詞,它只是複製堆疊頂部的數字。

讓我們計算 5 的平方,為此我們在鍵盤上輸入:

5 ^2`

25  Ok`

我們得到了正確的答案。你需要仔細複製程式碼,因為在複製第一個單字「平方」時,我們收到了錯誤訊息

: ^2 ( A -> A^2 ) DUP * . ;\ возведение числа в квадрат                            ^ -2003 WORD OR FILE NOT FOUND

當「複製貼上」時,「;」和註解之間的製表符會消失,因此我們會看到一條由於語法錯誤而導致的錯誤訊息。這可能是系統功能。

此外,在 Python 風格中,你可以使用 **2 來取代 ^2: : **2 ( A -> A^2 ) DUP * . ;     \ возведение числа в квадрат 5 **2 25  Ok

結果,我們得到的答案相同,但程式的風格卻改變了。

這足以開始。之後,在 SP-Forth 程式設計環境中解決具體問題時,這個過程將變得更加容易理解和自覺。

俄文原文位於 hi-aga.ru/

使用谷歌翻譯翻譯的文章