4.教學文件
Forth 簡介
Forth 語言是一種發展性很高的電腦語言而且提供了交談式 (Interactive)
程式發展環境,給使用者使用。原本 Forth 只被發展且用在小型計算機的系統上,
你可以看到幾乎所有的各型微處理機上均有各型各色的 Forth 系統被發展出來。
Forth 也可以被用在更寬廣的應用上如 Spread Sheet,Expert Systems 和
多工的 database 上等。
Forth 是擁有兩堆疊的虛擬機器
在表面上 Forth 是擁兩個堆疊可以直接執行的電腦程式語言。在實質上這個
虛擬機器是由程式計數器 (Program Counter),Memory (記憶體), ALU
(數學計算單元) 和 FILO (first-in, Last out),資料堆疊 (Data Stack
及 FILO 迴返堆疊 (Return Stack) 所構成的,是一套完整的 CPU 結構 。
Data Stack (資料堆疊)
Forth 指令或程式均可自資料堆疊獲得參數並將其結果放回資料堆疊中。此資料堆疊
可視為以先進後出 (FILD) 方式的暫存器組,專門處理 Forth 指令所需的參數及結果。
舉例而言,若要計算 3+ 4 * 5,所需指令為 "+" 及 "*"。
因Forth指令均為後運算符法 (Post fix notation),上述計算變成
從鍵盤輸入 3 4+5*
從螢幕輸出 35 Ok
。 3 先被放入資料堆疊中
。接著 4 被放入資料堆疊,而 3 被擠入資料堆疊下層中
。接著 + 指令自資料堆疊中取得兩個數據產生的結果 7,放入資料堆疊中
。接著 5 亦放資料堆疊中,而 7 被擠入下一層資料堆疊中
。接著 * 指令自資料堆疊中取得兩個數據產生的結果為 35,放入資料堆疊中。
。接著 .指令自資料堆疊變成空的。
。"ok" 是 Forth 的提示字元。
要瞭解 Forth 語言,看得懂所設計的程式,首要的事,即要很清楚資料堆疊的運做,
並時時清楚它的狀態及內容。另外 Forth 有維護資料堆疊的指令如 :
DUP (Duplicate) - 複製資料堆疊最上層的一個資料。
SWAP -- 資料堆疊最上面二層的資料互相交換位置。
迴返堆疊及 Forth 程式
Forth 的程式和一般的電腦語言不太一樣。一般 Forth 的程式其實是一段 "定義",
一個副程式會以一個字或指來代表或呈現。而所有字(副程式庫)的集合,我們稱之為字典
(Dictionary) 所以 Forth 的程式是由一些在字典的 "字" (副程式),所組成一個
新的 "定義",新的 "字" (副程式),如此結構化一層一層組成的。
在 Forth 中副程式呼叫和迴返 (Return) 是相當頻繁且重要的。此呼叫和迴返所需的地址
Forth 以透過迴返堆疊 -- 另一個類似暫存器檔的機構來完成。迴返堆疊亦是一個 FILO
(first-in Last out) 結構的堆疊,此特性剛好可以完全符合副程式呼叫和迴返的需求。
舉例說明:如我們要計算 C = a^2 +b^2 以 Forth 程式來完成首先我們會用到堆疊指令。
DUP (資料疊複製指令 Ex: 3 DUP ••結果 3 3
SWAP (資料疊交換指令 Ex: 12 SWAP ••結果 1 2
此程式會為
: SUM-OF-SQUARE (a b --c) 此為說明資料堆疊之變化
| | ( (
| | ( ( 此定義字 (副) 程式之
開始一個定義 ← ↓結果會放在資料堆疊上
新定義名字(副程式) (( 需從資料堆疊獲得之參數
DUP * SWAP DUP * + ; ( 定義字結束或副程式結束
S0 b b^ a a a^2 a^2+b^2
S1 b a b^2 a b^2
S2 b b^2
所以會得到 C = a^2 +b^2其結果在資料堆疊上。
此程式SUM-OF-SQUARE我們可以把它視為
(呼叫DUP副程式,此時會有一個回返地址被放在回返堆疊上,
Dup結束時用掉此回返地址。
(再呼叫 * 。
(再呼叫 SWAP
(再呼叫 DUP
(再呼叫 *
(再呼叫 + 結束
我們可以將程式重寫成二段式呼叫如下:
: SQUARED ( n -- n** 2 ) \ 將n變成n**2
Dup * ;
: SUM-OF-SQUARES ( a b -- c ) \ 計算c=a**2+b**2
SQUARED SWAP SQUARED + ;
此程式 (SUM-OF-QUARES) 運作如下:
一、呼叫SQUARED (呼叫 Dup ---此時回返堆疊有兩層回返地址
(呼叫 * ---此時回返堆疊有兩層回返地址
二、呼叫SWAP-----此時回返堆疊只有一層回返地址
三、呼叫SQUARED (呼叫 Dup ---此時回返堆疊有兩層回返地址
(呼叫 * ---此時回返堆疊有兩層回返地址
如此你應已暸解回返堆疊在Forth語言的作用和重要性,因回返堆疊和程式流程、
控制權移相當有關係,絕對不可能破壞,否則會有當機的可能性。有一原則要謹守
--- 盡量少用回返堆疊來做資料轉換。
一個好的Forth式設計師會努力的把每一個定義字的長度控制在很短的情形下
(通常只有一行的長度)。並且選一個適當的名稱做為定義字的名字。這會使得
Forth程式口語化/可讀性的程度大為提高,這是Forth語言極值特色。
在此提一下金城先生在他的"Forth 的襌思"一書中無上心法第二篇---
如何在心中建一個電腦"有一段說明他剛學Forth時,也時,日日怨,夜夜愁,
直到一年後發覺自己在寫程式,口中順口說出的就是程式句子,心中凝想著
兩個堆疊的上下起伏毫無半點刻意,是下意識的反應。
這也正說明一個 Forth 的高手他的境界為何?
程式口語化,對兩個堆疊的變化瞭然於胸毫無半點刻意。