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 的高手他的境界為何?

程式口語化,對兩個堆疊的變化瞭然於胸毫無半點刻意。