Forth-早期歲月
Chuck Moore
chipchuck@colorforth.com
1991
摘要
Forth是個簡單、自然的程式語言,它之所以能達到如此卓越的接受度,多半要歸功其有價值的整體效率。它於1960年代開始發展,歷經了大學、業界到實驗室的旅程。以下是個敘述從簡單解譯器如何慢慢擴展它的能耐而成為一個完整程式語言及作業系統的故事。
前進1999
這篇文章是為HOPL II(程式語言的歷史)會議所寫,不過它立刻被退回,很明顯的是因為寫作的風格吧。最後大部分的內容則收錄在一般人可接受的文章中[Rather 1993]。
這個HTML的版本是由原來的手稿重新編排,在文字上有做了些許的變動,校閱人Phil Koopman建議加入原始碼的例子,在這之前還沒有哩。
內容
Forth
麻省理工學院,史密森尼亞天文物理觀測台,1958
史丹佛大學,史丹佛線性加速中心,1961
自由程式員,1965
摩哈斯科,1968
國家無線天文台, 1971
道德論
Forth
Forth發展於60年代的這個十年,橫越了整個美國、在大學、商業界及實驗室之中、在已確立的語言之中。在這段期間,我是它唯一的程式員,一直到後來它才有個名字。這段記述是由我記憶中回憶,只能靠著稀少的文獻及倖存的列表來做些提示。
Forth幾乎不是原創,但它真是個獨特的組合,我由衷感謝那些允許我去開發它的人們及組織---雖然他們常不為人知,還有您,那麼有興趣想知道關於它的一切。
Forth是個簡單、自然的電腦語言,今日它已是個被接受的世界級程式語言,它不是靠著業界、大學或政府的支持而達到這個目標,實在要歸功於它的效率、可靠度及多樣化。當Forth的效率性比其他語言的流行度還重要時,它便是被選擇的語言,在現實世界中像是控制或通訊的應用,更常有這種情形。
許多Forth的組織和很多的小型公司有提供系統、應用及文件,在北美、歐洲及亞洲都有舉行年度的研討會,ANSI標準的草案也將在近期發出[ANS 1991]。
沒有一本有關Forth的書可以完全的捕捉它的韻味,我想最好的仍然是最早的那一本由Leo Brodie所寫的Starting Forth[Brodie 1981],另一窗口便是JFAR所提供的那無價的主題與作者索引[Martin 1987]。
我們要討論的典型Forth,它提供最少量的支援給程式員,而程式員則需要去發展最適於他的應用的一個語言,它被設計用於工作站環境:有鍵盤、顯示器、電腦和磁碟機。
Forth是個以文字為基礎的語言,基本上是與上下文無關的(Context-Free),它結合由空格所區隔的”字”來建構了新字,大約由150個這樣的字來組成一個系統來提供(已引入的時間排列):
| 史密森尼亞天文物理觀測台 | 1958 | 解譯器 |
| 史丹佛線性加速中心 | 1961 | 數據堆疊 |
| 即時系統公司 | 1966 |
鍵盤輸入 顯示輸出,OK 編輯器 |
| 摩哈斯科 | 1968 |
編譯器 返回堆疊 字典 虛擬記憶體(磁碟) 多程式員 |
| 國家無線天文台 | 1971 |
線鎖碼 固點算術 |
這樣的系統由10到20頁的原始碼編譯成3到8K位元組的執行碼,它可以容易地由一程式員單獨在一小電腦上實現。
這段記述無可避免地要循著我的經歷來寫,但它的用意是當成Forth的自傳。我將討論上面所列的特徵;還有與這些特徵有關的字的名稱,許多字的意義是很明顯的,某些會賦予描述,另外有些則超出本文章的範圍。
Forth字典中那些將被引述的部分總結於下:
解譯器
WORD NUMBER INTERPRET ABORT
HASH FIND ' FORGET
BASE OCTAL DECIMAL HEX
LOAD EXIT EXECUTE (
終端機
KEY EXPECT
EMIT CR SPACE SPACES DIGIT TYPE DUMP
數據堆疊
DUP DROP SWAP OVER
+ - * / MOD NEGATE
ABS MAX MIN
AND OR XOR NOT
0< 0= =
@ ! +! C@ C!
SQRT SIN.COS ATAN EXP LOG
返回堆疊
: ; PUSH POP I
磁碟
BLOCK UPDATE FLUSH BUFFER PREV OLDEST
編譯器
CREATE ALLOT , SMUDGE
VARIABLE CONSTANT
[ ] LITERAL ." COMPILE
BEGIN UNTIL AGAIN WHILE REPEAT
DO LOOP +LOOP IF ELSE THEN
麻省理工學院,史密森尼亞天文物理觀測台,1958
1957年十月是最令人激動的史普尼克事件,我是麻省理工學院的二年級生,並在哈佛大學的史密森尼亞天文物理觀測台得到一個14節的兼差工作。
史密森尼亞天文物理觀測台的負責人造衛星的光學追蹤網路:一是觀月視覺觀察網路及Baker-Nunn追蹤攝影機網路,由於史普尼克的趁虛而入,他們請了大學生以佛萊登桌上型計算機來計算預測值,John Gaustad告訴我有關麻省理工學院的IBM EDPM 704電腦的事情,並且借我他的Fortran手冊,在我的第一個程式,軌道4號,完成後結束了我的工作[Moore 1958]。
我現在是個跟George Veis一起工作的程式員,應用他的最小平方湊配(Fitting)方法來決定軌道參數、觀測站位置及到最後是地球外型[Veis 1960],當然,這個兼差工作最少是40個小時,所以我的學業便墬入了地獄。
在麻省理工學院,John McCarthy告訴我一個難以置信的LISP語言課程,這是我第一次接觸到遞迴及令人驚歎的多種電腦語言,Wil Baden曾注解說LISP是Lambda微積分而Forth是Lukasewcleicz後置。
APL當時也是個話題語言,由於它怪異的由右而左剖析法,雖然我佩服並且模仿它的運作,但我不能認同它們是一組最佳的集合。
在50年代的程式設計環境比現在都還嚴謹,我的原始碼填滿了兩個紙夾的打洞卡,當它們要放入機器時必須要提著,這事常常是我做的,編譯動作花了30分鐘(就如同C一樣),但每天平均一個人的執行的電腦時間是有限的,除非有第三班。
所以我寫了這個簡單的解譯器來讀取輸入卡並且控制程式,它也可直接做計算,5個軌道參數每個都有一個經驗等式來計算大氣拖延及非球形的地球,就這樣我可以將用於許多人造衛星的不同等式做結合,而不用再重新編譯。
因為這些等式將像是P2(二階多項式)和S(正弦)的項次總和,而36位元的浮點數主宰了計算時間,所以負擔很小,數據堆疊並不需要,而且我可能也不知道。
由這裡開始的Forth解譯器有這些字
WORD NUMBER INTERPRET ABORT
它們以前並不是以這種拼法,而是陳述數字。
INTERPRET使用WORD來讀取以空白分隔的字,而NUMBER用來轉換字串成為二進位數字(在這個例子中是指符點數),這樣的自由格式的輸入並不普通,但是更有效率(更小且更快)和可靠,Fortran輸入則是格式化成特定的欄位,常常由於過多的延遲而有印刷上的錯誤。
這個解譯器以Fortran來編碼,使用IF …ELSE IF的結構來找出符合的單字元,錯誤處理便是結束執行,然後就跟現在一樣,ABORT要求使用者做些事情,由於輸入卡以它們被讀取順序來排列,所以您可以知道哪裡出錯了。
史丹佛大學,史丹佛線性加速中心,1961
1961年我到史丹佛大學研究數學,雖然史丹佛有設立自己的電腦科學系,然而我有興趣的是真正的計算,我很驚訝他們能去(無懼乎?)寫自己的Algol編譯器,而我像是命運注定般邂遘了Burroughs B5500電腦。
我在SLAC(史丹佛線性加速中心,12節)得到另一個”兼差”的工作,負責寫程式來最佳化延遲2哩的電子加速器的光束前進,這個是我的最小平方經驗到相位空間的一個自然應用,Hal Butler是我們團隊的主事者,而TRANSPORT程式十分成功。
另一個最小平方的應用是CURVE程式,它以Algol(1964年)來編寫,它是個一般用途的非線性差分修正資料湊配程式,它精密的統計提供模型與資料間一致性所需的洞察。
資料格式和模型等式被解譯,而一個下推的堆疊被用來方便估算,CURVE程式是個令人印象深刻的Forth先驅,它引入了下面這些字來提供功能來湊配模型,讓它比簡單的等式更精巧。
+ - * NEGATE
IF ELSE THEN <
DUP DROP SWAP
: ; VARIABLE ! (
SIN ATAN EXP LOG
拼法可能十分不同:
NEGATE 是 MINUS
DROP ;
SWAP .
! <
VARIABLE DECLARE
; END
( ...) COMMENT ...;
解譯器使用IF…ELSE IF來驗證叫做ATOM(由LISP而來)的6個字元的輸入字。DUP、DROP和SWAP是5500的指令;我很驚訝拼法的改變,”:”字取自Algol的標記格式,為了由左而右的剖析而翻過來(以便防止解譯器遇到一個未定義的字)。
Algol - LABEL:
CURVE - : LABEL
事實上,”:”在輸入字串中標註了稍後要解譯的位置,解譯工作到”;”而停止,另一個”:”的版本名叫做DEFINE。
儲存操作子(!)出現與VARIABLE有關,但擷取(@)是自動的,請注意輸入已變得複雜到足夠去賦予註解,時常令人詬病的後置法條件式就由這時開始:
Algol - IF expression THEN true ELSE false
CURVE - stack IF true ELSE false THEN
假如堆疊中非零則解譯為真值,THEN提供很獨特的結束,我常對Algol中沒有用它而感到困惑。這樣的表示式解釋為:IF將向前掃描ELSE或THEN。
字”<”引入了關係操作子將留下了1代表真而0代表假的真值在堆疊上的習慣用法。當然囉,超越方程是程式庫呼叫。
自由程式員
我在1965年離開史丹佛大學成為一個在紐約城地區的自由程式員,還好這很平常,而我找了使用Fortran、Algol、Jovial、PL/I及多種組合語言來寫程式的工作,我四處反覆的帶著我的一堆卡片,並且在必要時重新編寫。
迷你電腦那時出現了,並且也有了終端機,解譯器用於電傳輸入很理想,不久又包含處理輸出的程式碼,所以我們得到了下列這些字:
KEY EXPECT
EMIT CR SPACE SPACES DIGIT TYPE
EXPECT是個呼叫KEY來讀入敲鍵的迴圈,TYPE是個呼叫EMIT來顯示字元的迴圈。
隨著TTY而來的是紙帶和某些最不人性化的軟體編輯、打洞、裝載、組合、列印、裝載、測試及反覆等不能想像的時光,我記得一個在曼哈頓摩天樓上最慘的星期天,當時我找不到連結膠帶(不能做其他事)而咒罵”一定有更好的方法”。
我為即時系統公司(RSI)的Bob Davis做了相當多的工作,我變成5500大型電腦的指導員來支援他的分時服務(大型主機的遠端輸入),並且寫了一個Fortran到Algol轉譯器和檔案編輯工具,這轉譯器敎了我字之間空格的價值,而Fortran並不需要。
解譯器仍然接受字前面有意義的6個字元(5500有48位元字組),下面的字:
LIST EDIT BEGIN AGAIN EXIT
出現了,其中BEGIN…AGAIN要拼成START…REPEAT,而且用來包著編輯器命令。
T TYPE I INSERT D DELETE F FIND
稍後用於國家無線天文台的編輯器,字FIELD使用摩哈斯科和Forth公司的資料庫管理方法。
Forth獨特的特徵之一從這裡而來,這規則是當解譯器完成時,Forth以隨後加個OK來回應每個輸入行,對於在輸入是以換行結尾,必須回應空白和包含換行的OK時可能有困難。在即時系統公司,OK是在下一行,但它仍然在令人感到威脅的通訊線上友善地傳遞信心給使用者。
56 INSERT ALGOL IS VERY ADAPTABLE
OK
這個後置記號提出了數據堆疊,但它必須只能有一層深。
摩哈斯科,1968
1968年我轉業成在紐約新阿姆斯特丹的摩哈斯科工業公司的商業程式員,他們是主要的家飾公司---地毯和家俱。我已與在RSI的Geoff Leach一起工作,而他也說服我跟隨他去市區,我剛結婚,而新阿姆斯特丹有一可愛的小鎮氣氛對比於紐約城。
我以COBOL重寫我的程式碼,並且學得了商業軟體的真意,Bob Rayco是公司資料處理的主事者,他指派了兩個相關的專案給我:
他租了有2250圖形顯示器的IBM 1130迷你電腦,目的是去觀察電腦繪圖可否幫助圖樣地毯的設計,答案是”沒有彩色”,所以1130搬走了。
在此同時,我有了最新的迷你電腦環境:16位元CPU、8K RAM、磁碟機(我的第一部)、鍵盤、列表機、讀/打卡機、Fortran編譯器,其中讀/打卡用來提供磁碟的備份,我又再度移植了我的解譯器(回到Fortran),並且加入了交叉組譯器來產生2250用的程式碼到。
系統十分的成功,它能畫出動畫式的3-D圖樣,當時IBM只能畫靜態的2-D,由於這是我第一個即時的繪圖,我編寫了太空戰爭,那是第一個電視遊戲,我也轉換我的Algol西洋棋程式成Forth,並且深深的驚訝於為何它變得比較簡單。
內含這個解譯器的檔案標注為FORTH,表示是第四(下一)代軟體,但作業系統限制檔名只能有五個字元。
這個環境讓2250的程式規劃比Fortran環境遠遠快了許多,所以我延伸了2250的交叉組譯器成為1130的編譯器,這舉動引入了許多的字:
DO LOOP UNTIL
BLOCK LOAD UPDATE FLUSH
BASE CONTEXT STATE INTERPRET DUMP
CREATE CODE ;CODE CONSTANT SMUDGE
@ OVER AND OR NOT 0= 0<
它們仍然有不同的拼法
LOOP 是 CONTINUE
UNTIL END
BLOCK GET
LOAD READ
TYPE SEND
INTERPRET QUERY
CREATE ENTER
CODE the cent symbol
這是迄今我找到美分符號的使用。迴圈索引和限制放於數據堆疊中,DO和CONTINUE用來回應Fortran。
BLOCK管理了許多緩衝區來減少磁碟的存取。LOAD由1024位元組區塊中讀取原始碼,1024的選用是因它是一個好的磁碟模數量,並且證實是個好選擇。UPDATE允許區塊被標記然後當它的緩衝區需要時(或用FLUSH)再寫入磁碟中,它實現了虛擬記憶,並且隱藏於儲存(!)字當中。
BASE允許八進位、十六進位和十進位數字。CONTEXT是字典使用的第一個暗示,用來隔離編輯器字。STATE由區分編譯及解譯。在編譯當中,字的字數及前三個字元被編入以便用於稍後的解譯,奇怪的是,字可以用一個特殊字元來結束,不過畸型用法很快的就被遺棄了。擷取操作子(@)已很多種面貌出現,因為由變數、陣列和磁碟而來是要區分的。而為了檢視記憶體,DUMP變的重要。
但是最重要的,現在有了字典了,解譯程式碼現在有個名字和可由鏈結列中尋找相符的字。CREATE建構了典型的字典項目:
link to previous entry
count and 3 characters
code to be executed
parameters
碼欄是最重要的創新,因為一旦字被找到後,間接跳躍是唯一的負擔。計數值用於區分不同的字,這是我於史丹佛大學的編譯器編寫者那學到的。
有一類重要的字以CODE來顯現,機器指令跟隨在參數欄後,所以任何有內在電腦能力的字,現在都能被定義。;CODE指定某一新類的字要執行的程式碼,並且引入了現在稱為物件的東西。
SMUDGE防止定義於解譯過程中的遞迴,由於字典由最新向最老定義來搜尋,遞迴正常來說將會發生。
最後,返回堆疊出現了,從此之後,定義不必被巢狀了,或使用數據堆疊記錄它們的返回位址,總而言之,這是Forth跳躍式發展的大創新時期。
第一個Forth的論文,一個摩哈斯科內部文件,由Geoff和我所寫[Moore 1970],現在看來,它還不落伍。
1970年Bod訂購了Univac 1108電腦,有個野心勃勃的計劃來支助訂購登記系統租賃線的網路,我已經用Forth寫了報告產生器,並且有信心我能編寫訂購登記,我移植Forth到5500(獨自的!)來加入可信度,但是公司的軟體是COBOL,不可思議的折衷是安裝Forth系統在1108上來與COBOL模組介面,以便做交易處理。
我鮮明地回憶那個冬天通勤到斯卡奈塔第去租用1107的第三班時間,我的TR4-A由於沒有車頂和車窗,所以這變成每天夜裡的生存訓練,但是系統卻非常的成功,即使Univac令人印象深刻的是它效率(Les Sharp是計畫聯絡人)。雖然最終的評估是反應時間,但我還可決定保持它的可維護性(小巧且簡單)。可惜,財務的不振讓管理階層取消了1108,我仍然覺它是個誤判,所以我第一個辭職。
1108 Forth必須以組合語言來寫程式,它緩衝了輸入及輸出訊息並且分享CPU的時間給處理每一線的任務,就像你的典型作業系統。不過它也解譯輸入並且執行合適的COBOL模組,它維持鼓狀緩衝區並且包裝/卸包紀錄,這些字
BUFFER PREV OLDEST
TASK ACTIVATE GET RELEASE
從這裡開始有紀錄。BUFFER當想要的區塊被知道是空的時會防止磁碟的讀取。PREV(前一個)和OLDEST是系統的變數用來實做近新使用緩衝區的管理。TASK定義啟動時期的一個任務並且於需要時主動的(ACTIVATE)啟動。GET和RELEASE管理分享的資源(鼓、印表機)。PAUSE是關於如何使任務讓出CPU的控制權,它包含在所有的I/O運作之中並且對交易程式碼而言是隱藏的,它允許一簡單的雛菊環時程演算法不致於鎖死。
在被了通知之後,我寫了一生氣的詩及一本從未發表過的書,它說明如何發展Forth軟體及鼓勵簡單及創新,它也說明間接線鎖碼,但第一次實作卻是在國家無線電天文台。
我曾掙扎過元語言的概念,元語言是說明語言的語言,Forth現在可以解譯組合語言,組合語言又可以組成編譯器,編譯器又可以編譯解譯器。最後我決定這個術語並無任何用處,但仍然使用重新編譯Forth的術語Meta-compile。
國家無線天文台, 1971
George Conant供給我一個在國家無線電天文台的職位(15節),我是在史密森尼亞天文物理觀測台時結識他的,而且他也喜愛軌道四號,所以我們移至維吉尼亞州的薜倫斯維爾,並且花了幾個夏天在亞利桑那州的土桑當基特峰望遠鏡進行維修時。
這計劃將對Honeywell 316迷你電腦寫個控制程式來用於36毫米望遠鏡的新型過濾器,它有9軌的磁帶和Tektronix的儲存管終端器。George給我自由發揮來發展這個系統,雖然他不滿意結果。國家無線天文台是個使用Fortran的研究單位,而現在我已稱呼Forth為另一個語言,他對於那組織必須標準在單一語言是正確的,因為現在其他的程式員想要用他們自己的語言。
無論如何,我已經在IBM 360/50大型電腦以組合語言編寫Forth,然後我交叉編譯它到316上,接著我於316上重新編譯它(雖然我已有個終端器於360上,但受不了它的反應時間)。一旦系統可用後,應用是非常容易的。有兩個監看的模式,連續與光譜線,光譜線最好玩,當資料被收集後並且以最小平方湊配合成線形後,我可以顯示出光譜[Moore 1973]。
系統在吐桑被完全接收,在那裡是Ned Conklin主其事,它在線上資料簡化上的最新技術上的確有進步,天文學家使用它來發現並校對當時變成熱門研究題目的星際分子。
Bess Rather被雇用來提供現場的支援,她第一次學習Forth系統,並說明它也寫下文件,這對我少許的幫助。來年我重新對DDP-116寫程式來最佳化望遠鏡的定點,接下來,Bess與我以DEC PDP-11替換了116與316。
間接線鎖碼讓發展這些事情成為可能,它是我在摩哈斯科的工作的自然發展,雖然在稍後我聽到DEC使用直接線鎖碼在他們的編譯器上,不過與其重新解譯定義的文字,不如編入每個字典項目的地址,這樣可以增強效率,因為對於每個參考只需要兩個位元組,而且位址解譯器可以及快速地順序通過一個定義,事實上,這個位址解譯器在11上只是個2個字組的巨集。
: NEXT IP )+ W MOV W )+ ) JMP ;
現在Forth已經完整了,而且我熟知它,我可以更快地寫程式碼,而且更有效率和可靠,更甚者,它可以移植,我著手重新對用於300呎的Green Bank望眼鏡定點的116電腦及開始用於超長基線干涉陣列天文的HP迷你電腦寫程式。George給我ModComp迷你電腦,而我做了用於干涉及脈衝搜尋(64K資料)的傅立葉轉換,我甚至在360電腦上以Forth示範比組合語言快20%的複數乘法。
國家無線電天文台很重視我所精製的東西,他們同意一個顧問公司去確認可以衍生子公司的技術,將Forth專利的議題詳細的討論,但是由於軟體專利過去常引起爭議,而且可能牽涉最高法院,國家無線電天文台拒絕被這些事情糾纏,於是,所有權轉回我手上,而我不認為創意應該被專利化,後見之明不得不承認Forth只有放置於公共領域才有機會,那裡它才能茂盛的成長。
線鎖碼改變了結構字(如DO LOOP IF THEN),它們得到了於編譯期間將位址放到數據堆疊上的優雅實施方式。
現在每個Forth對於它的獨特電腦有一個組譯器,它使用後置式的執行碼並且在數據堆疊上組合位址,用於Forth方式的分支結構字。大型電腦的助憶碼定義成;CODE之類的字,可能要花上一個下午來寫程式,舉一個例子,就如上述的NEXT巨集。
非傳統的算術運算子證明它們的價值
M* */ /MOD SQRT SIN.COS ATAN EXP LOG
M*是常用的兩個16位元數字產生32位元積的硬體乘法(當然,參數在數據堆疊),*/後面跟著除法來實作有理數算數,/MOD回傳商及餘,對於檔案中的紀錄的尋位很有用,SQRT由32位元參數產生16位元的結果,SIN.COS傳回正弦與餘弦,對於向量及複數算術(FFT)很有用,ATAN是它的反函數,對於象限不會摸稜兩可,EXP和LOG是以2為基數的。
這些使用固點算術---二進位小數點後14或30位元用於三角,10位元用於對數,由於較簡單、較快且比浮點數還正確,所以這變成Forth的一特色。但是硬體與軟體浮點比較容易實現。
我喜歡稱讚Hart在將函數以不同精確度作逼近的表格作業上的無價成就[Hart 1978],它們提供我們這些努力奮戰的人從已有程式庫限制中取得自由。
字DOES>的出現(拼成;:)定義了某類的字(像是;CODE),藉此指定當這類字被參考到時要解譯的定義,這個發明非常投機巧妙,但對於定義運作碼非常有用。
儘管如此,我不能說服薜倫斯維爾Forth非常合適,我不能繼續被允許對巨大陣列天線寫程式,任何團隊裡,25%喜歡Forth,而25%討厭它,爭執常會變的強烈而妥協微乎其微,所以同好們齊心同力成立了Forth公司,而那是另一段故事。
道德論
Forth的故事常是道德劇製造者:堅持原則的年輕程式員努力搏鬥著別人的不重視而發現真理,最後解救了他的受難的同伴,不過這可以更好的:看看Forth公司在法國銀行系統上與IBM的齊頭並進。
我知道Forth到現在為止是最好的語言,我很高興它的成功,特別是在極度保守的人工智慧領域,我常憂慮人們應該卻不能評價如何具體化他們自己對於理想程式語言的說明。
但是我仍然無拘無束的探索,Forth已導向一個可以美妙的整合軟體與矽晶的架構,及另一個新的程式開發環境。
參考資料
[ANS 1991] Draft Proposed ANS Forth, document number X3.215-199x, available from Global Engineering Documents, 2805 McGaw Ave., Irvine CA 92714.
[Brodie, 1981] Brodie, Leo, Starting FORTH, Englewood Cliffs NJ: Prentice-Hall, 1981, ISBN 0 13 842930 8.
[Hart, 1968] Hart, John F. et al, Computer Approximations. Malabar FL: Krieger, 1968; (Second Edition), 1978, ISBN 0 88275 642 7.
[Martin, 1987] Martin, Thea, A Bibliography of Forth References, 3rd Ed, Rochester NY: Institute for Applied Forth Research, 1987, ISBN 0 914593 07 2.
[Moore, 1958] Moore, Charles H. and Lautman, Don A., Predictions for photographic tracking stations - APO Ephemeris 4, in SAO Special Report No. 11, Schilling G. F., Ed., Cambridge MA: Smithsonian Astrophysical Observatory, 1958 March.
[Moore, 1970] --- and Leach, Geoffrey C., FORTH - A Language for Interactive Computing, Amsterdam NY: Mohasco Industries, Inc. (internal pub.) 1970.
[Moore, 1972] --- and Rather, Elizabeth D., The FORTH program for spectral line observing on NRAO's 36 ft telescope, Astronomy & Astrophysics Supplement Series, Vol. 15, No. 3, 1974 June, Proceedings of the Symposium on the Collection and Analysis of Astrophysical Data, Charlottesville VA, 1972 Nov. 13-15.
[Moore, 1980] ---, The evolution of FORTH, an unusual language, Byte, 5:8, 1980 August.
[Rather, 1993] Rather, Elizabeth D., Colburn, Donald R. and Moore, Charles H., The Evolution of Forth, in History of Programming Languages-II, Bergin T. J. and Gibson, R. G., Ed., New York NY: Addison-Wesley, 1996, ISBN 0-201-89502-1.
[Veis, 1960] Veis, George and Moore, C. H., SAO differential orbit improvement program, in Tracking Programs and Orbit Determination Seminar Proceedings, Pasadena CA: JPL, 1960 February 23-26.
2005.01.25譯 版本V1.0