第一章 緒論 Forth 的歷史 Forth 是一種電腦語言,它是由charles moore先生在六十年代末期發明的, 在最初的十年Forth 幾乎沒有人知道,一直到了一九八十年代以後,由於它的語法 精簡,結構優雅,加上研究團體Forth Interesting Group ( FIG )的大力推廣, 才漸漸的為人所發掘,進而廣為人知,我們也可以看到它在許多產品上有優越的表現。 當初charles moore先生在發明Forth 時,即是Fourth 的縮寫,意指此為 〞第四代電腦語言,〞在當時他的思考方式和方法都被排除在當時電腦科學的 「主流」之外。但就現在來看,許多Forth 結構已被電腦科學拿來在現代的電腦 上使用。舉例而言如:Sun Workstatiow 和Power Pc與PCI 的Open Boot 開機 系統F-Code 就完全是Forth語言,它將在未來pc和網路系統上都將占有一席之地。 Forth 的程式碼並不易懂,因為它的編譯器也是Forth 本身所寫成的。要真正 瞭解Forth 就必先瞭解編譯器,不然就只能發揮到和其它語言如C 一樣的功能。 而要瞭解編譯器卻又必先瞭解Forth。這種「易學難精」的特性,使許多人卻步。 許多年來Forth 都只在某些特定的擁護者之間流傳及使用在某些特定的產品上。 從一九八十年代開始Forth 推廣學會 ( Forth Interest Group)的成立,推出了 一系列在各種微處理機上的Forth 系統,使得大家能有Forth 程式碼,進而使用它。 更有許多書籍,如 Leo Brodie 的 Starting Forth 和 Thinking Forth, 丁陳漢蓀博士的 System Guide to Fig-Forth. 和 Inside F83。均是Forth 最佳 的參考書籍。 簡而言之,其實Forth 本身並非真的「易學難精」,若我們從電腦科學來看, 它並非 〞單純〞的只是一個電腦語言而已。就特性上它擁有自己的CPU 架構 (Virtrue Computer Structure ) ,自己的暫存器( Registers ) 。就系統上, 它有自己的編譯器及I/O 方式。就語言上有自己的語法和指令。這些在電腦科學 上要學個二、三年的觀念和技巧,我們是能期望在二、三個月就能完全掌握的很好 的。所以若你把它當作一般的〞電腦語言〞來看待的話,那它就會真的是「易學 難懂」了。 Forth 的優點,就如同金城先生在Forth 的禪思一書所言, ─人機合一的無上心法─ 符式如道行之必效,柔以克剛,簡潔為高。 現今的電腦科技,軟硬體都相當複雜。主要是由於人與機器間,隔了太多軟體。 「以軟體保護硬體」這觀念源自於過去大電腦的時代,當時電腦當機是最可怕的災難, 所以專家們設計了多重關卡( 如O.S LOADER DRIVER 等) 來「幫助」使用者使用電腦 設備。而這些複雜的軟體,卻造成了使用者學習上莫大的因難。( 如圖一) ┌──────┐ │ 使用者 │ └──────┘ ↓ ┌──────────────┐ │ Applications (應用軟體) │ │ Compilers (編譯程式) │ │ Editors (編輯程式) │ │ Assenbler (組譯程式) │ │ Linker (鍵結程式) │ │ Loader (載入程式) │ │ │ │ │ Operating Systems │ │ (作業系統) │ │ │ │ │ Resource Managers │ │ (資源管理,如記憶體 │ │ CPU 的時段分配) │ │ │ │ │ Device Drivers │ │ (設備與裝置的驅動介面) │ └──────────────┘ ↑ ┌──────┐ │ 電腦硬體 │ └──────┘ 然而現今的電腦已不再是那麼回事,按一下RESET 即可再起動,更何況使用者 往往就是電腦的擁有者,他會為他的行為負責。所以實在無需再將人機之間加諸種種 限制。FORTH 即遵循這個觀念: 基本上,FORTH 是一個單純、整合的介面,透過它使用者能夠輕鬆地取用任何 硬體資源,更由於單純化、最佳化,所速度更快、記憶體更省、效率更高。(如圖二) ┌─────┐ │ 使用者 │ └─────┘ ↓ ┌───────────┐ │ Outer Interpreter │ │ (人機介面) │ │ │ │ │ Forth │ │ │ │ │ Inner Interpreter │ │ (執行機構) │ └───────────┘ ↑ ┌──────┐ │ 電腦硬體 │ └──────┘ 此外FORTH 還有幾個特性,現今電腦中過多的暫存器 (Register) 往往造成 呼叫程式時需要重覆存取的困擾。而FORTH 採用高效率的記憶體存取技巧,且將 一些需暫存資料都放入堆疊(Stack) 中,大大提升了效率。而後置式的運算表示 法,雖然會造成某些初學者的不習慣,但其精簡只需要1-pass的編譯,而傳統的 中置式則通常2-pass的編譯。FORTH 的精簡單純,正是造成它效能驚人的最大原因。 Forth-83標準 本教材將使用F-83系統,並依循ANSI-Forth之語法。這是因為F-83是一套非常 普遍且完整的Forth 系統,而且被當做標準使用了非常久的一段時間。它的完整與 接受性在於F-83發表之前經過FIG. Mr. Robert L. Smith領導的小組,長時時的 討論與修改,而訂下來的Forth-83標準。而且在公開的軟體上,有完整的編輯程式、 組合語言 DOS BIOS界面、編譯器和解譯器與多工 (multi tasking) 等程式和原始 程式資料。 我們也將同時在8051單晶片系統上使用F-83 Forth語言,在後面的教材上, 我們就同時可學習到從PC到8051的機器上經過Forth 的整合後,它的連貫與一致性, 將使8051單晶片系統的功能,超過專業用的單晶片模擬器mice等。 堆疊與數字 Forth 的堆疊 Forth 中所有的操作或是每件事物都由一個字(字詞),包括所有的指令、變數、 運算、字典。連同新增的程式也會集合成一個字詞來呼叫及使用。就Forth 而言, 任何一個字母、或是一群字母,其前後兩邊都用一個空格和另一個字母或另群字母 分開,這就叫做一個字(字詞),習慣上電腦會稱之為指令: 如:HELLO DISK_BUFFER C@ DUMP % MOVE BYE以上都是Forth有效的指令(字) 。所以你應該要開始習慣在每個 指令(字)之後打上空白鍵。 Forth 概說─ .Forth 的每件事物都是一個字或字詞 .Forth 的每一個字必須以空格(space) 隔開 .Forth 的每一個字儲存在一個字典裡 .Forth 的每一個均可在直譯的橫式中執行 .Forth 的每一個字在編譯的模式中,是僅儲存在字典裡 .Forth 的新字是由字典上可查詢解譯的字所定義組成的 數字也是Forth 的字。使用的是整數型數字沒有任何標點,通常不能超過32767, 也不小於-32768(16bits)。若要用更大的數,則需要使用雙整數型數字,在後面的 章節會再詳細的介紹。負數前面有一個負號,如: 1 0 -1 32000 -64 以上都是有效的Forth 數字。而這些數字會被Forth 存在Forth 的資料堆疊(Datastack) 中,簡稱堆疊(stack)。 (未完)