說明: 原文的這個官方連接已經失效, 因此費了點勁才找到上面的那個.html
本文的目的是給出 Forth
編程系統的一個總體輪廓,包括語言的歷史、突出的特色和使用方法,討論了最經常使用的實現方法,但更重要的是討論了 Forth
編程的方法和哲學思想。程序員
Forth
的來歷按照 Forth
語言的發明人 Charles Moore
( Chuck
)的說法:算法
我第一次把各類想法組合成一個總體以後,它在「第三代計算機」 IBM1130
上工做得如此有效,以至於我認爲它是「第四代語言」,理所固然地應該被稱爲 FOURTH
。不過,當時的 IBM 計算機只容許 5 個字符的標識符。因此 FOURTH
變成了 Forth
,這是一個很是好的的文字遊戲。數據庫
Forth
語言是 60 年代發明的,當時 Moore
在斯坦福線性加速器中心作計算機程序員工做,後來變成了一個自由工程師。當時的工程技術人員爲了控制編譯程序必須學習大量的方法,包括鏈接器、彙編器、僞指令以及高級語言,開發這個新工具的目標就是爲了克服這些問題。編程
第一個稱爲 Forth
的程序大約是在 1970
年編寫的。第一個完整的實現是 1971
年在一臺 PDP-11
上完成的,用於亞利桑那州國家射電天文臺的 11
米射電望遠鏡。這個系統的責任是定向和跟蹤望遠鏡,收集數據並記錄到磁帶上,支持一個交互式的圖形終端,供天文學家分析之前記錄的數據。系統的多任務特色容許這些功能同時執行,沒有時間上和其它方面的衝突。數組
這個系統取得了巨大的成功,世界各地的天文學家開始請求提供軟件拷貝。Forth
的使用範圍迅速也擴大,國際天文學會於 1976
年接受了 Forth
做爲標準語言。數據結構
這個應用的成功還促使 Moore
和 Elizabeth Rather
( ("Bess") 於 1973
年成立了 Forth, Inc.
公司,目標是開發這種語言的商業應用。 Forth, Inc.
在小型機上開發了多用戶的 Forth
版本,能夠用於從數據庫到圖像處理等科學和應用領域。和第一個應用同樣,它們須要不一樣工具的組合。electron
1977
年,公司爲剛剛出現的 8
位處理器開發了一個稱爲「microForth
」的版本,對小型機上的「miniForth
」作了擴展和補充。1979
年,稱爲「PolyForth
」的產品替代了這些系統。今後之後,它就成了市場上銷售量最大的 Forth
系統。編輯器
「microForth
」系統在美國、歐洲和日本的嵌入式微處理器應用中取得了成功,由此產生了歐洲 Forth
用戶團體 (EFUG
) ;1978
年,位於北加利佛尼亞的計算機愛好者成立了 Forth
興趣組織 (FIG
).
FIG
從天文臺獲得 Forth
系統,再用這個系統開發出一個簡單的模型,而後在幾個不一樣的系統上實現(那固然是獲得了 Forth,Inc
的許可以後)並以很是低的價格銷售。這個模型後來變成了著名的 FIG-Forth
模型。全部這些使得對 Forth
的興趣迅速增大。 FIG
目前在 15
個國家中有 60
個分支。ide
Forth
是一個交互式的程序設計環境,最初是爲程序員在小型和微型計算機上開發應用程序而設計的。最先用於科學和工業應用,好比儀器、機器人、過程控制、圖形和圖像處理、人工智能和商業應用。 Forth
的主要優勢是軟件開發快速、交互式、計算機硬件的高效使用等。
Forth
經常被做爲一種語言,這固然也是它最多見的方面,然而 Forth
所提供的功能比傳統的程序設計語言要多。傳統的高級語言工具包含有許多分離的工具(編譯器、編輯器、彙編器等等), Forth
把它們融爲一體。與傳統的高級語言相比,它是通過深思熟慮的,徹底沒有傳統高級語言那麼複雜的語法特性。
最先實現的 Forth
是一個獨立的系統,它包含獨立操做系統的通常功能,還包括有編輯器、編譯器、彙編器、調試器和其它工具。一個單一的、簡單的、一致的規則支配這些能力。今天,儘管還能在許多處理器上見到獨立的版本,但更多的版本是與 MSDOS
、 WINDOWS
、UNIX
一類操做系統協同工做的。
Forth
並不起源於其它已有的程序設計語言,因此它的外觀和內部特色對於新用戶來講是特殊的。可是 Forth
的簡單性、高度模塊化和交互式特性能夠彌補初學者的陌生感,使得 Forth
很是易於學習和使用。一個新的程序員一般須要花一些時間來掌握 Forth
巨大的命令集,經過一個月左右的全面使用,程序員就能夠理解它的整個內部工做機理,所學到的東西要比傳統操做系統和編譯器多得多。
Forth
與傳統語言最大的不一樣是它的可擴展性。 Forth
的編程過程就是定義新的字,字實際上就是語言的新命令。字能夠用一系列之前定義的字來定義,這個過程與教育孩子的過程類似:咱們老是用孩子們之前理解的概念來教給孩子們新的概念,而這些字被稱爲「高級定義
」。一樣,新的字也能夠用匯編代碼定義,由於在多數 Forth
實現中都包括宿主處理器的彙編器,而這些字被稱爲 CODE
字。
可擴展性的結果是咱們在開發一個應用的同時,也間接地開發了一個特殊的、針對這一類應用的「面向應用的語言」,它能夠用於或者通過修改以後被用於類似的應用。
Forth
的可擴展性並不只僅是爲語言自身增長新的命令,因此不要把定義字與傳統高級語言定義函數、過程等同。可擴展性還可以建立一個能夠定義其它字的字,這種字被稱爲「定義
字」。在建立這樣一個定義字的時候,程序員可以指定它所建立的字在編譯時間、運行時間或者這兩種狀態下的特殊行爲。這個能力容許咱們定義特殊的數據類型,並對其行爲和結構實施徹底的控制。又因爲這種字的運行時間行爲能夠用高級語言或者彙編語言來定義,因此由定義字建立的字將具備與其它 Forth
字同樣的性能。系統也容許咱們增長一個新的「編譯指示符
」以實現特殊類型的循環或者其它的控制結構,好比 CASE
結構。
Forth
語言和英語很是類似,它的基本元素是已命名的數據項、過程,以及建立用戶化數據項的定義字的能力。過程和定義字可使用之前定義的字或者彙編代碼來定義,它們與其它語言的子程序類似,也與其它語言的命令等效。 Forth
容許咱們在鍵盤上打入一個函數的名字,這個函數將被當即執行。然而,若是咱們把功能的名字放到定義中,將編譯成對於這個函數的引用。
高級字是由其它字的集合來定義的,咱們能夠把這個過程想象成是其它語言的宏或者詞典中的英語定義。新的字被加入到它們可使用的存儲器中,其定義被加入到字典中。在一個 Forth
字的命名規則中,只有不多的幾個字符不能做爲命名字符使用。許多程序組織使用更好的命名約定,經過可打印的字符以增長程序的可讀性。
當遇到一個字的時候, Forth
就經過字典搜索但願找到這個字的定義,若是找到,這個字定義的功能或者被當即執行,或者做爲引用而被編譯到新的定義中。然而,若是在字典中沒有找到這個字,系統就試着把它轉換成一個數。若是轉換成功,就把它放在堆棧上。若是不能轉換成數字,就顯示這個字並打印出一個錯誤的信息來報告這個字是系統所不知道的。
Forth
堅持「結構化程序設計」原理:
這種方法有兩個明顯的優勢:
Forth
成爲一個「設計性語言」,容許自頂向下的設計同時保持自底向上的測試。一個字能夠在不一樣的程序中使用,可是它的功能只須要定義一次;這些都保證了 Forth
軟件可以快速和有效地被開發,同時,若是管理得當,也能夠做爲自身文檔的基礎。
Forth
的 5 個主要元素決定了它的特色:
如下是一些使用 Forth
開發的項目
Atari
的許多投幣遊戲機都是用 Forth
開發的。他們相信開發高性能代碼的最快方法是使用 Forth
,加上使用匯編語言來重寫最內層的循環。
按照最近與著名的 Infocom
高級遊戲開發者的談話,他們的遊戲解釋器也是用 Forth
寫成的。
Unison World
爲 CP/M
操做系統開發了許多遊戲,所有都是用 FIG-Forth
編寫的。按他們技術總監 Marc de Groot
的說法,把一個基於 Z80
的遊戲移植到 6502
或者 MC6809
上,典型的時間很少於 3
個月。
美國 Federal Express
(聯邦快遞)公司的手持式行李分撿系統的程序是用 Forth
編寫的。項目經理 Gene Farrar
說,他能夠按須要在幾個星期內升級新固件,相比而言,其它的小組維護 C
語言代碼則至少須要 6 個月的時間。
1990 年 11 月哥倫比亞航天飛機的 4 個載荷中有 3 個是用 Forth
編程的。按設計團隊之一 Johns Hopkins University's Applied Physics Laboratory
的 John Hayes
說法,他們選擇 Forth
來解決飛行中的硬件問題,靈活性是一個主要的因素。
SUN 公司把 Forth
用於它的工做站可編程 Boot ROM
中,以天天 500-1000
臺的速度發貨,是可編程 Forth
系統中數量最大的。 1994
年 IEEE 1275-1994
將 Forth
用於 BOOT
(初始配置) 固件的標準,這也是 POWER PC
通用硬件平臺的基礎。
在電影《終結者 II :世界末日》中, Cyberdyne Systems T1000
系統的特技效果是基於 Morphing
軟件包 Forth
產生的。
Forth
程序存儲在字典中。字典佔據了系統存儲器的很大部分,它由一個串線連接的可變長度的項目組成,每一個項目定義了一個字。每一個定義的內容根據字的類型(數據項、常數、操做序列等)而有所不一樣,字典是可擴展的。
字是由「定義字
」加入字典的,最經常使用的定義字是 :
(冒號)。當冒號執行的時候,它爲後面的字創建一個字典項,而後進入「編譯
」模式。有許多不一樣的編譯方法,最經常使用的是「串線編碼
」,這種方法把定義編譯成一系列之前定義字的地址引用。定義由 ;
(分號)結束。下面就是一個定義:
: NETWORK ( -- ) OPEN LINK TRXT. ECHO CLOSE LINK ;
圖 1
編譯的字典項當一個名字項被編譯到字典中的時候(稱爲定義的首部),它包含一個指向字典中前一個首部的指針。新字的名字加入字典(這裏就是 NETWORK
),接着一個指向名字爲「(:)
」子程序調用的指針編譯到字典中做爲定義的第一部分,這個指針指向一段在解釋定義體時須要執行的代碼。固然,這裏所說的不是惟一的編譯技術,但它的應用最爲廣泛,這種技術稱爲間接串線編碼,由於定義中的第一個項目是一段代碼的引用,這段代碼知道如何解釋定義的其它部分。
定義的其它部分稱爲這個定義的體。在編譯模式下,系統將依次尋找每一個字的首部。每一個首部地址依次放到定義體中,這樣就產生了一個地址列表。最後在到達 ;
時,一個稱爲「EXIT
」的子程序地址被編譯進定義。 EXIT
子程序用來將控制返回到調用字,就像一個子程序返回同樣。
Forth
維護兩個下推式堆棧,下推式堆棧也稱爲後進先出列表,它們提供了 Forth
字之間通訊以及邏輯控制的有效機制。
儘管兩個堆棧的結構是相同的,但它們的用途卻大不相同。與用戶/程序員關係最爲密切的是數據棧,它保存有調用字之間傳遞的參數,以替代傳統語言的參數列表,同時也是一個實現定義重用的有效內部機制。第二個堆棧是返回棧,用於保存嵌套定義的返回地址,偶爾也用於臨時保存其它的數據。
數據棧的使用致使了一種操做數位於操做符後面的「後綴」表示方法,這種後綴表示方法經常被稱爲 RPN 或者「逆波蘭表示法
」,用以記念 Lukasiewicz
教授,上個世紀 20
年代時, Lukasiewicz
教授在華沙大學工做,爲 Sentential Calculus
開發了這種方法。
做爲一個例子,咱們來看一下字 BLANK
。這個字但願堆棧上有一個地址和一個數,字 BLANK
將從指定地址開始填充指定數目的 ASCII
空格,因而:
PAD 25 BLANK
將向 Forth
系統的便箋區填入25個空格,這裏地址是由字 PAD
放到堆棧上的。應用字一般按類似的方法定義,好比:
100 SAMPLES
將定義一個用於保存 100
個測量值的數據數組。算術操做也從堆棧上取值並將結果保存到堆棧上。例如, +
操做把棧頂的兩個數相加,並用它們的和替代棧頂。因爲操做的結果仍然留在棧頂,因此連續的操做就能夠組合在一塊兒而不須要臨時存儲變量。例如,表達式
tempn + ((reading % interval) / interval) * (tempn1 - tempn)
變成:
reading interval % interval / tempn1 tempn - * tempn +
Forth
本質上是一個解釋系統,在這樣的系統中,程序的執行是由數據項而不是由機器代碼控制的。解釋系統一般很慢,可是 Forth
卻經過兩級解釋而保持了實時應用所須要的高速度。固然,咱們這樣說是假設系統使用普通的串線編碼方法,若是使用編譯技術來產生本地代碼,就根本不會有任何速度上的損失了。
第一個解釋器是文本解釋器
,它掃描從終端(或者從海量存儲器)獲得的字符串,並在字典中查找每個字。若是找到了這個字,就經過第二級地址解釋器執行。
第二級解釋器是「地址解釋器
」。儘管不是全部的系統都用這種方法實現,但這種方法倒是最先的和最基本的方法,地址解釋器經過執行每一個定義點的程序來處理地址(或者標記)串,這些定義點是由 :
(冒號)建立並編譯到定義中的。
上電以後。 Forth
啓動一個稱爲 QUIT
的無限循環。這就是 Forth
文本解釋器,也稱爲鍵盤解釋器。
: QUIT ( -- ) BEGIN RESET QUERY INTERPRET AGAIN ;
RESET
清除堆棧,QUERY
等待用戶從鍵盤(或者從海量存儲設備)輸入一個命令,INTERPRET
尋找字典匹配,而後執行。BEGIN
和 AGAIN
是程序控制字,用於構造無限循環。QUIT
循環提供了語言的「交互式」特色,若是輸入命令,它就能夠當即被執行,而執行的結果可使用相同的文本解釋器來觀察。與其它的編輯 - 編譯 - 連接 - 測試程序開發過程相比,一個新的定義能夠在極短的時間裏被反覆地測試和排錯。
定義項首部的最後一個字段是指向功能執行的代碼指針,這個字段所在的地址被稱爲「代碼域地址
」,簡稱 CFA
。對於全部的 Forth
高級定義字(使用 :
冒號定義的字),這個地址就是地址解釋器的地址,它指向字 (:)
。
地址解釋器有一個寄存器 I
,其中包含被執行列表的下一個入口的地址。這個入口就是某個字的 CFA
地址,這個字被當前正在執行的高級定義字所調用。正是 CFA
決定了一個字的屬性(或者類型)。
在下面的例子中,字 A
調用字 B
,字 B
調用字 X
等等。 CFA
保存在中間寄存器 W
中。採用這種兩級間接尋址和字典列表結構的 Forth
編碼方式也被稱爲「間接串線編碼
」。
圖 2
間接串線編碼地址解釋器讀入 I
並使用列表中的下一個地址裝入 W
,而後從 W
讀出並執行由它指示的代碼。 I
自動增量指向列表中的下一個入口,由於第一個入口是 CFA
,因此 I
如今指向了定義體。這對於查找表一類的數據結構很是有用,由於定義體就是表元素的存儲區。
在高級定義的狀況下,代碼域地址指向子程序 (:)
,它把當前的 I
保存到返回棧上,而後從 W
裝入 I
並重復這一過程。
在高級定義的結尾,字 EXIT
被執行,恢復原來的 I
值,程序像之前同樣繼續執行。這三個動做: 「讀 I 指針
,保存 I 指針
,恢復 I 指針
」是地址解釋器得以工做的基本機制。
地址解釋器有三個重要的特色:
特別快。儘管實際的速度依賴於特定的實現,但專業化的實現是高度優化的,每一個地址一般要求 1-2
個機器字。這相比純的彙編代碼只增長0%-50%
的開銷。在許多基準程序測試中,好的 Forth
實現遠遠賽過諸如 BASIC
或者 LISP
一類的解釋語言,能夠與其它的編譯高級語言相比;
它使得 Forth
定義極其緊縮,每個引用僅僅須要一個單元(能夠把單元理解成機器字,可是「字」在 Forth
中是指一個定義項)。做爲比較,咱們能夠考慮一下許多高級語言產生的子程序調用結構:一個 CALL
或者 JSR
指令,後隨地址,在這以前和以後,還有參數序列的訪問指令。
使用返回棧保存地址的方法對於程序員是透明的,字也能夠按須要嵌套許多層,這樣的高級定義字序列能夠被自動處理而不須要特殊的代碼。
Forth
系統中的許多字都是用 :
定義並經過地址解釋器進行解釋的,而許多 Forth
系統自己也是用這種方法定義的。
大多數 Forth
系統都包含一個宏彙編器,爲它們所在的 CPU
進行彙編語言編程。經過使用定義字 CODE
,程序員能夠建立由實際的機器代碼組成的定義。 CODE
定義能夠用來完成 I/O
、算術原語和其它依賴機器(時間緊迫)的處理功能。當程序員使用 CODE
時,他就和使用其它彙編器同樣對 CPU
有徹底的控制能力, CODE
定義的字以機器速度全速運行。
這是 Forth
的一個重要特色。它容許那些明顯地依賴機器的代碼經過機器無關接口變換成爲可管理的片段。當須要把應用移植到不一樣的處理器上時,咱們僅僅須要從新編寫 CODE
字,這些 CODE
字就能夠嚴格地按相同的方法與其它 Forth
字進行交互。
Forth
彙編器自己也是極其緊縮的(典型地爲 1K
字節),它們能夠和編譯器、編輯器以及其它編程工具一塊兒駐留在系統中。這就意味着程序員能夠打入很短的 CODE
定義,而後當即執行它們,這個能力在調試客戶硬件時特別有用。
Forth
最後一個獨特的組成元素是它按數據和源程序虛擬存儲器的方式使用磁盤(或者其它海量存儲器)。在地址解釋器的狀況下,這種方法在歷史上是典型的 Forth
方式,但如今並不通用。
磁盤被分紅 1024
字節大小的塊,在內存中則準備兩個或者多個緩衝區,數據在引用時被自動讀入緩衝區。每一個塊有固定的塊號,直接對應於本地存儲系統的物理位置。任什麼時候候程序須要訪問時,它都會在內存中找到數據,並不須要顯式的讀寫操做。
這樣一個面向塊的磁盤管理方法對於 Forth
獨立系統的實現是簡單和高效的,結果是塊爲獨立和協同駐留 Forth
實現中的源程序和數據處理提供了一個徹底透明的機制。
在源程序塊中的定義經過 LOAD
命令編譯到內存中。許多系統包含一個編輯器,它把每一個塊組織成 64
字符 16
行的顯示模式並提供命令來修改源程序。
源塊在歷史上曾經是 Forth
風格的一個重要組成元素。就像 Forth
的定義能夠被視爲天然語言中的句子,一個塊至關因而一個段落,一般包含有與一個主題相關的定義,好比「向量處理」。在塊文本的頂行含有這個主題的註釋說明,應用程序能夠按實際須要來選擇裝入塊。
塊也被用於存儲數據。小的記錄能夠組合進一個塊,大的記錄也能夠分佈在幾個塊中。程序員能夠根據應用的須要分配塊,獨立的 Forth
系統還可以按磁頭運動最少的原則來組織數據以優化系統,還有幾個開發商提供了基於 Forth
塊的文件和數據庫系統。
在主機操做系統之上運行的 Forth
版本使用文件系統來實現塊機制,另外也提供基於操做系統環境的通常文件操做方法。
全部的高級字共享相同的數據結構,這種字的首部含有文本解釋器識別一個字所須要的數據信息,見圖 3
所示。
圖 3
定義的首部「LINK
」字段包含字典中前一個命令的首部地址,在搜索字典時須要這個地址。
「名字長度
」字段包含名字中所有字符的數量,後隨這些字符,在解釋過程當中進行名字匹配時須要這些數據。許多 Forth
系統僅僅存儲名字的前3個字符,這能夠在佔用空間最小的狀況下避免名字衝突,而許多系統的名字長度容許在 3-31
個字符之間選擇。
文本解釋器從字典的最後一個入口開始處理,並沿着鏈表向後查找直到匹配名字爲止。如今還有許多系統提供散列算法,它們把字典分紅幾個表,每次只查找其中的一個,這種方式能夠大大地節省查找時間。
「代碼指針
」是這個字將被執行的第一個指令的 CFA
,它造成了定義體的第一個入口。它也是代碼的地址,這個地址解釋定義的其它部分,對於不一樣的數據結構將指向不一樣的代碼。
圖 4
不一樣的數據類型所指向的行爲也不一樣字的其它部分也就是定義體,它依不一樣的數據類型而不一樣,如 圖 4
所示:
在彙編 (CODE
) 定義中,體中含有定義命令行爲的機器操做碼列表,所以 CFA
含有這個體的地址;
在諸如 VARIBLE
和 CONSTANT
這樣的數據結構命令中,字義的體中含有實際的數據。 CFA
含有處理這些數據所須要的子程序的入口地址,用戶定義數據結構的例子如 圖 5
所示。
在高級 :
(冒號)定義中,字的體中含有構成這個定義的全部之前定義字的地址列表。 CFA
是地址解釋器 (:)
的地址。
下面是一個典型的 Forth
源程序塊。這個應用程序用來控制 8
個 LED
提示燈,它也說明了 Forth
定義是如何組合以造成應用環境的。
圖 5
一個源程序塊注意第一行 (LINE 0) 的註釋說明了這個塊中所列出的其它字的屬性,這一行一般被稱爲索引行。多數 Forth
系統都有一個命令字來查找塊的第一行以發現哪一個塊是應用程序所須要的。
全部的 LED
經過一個位於地址 40H
的 8
位口來訪問。這個位置經過第一行的常數定義給出,因而這個口能夠經過名字來引用,而若是之後硬件地址改變了,咱們也僅僅須要調整這個常數。字 LIGHTS
在堆棧上返回這個地址,定義 LIGHT
獲得棧頂值並把它發送到設備上。這個值的屬性是位掩碼,每一位對應一個 LED
。因而命令:
255 LIGHTS
將點亮全部的燈,而命令
0 LIGHTS
將關閉全部的燈。若是硬件變化了,咱們也只須要改寫字 LIGHTS
以適應新的硬件,而應用程序的其它部分則不須要作任何改變。
行 4-6
含有對咱們終端輸入進行的處理,終端輸入是爲了可以進行簡單的診斷以確認各個方面都可以工做正常。這裏 DELAY
含有以微秒爲單位的延時時間,執行字 DELAY
返回這個變量的地址。 DELAY
的兩個值是由 FAST
和 SLOW
定義的,使用 Forth
的操做!(讀做 STORE
)從棧頂獲得地址和值,並把值存儲到相應的地址中。
定義 COUNT
運行一個從 0-255
的循環(在字 DO
和 LOOP
之間)。字 I
把循環的當前值放到棧頂,而後發送給 LIGHTS
。接着系統等待由 DELAY
指定的時間。
字 @
(讀做 FETCH
)從 DELAY
提供的地址讀取一個值,並把這個值交給 MS
等待指定的毫秒。執行 COUNT
的結果就是以指定的速率從 0
到 255
之間計數。能夠這樣調用:
SLOW COUNTS 或者 FAST COUNTS
8-10
行提供單獨命名燈的能力。在這個應用中,它們用做燈的指示器。
字 LAMP
是一個使用位掩碼做爲參數的定義字。
字 CREATE
把一個首部編譯進字典,同時字 ,
(逗號)把掩碼放到定義體中。
字 DOES>
把代碼地址放到新字的 CFA
中。因而當新字執行時,它的動做就是得到所定義的新字體中的第一個項目的內容。
行 9
和 10
使用 LAMP
來命名特別的指示燈。當其中的一個字好比 POWER
執行時,掩碼就返回到棧頂。實際上,這種行爲與 Forth
字 COSNTANT
同樣。
可是 LAMP
是一個例子,像這樣使用 CREATE
和 DOES>
定義字的能力是 Forth
語言最強大的功能之一,它容許咱們定義基於數據結構的「智能應用」。
最後,行 13-15
,咱們有了控制燈面板的字。 LAMPS
是一個變量,它包含有燈的當前狀態。字 LAMP-ON
獲得一個掩碼(由其中一個 LAMP
字提供),而後點亮燈。 LAMP-OFF
將指定的燈關閉,同時改變 LAMPS
的狀態。
在應用程序的其它地方,燈的名字和 LAMP-ON 、 LAMP-OFF 可能纔是須要直接執行的字。用法是:
POWER LAMP-ON 或 SAMPLING LAMP-OFF
在系統上編譯這個代碼塊的時間大約是半秒,包括從磁盤上讀入的時間。這樣程序員就有可能簡單地打入一個定義而後當即執行它。另外咱們老是具備與外部設備直接通訊的能力。咱們能夠首先打入:
HEX FF 40 OUTPUT
來看看是否是全部的燈都亮。若是不是,能夠假定有些地址不對,由於上面的句子是把全 1 直接發送給設備。這種類型的交互在與硬件打交道的時候特別有用,它們可以縮短硬件的開發時間。
因爲 Forth
是可擴展的,大量的開發商爲 Forth
語言的應用提供許多擴展產品。這些擴展包括自動化的文檔、終端驅動、磁盤文件管理、數據庫管理、目標編譯器、交叉編譯器和 META
編譯器。
一個目標編譯器容許咱們使用一個主機 CPU
好比 PC
機來編寫系統程序。程序能夠經過鍵盤編輯和交互式地測試,以後能夠把這些程序編譯到目標環境中併產生對應的 ROM
代碼。目標編譯器的一個功能就是剔除目標系統中不須要的代碼,好比編輯器、編譯器和彙編器。經過這些工做,運行系統的 ROM
開銷能夠從開發系統所佔用的 8K
字節減小到大約 600
個字節。
交叉編譯器與目標編譯器相似,它容許用戶在主機上開發和測試代碼,而後交叉編譯器將像目標編譯器同樣編譯 Forth
系統,只是交叉編譯器是使用不一樣的機器語言、爲不一樣的目標 CPU
產生代碼。這個特色容許快速地爲新的 CPU
開發新的 Forth
系統,因爲 Forth
系統主要是用 Forth
語言編寫的,因此咱們只須要爲新的處理器編寫一個彙編器,而後爲新的處理器進行 Forth
系統的交叉編譯就能夠了。大多數的 Forth
系統就是用這種方式開發的,結果, Forth
一般成爲一個新處理器上的首選語言之一。
寫一個 Forth
編譯器的過程也被稱爲 META 編譯。
多任務在 Forth
中從一開始時就有了。這些系統不只僅是語言處理器,並且包含操做系統的特色,許多集成系統徹底是獨立運行的,執行全部操做系統的功能。
Forth
的操做環境運行速度快,因此基於 Forth
的系統就可以支持多用戶和多任務,甚至在那些看似不能實現這些功能的計算機硬件上也是這樣。例如,一個電話交換板的生產商在一個 Z80
上執行 50
個任務。在 IBM PC
上也有幾個多任務產品,有些甚至可以支持多用戶。在通常支持多用戶操做的計算機上,能夠支持的用戶數就更多了,一個運行在單個 MC68000
處理器上的數據庫應用系統可以支持 100
個終端更新和數據庫請示,而運行速度卻沒有明顯的下降。
多用戶系統能夠支持多個程序員同時工做,每一個程序員都有本身的私有字典、堆棧和一系列變量來控制任務。私有字典鏈接到一個共享的、可再入的、包含所有標準 Forth
功能的字典。私有字典能夠用來開發應用程序代碼,這些代碼之後能夠加入到共享字典中。
圖 6
給出了 Forth
系統實現多任務的典型方法。這是一個「輪循調度算法
」 調度器,是 Forth
系統中實現多任務最經常使用的方法。然而,有一些實現使用時間片調度或者基於優先級的調度以及其它可剝奪的算法,在這樣的系統中每一個任務都有本身的用戶區以保存控制變量、私有字典和堆棧。用戶區的第一個字段是 STATUS
變量。這個變量有兩個可能的值:喚醒或者休眠。
圖 6
在循環調度隊列中的 4 個任務能夠被選擇調度執行的任務必須處於喚醒狀態。當任務被選擇執行時它的狀態就被複位到休眠狀態。任務一直執行直到調度器執行到字 PAUSE
,這將把任務的狀態置爲喚醒,控制從新返回到調度器。當調度器再次輪循到這個任務時,將從 PAUSE
的指令以後繼續執行。
除了 PAUSE
字以外,任務也能夠執行 STOP
字將控制返回到調度器。這與 PAUSE
相似,可是任務的狀態並不切換到喚醒狀態。這樣,當調度器再次輪循到這個任務時,當前的狀態仍然是休眠。這意味着這個任務不能再被執行了,除非它的狀態被另外的任務或者中斷設置爲喚醒。
系統以這種方式編程並容許中斷。當一箇中斷髮生時,一些與機器有關的代碼將指定的任務狀態置爲喚醒,這樣當調度器再次到達這些任務時它們將被執行。當任務執行時, STATUS
變量被置爲休眠,這就容許一個任務執行時能夠發生中斷。所以,若是一個任務執行了 STOP
指令而它的狀態沒有改變,在它執行中一箇中斷設置了它的狀態爲喚醒,它就能夠再次被調度,因而咱們可以緩衝一箇中斷。然而,這也就意味着當一個任務主動放棄處理器並但願下一次調度繼續執行時,它必須把狀態設爲喚醒。
輪循調度器使用存儲在 LINK
用戶變量中的地址做爲下一個任務的地址。若是這個任務的 STATUS
是喚醒的,該任務將被調度執行,不然,調度器取出它的 LINK
地址轉到下一個任務。
這種方法有兩個主要問題:
經過當心地使用 PAUSE
,再加上 Forth
的運行速度很快,已經在主要的應用系統中克服了這些問題。
Forth
硬件早在 1980
年,ROCKWELL
公司就生產了65F11
處理器,這是一個6502
處理器的變型,它在6502
芯片的 ROM
中固化了 Forth
原語,這個芯片被成功地應用到了許多嵌入式系統中。
1981
年, Chuck Moore
開始設計一個 Forth
虛擬機芯片。這個工做首先在 Forth,INC.
進行,後來專門成立了一家公司來開發這個芯片。 1984
完成設計, 1985
年生產了第一個樣片。
後來,HARRIS(INTERSIL)
,Johns Hopkins University
和其它人也開發 Forth
硬件。基於 Forth
的芯片提供了極高的性能,通常可與 RSIC
芯片相比,可是它沒有傳統 RISC
的程序設計複雜性。
Forth
界認識到須要一個標準,使得應用和擴展都以此爲基礎。第一個這樣的標準從上個世紀 70
年代中期 FIG
(Forth
興趣組織 ) 開始,這個標準後來變成了 FIG-Forth
標準。
第一個主要的 Forth
標準來自於 1977
年在 Utrecht
召開的一次會議,與會者提出了一個原始的標準並贊成之後繼續舉行會議討論, 1978
年的會議包括了 FIG
成員,通過一系列由用戶和開發商參加的會議,產生了一個更加普遍的標準,稱爲 Forth-79
.
儘管 Forth-79
標準的影響力是巨大的,可是許多 Forth
用戶和開發商發現這個標準中有一些致命缺點。 1983
年,兩次進一步的會議產生了 Forth-83
標準。
受到 Forth-83
標準被普遍接受的鼓舞,一組用戶和開發商從 1986
開始討論美國國家標準的可行性。美國國家標準 Forth
技術委員會,也稱爲 ANS ASC X3/X3J14
委員會,於 1987
年召開了第一次會議,目標是「達到一個可接受的標準,被 Forth
產品主要開發商接受,對現有在用產品的不利影響最小」。
1994
年,也就是大約 7
年以後,新的標準最終產生了,這是全部標準中走得最遠的。使用來自 5
個國家的說明,經過開發商向社會公開。兩年以後,國際標準化組織接受這個標準爲國際標準。
因爲人們使用 Forth
進行工做並不斷作出有益的擴展,因此 Forth
語言也在不斷地發展。有三個年會關注着 Forth
語言的發展:
Forth
Modification Laboratory (FORML)
held at Mt. View in California and organised by the Forth
Interest Group.
Rochester Forth
Conference (RFC)
held at the University of Rochester in New York and organised by the Institute for Applied Forth
Research Inc.
European Forth
Conference (euroForth
)
held in a different location each year. This is the only conference to provide a refereed (peer reviewed) section. Originally organised by the European Forth
Interest Group, but now organised by various European based Forth
vendors.
對於 Forth
的許多新的思想最早在這些 Forth
相關的雜誌上出現:
Forth
Dimensions (ISSN 0884-0822)
published six times a year by the Forth
Interest Group for its members.
Journal of Forth
Application and Research (ISSN 0738-2022)
published irregularly by the Institute for Applied Forth
Research Inc. This is the only peer review (refereed) journal directed to the Forth
language. The Journal is now published electronically on the Internet. A paper version of the Journal will be published at irregular intervals.
FROTH
能夠被當作是有兩個堆棧(參數棧和返回棧)的、有可擴展彙編語言的處理器。 Forth
解釋器能夠當作是這個抽象處理器的徹底宏彙編器和徹底集成的操做系統。
這就給咱們提供了一個交互式的調試環境,使咱們能夠增長新的宏(高級定義)和新的指令(低級 CODE
定義)。它甚至容許咱們經過定義新的數據類型(使用定義字 CREATE/DOES>
)擴展宏系統自己。由於這個解釋器也是一個全功能的操做系統,因此程序員只須要學習一種工具。
Forth
有四個直接的優勢:親善、直接、可擴展和經濟。它還有兩個間接的優勢:可理解和符號化。
Forth
不只僅是一種語言,它更是一種解決問題的哲學思想。這能夠用縮寫 K.I.S.S
來歸納( Keep It Simple and Stupid
,保持它的簡潔和易用)。咱們能夠引用 Jerry Boutelle
(owner of Nautilus Systems in Santa Cruz, California
) 的話,當被問及「使用 Forth
是怎麼影響你的思惟」時,他回答:
「Forth
以許多方式改變了個人思惟。從學習 Forth
開始,我已經使用了各類語言編程,包括彙編、 BASIC
、 FORTRAN
。我發現我一直在使用 Forth
的問題分解方式,經過建立字的方式把它們組合在一塊兒。例如,在處理字符串的時候,我會像 Forth
的 CMOVE
、 -TRAILING
、 FILL
那樣來定義子程序。更基本地, Forth
堅決了我對簡單性的信念。在面對一個問題的時候,許多人使用特別複雜的工具,可是簡單的工具也可使用並且更有用。我試着簡化我生活的方方面面。」
這裏我引用中國哲學家老子的一句話:
「爲學日益,爲道日損」
或者引用 Antoine Lavoisier
(1789) 的話:
「把科學和語言分離是不可能的,由於每一項天然科學老是包含三件事情:科學所基於的一系列現象,在頭腦中命名這些現象的抽象概念,表達這些概念的詞彙。爲了說明一個概念,咱們須要一個詞彙;爲了描繪一個現象,咱們須要一個概念。全部這三件事情都反映了同一個現實。」
這就是包含在 Forth
語言背後的哲學。
International Standards Organisation (1997).
Information technology - Programming languages - Forth
(First ed.), ISO/IEC 15145:1997
American National Standards Institute (1994).
American National Standard for information systems: programming languages: Forth
. ANSI/X3.215-1994.
IEEE 1275 Technical Committee (1994).
IEEE Standard 1275-1994 - Standard for Boot (Initialization Configuration) Firmware: Core Requirements and Practices. IEEE.
C. L. Stephens and R. M. Rodriguez (1986).
PolyForth
: An electronics engineer's programming tool. Software Engineering Journal, 1:154-158.
Leo Brodie (1984).
Thinking Forth
. Prentice Hall International.
Leo Brodie (1982).
Starting Forth
. Prentice Hall International, second edition.
Charles Moore (1980).
The evolution of Forth
. Byte, 5(8):76-84.
Charles Moore (1974).
Forth
: A new way to program a mini-computer. Astronomy & Astrophsics Supplement, 15:497-511.
Jan Lukasiewicz (1963).
Elements of Mathematical Logic, volume 31 of International Series of Monographs in Pure and Applied Mathematics. Pergamon Press Ltd., Headington Hill Hall, Oxford, England, second edition, 1963. First published in 1929.
The Forth
Monitor
The Forth
Monitor, the default mode in OpenBoot, is an interactive command interpreter that gives you access to an extensive set of functions for hardware and software diagnosis. You'll also see the Forth
Monitor referred to as new command mode. These functions are available to anyone who has access to the system console.