Forth 常见问题解答
Forth 常見問題解答本文譯自 comp.lang.forth Frequently Asked Questions (1/6): General/Misc 原文整理 M. Anton Ertl, anton@mips.complang.tuwien.ac.at Forth 是什么? Forth 是怎么來的? Forth 用在什么地方?為什么要使用 Forth? Forth 過時了嗎? Forth 比 C 語言還要小、還要快嗎? Forth 有哪些標準? 什么是 RFI ? Forth 有編碼規范嗎? 我在管理堆棧時遇到了麻煩,是不是應該使用全局變量? 什么是 Forth 興趣組織? Chuck Moore 是誰?他現在做什么? 哪些觀點是口水大戰? 商業化的還是自由軟件的 Forth 系統? 自由軟件的 Forth 是很差的 Forth ? 塊還是文件? 我從哪里能夠找到 C-to-Forth 編譯器 ? 從哪里可以找到 Forth-to-C 編譯器 ? Forth 中有記錄類型嗎? 為什么使用 THEN 來結束一個 IF 結構 ? 什么是串線編碼?不同的串線編碼技術之間有什么差異? 有沒有人寫過把 Forth 編譯成 Java 字節碼的程序? 能夠把 JAVA 字節碼翻譯成 Forth 嗎? 沒有操作系統的 Forth 怎么運行? 為什么不用 Forth 來編寫一個操作系統呢? ? Forth 是什么?Forth 是一個基于堆棧的、可擴展的、沒有類型檢測的語言,可能最有名的是它的“逆波蘭”(后綴)算術表達法,使用過 HP 計算器的人應該對這種方法比較熟悉:在 Forth 中把兩個數相加,你需要輸入 3 5 + 而不是 3 + 5 。 在 Forth 中,基本的程序單位是“字”:字可以是一個命名的數據項、子程序或者操作符。 Forth 的編程就是用已經存在的字來定義新的字。 Forth 語句: : SQUARED DUP * ; 定義了一個新的字 SQUARED ,它的功能是對一個數求平方(通過自身相乘)。由于全部的語言結構都是由字組成的,應用程序員可以根據需要“擴展” Forth 以加入新的操作符、程序結構或者數據類型。 Forth 的“內核”包含了用于整數、地址、字符和布爾值的操作符,字符串和浮點操作可以選擇加入。 返回常見問題列表 Forth 是怎么來的?Forth 這個名字的本意是想說明這個軟件是為第四代(下一代)計算機設計的,那正是 Moore 通過分布式小型計算機所看到特色。不過,當時他使用的操作系統限制文件名只能少于 5 個字符,所以字母 'U' 就被去掉了。 直到 70 年代未期,還是使用著 FORTH 這種全部大寫的字母,因為那個時候流行著只支持大寫字母的 I/O 設備。隨著小寫 I/O 設備的普及, Forth 這種拼寫方法被廣泛接受,因為它畢竟不是幾個單詞的縮寫。 參見 Rather, Colbourn, and Moore: The Evolution of Forth <http://www.forth.com/Content/History/History1.htm>, in: History of Programming Languages (HOPL-II), ACM Press/Addison-Wesley 1996. 注意: Forth 不是 4GL (用于數據庫應用開發的語言) 返回常見問題列表 Forth 用在什么地方?為什么要使用 Forth?Forth盡管早在 1970 年就出現了,但是在個人計算機時代才變得廣為人知,它的高性能和存儲器的經濟性很有吸引力,這些優點還使得 Forth 在嵌入式系統中應用得很普遍,包括從航天飛機到聯邦快遞的條碼閱讀器驅動器。 Forth 交互式的特點使得新硬件的測試和開發流暢自如。增量式開發、快速的程序調試周期、對任何級別程序的完全交互式訪問,很高“抽象級”的工作能力,所有這些都使 Forth 擁有一個高程序生產率的好名聲。再加上語言的靈活性和可擴展性,是嵌入式系統選擇 Forth 的主要理由。 返回常見問題列表 Forth 過時了嗎?這個問題最好的答案之一來自 Brad Rodriguez(mailto:bj@forth.org) ,可以在 http://www.complang.tuwien.ac.at/forth/faq/why-forth 找到一個完整的版本。一句話, Forth 的優點是它的可理解性、短小、交互式、快速、可擴展性和很容易使它在一個高級別抽象上工作。 順便說一句,提出這個問題的人可能是把十幾年以前的 Forth 系統與最新版本的 Borland C++ 進行了比較。不過,他使用的系統實在是太過時了,雖然也具有現代 Forth 系統的許多方面。 返回常見問題列表 Forth 比 C 語言還要小、還要快嗎?不一定,如果你把一個 C 語言程序一對一地轉換成 Forth ,你會發現程序變得很慢(比如使用串線編碼的 Gforth 系統,大約慢 4-8 倍,如果使用典型的本地碼編譯器,則大約慢 1-3 倍)。同樣,你看不到 Forth 中固有的代碼大小方面的優點。詳情可參見 <http://www.complang.tuwien.ac.at/forth/performance.html>. 然而,許多開發案例都說明 Forth 在尺寸和/或速度方面勝過了其它語言。我猜想這是 Forth 所附加的靈活性幫助程序員產生了更快和/或者更小的程序。 返回常見問題列表 Forth 有哪些標準Forth 的美國國家標準是 ANSI X3.215-1994, 作為一個權威的 Forth 標準在國際上被廣泛接受 ("ANS Forth") 。 這個標準也被國際標準化組織所接受 (ISO/IEC 15145:1997). IEEE Standard 1275-1994, 稱為“開放式固件”標準,派生于 Forth ,已經被 Sun Microsystems 、 HP 、 Apple 、 IBM 等公司做為編寫引導程序和固件的公司遵循標準。參見 <http://playground.sun.com/1275/home.html>. 早先的 Forth 標準包括 Forth-83 Standard 和 Forth-79 Standard ,這些都是 Forth Standards Team 提出的,而更早的 FIG-Forth 標準沒有像這樣正式發布,但它卻是許多年里 Forth 的“事實標準”。 Forth STANDARDS 自 1978 年以來 Forth Standard Team 發布了 Forth 79 和 Forth 83 標準, ANS Forth 文檔 X3.215-1994 是 X3J14 技術委員會發布的。最近的標準 ANS Forth 定義了一系列的核心字,并給這些字的實現方式以很大的自由度。 ANS Forth 可以支持的硬件范圍比以前的任何 Forth 標準都大,可能也比任何其它程序設計語言大,參看 <ftp://ftp.uu.net/vendor/minerva/uathena.htm> 得到最新信息。標準的拷貝為 193 美元,但是 ANS Forth 草案是免費的(有一些版權的限制),可以通過 FTP 得到。 ANS Forth 文件可以從下面網站得到 <http://www.taygeta.com/forthlit.html> <ftp://ftp.uu.net/vendor/minerva/x3j14/>. 最好的 HTML 格式是 <http://www.taygeta.com/forth/dpans.html>. 為了把自己的加入到 ANS-Forth 郵件列表中,可以參考不同的 README 文件,這些文件在 ftp://ftp.uu.net/vendor/minerva/x3j14/ 上 . 有兩個非官方的網站可以檢查與 ANS Standard Forth 的一致性 : ?? John Hayes 編寫的測試站點 <http://www.taygeta.com/forth.html>. ?? JET Thomas 編寫的測試站點 <ftp://ftp.forth.org/pub/Forth/ANS/stand4th.zip> 還有 ANS Forth FAQ <http://dec.bournemouth.ac.uk/forth/ans/faq.html> ,它解釋了標準化的過程。 返回常見問題列表 什么是 RFI ?RFI 是解釋請求( A Request For Interpretation )。如果你發現標準文本中有不清楚或者不明確的地方,可以發一個 RFI ,發布標準的 TC (技術委員會)將負責給出一個解釋。 你可以通過電子郵件把請求發送到 greg@minerva.com 上,寫明郵件的主題是 RFI 。 以前的 RFI 列表可以通過 ftp://ftp.uu.net/vendor/minerva/x3j14/queries/ 得到,也集中到標準的 HTML 版本中, <http://www.taygeta.com/forth/dpans.html>. 返回常見問題列表 Forth 有編碼規范嗎?在 Leo Brodie 的書《 Thinking Forth 》中給出了一些建議;這些建議的摘錄可在 http://www.forth.org/forth_style.html 得到。 Forth 在各個公司中有一些它們自己的編碼標準。 Paul Bennet 發布了他自己公司的標準 <http://www.forth.org/forth_coding.html>. 返回常見問題列表 我在管理堆棧時遇到了麻煩,是不是應該使用全局變量?不。這里有更好的方法,那就是堅持使用堆棧,重新組織(重新因子化)所定義的字,直到有一天你找到了使用堆棧的訣竅。 Elizabeth Rather<mailto:erather@forth.com> 寫到: 舒適而自然地編寫 Forth 程序的一個基本技巧就是良好的堆棧管理。對于一個初學者來說這是有困難的,因為其它的語言對使用堆棧并沒有要求,其它的語言都通過使用變量來實現所有的事情。經過了 25 年幾百次教學,我覺得初學者對此很是茫然,所以我就開發了一些練習(就像 Starting Forth 書一樣)來幫助他們。這個過程有點兒像騎自行車:開始的時候慌慌張張而且搖搖晃晃,但是突然有一天,你頭腦中的一個開關打開了,從那以后就變得又舒適又自然了。 Andrew Haley 寫到: 試著把你的定義全部寫成只有一行、最多兩行。為每個字寫一個堆棧圖釋并畫出它的輸入和輸出。如果你還要有一個“中間的”堆棧圖釋才能夠明白做了什么的話,就在這一點上把你的字分裂成兩個。這樣,你就可以在命令行上測試字的一半,每一次都檢查堆棧。不要使用 PICK 和 ROLL. 。 當你堅持這樣編寫代碼之后,有些規則就可以放松,但是一開始必須按這樣的風格去做。 ?? 使用返回棧; ?? 使用局部變量; ?? 使用存儲器中的數據結構,在堆棧上傳遞指針; 公認的經常遇到麻煩的領域是圖形處理。我們可以看看 Postscript 是怎么做的:它們確實是使用全局狀態變量以避免麻煩,但是只能通過特定的字來訪問這些狀態。 返回常見問題列表 什么是 Forth 興趣組織?Forth 興趣組織 Forth Interest Group ( FIG )成立于 1978 年,它的目的是發布信息、普及 Forth 語言,也是 Forth 專業程序員最早機構。 Forth 興趣組織目前還維護一個網頁 http://www.forth.org/forth.html 其中有 Forth 語言更完整的介紹和許多 Forth 開發者的鏈接。 返回常見問題列表 Chuck Moore 是誰?他現在做什么?Chuck Moore 發明了 Forth 語言,有關 Forth 的歷史信息可以參看 <http://www.forth.com/Content/History/History1.htm>). 最近他用自己的哲學思想來設計硬件,并且已經設計了幾個能夠很好地運行 Forth 語言的處理器 : Novix 4016 、 Shboom 、 uP20 、 uP21 、 F21 、 i21 …… . 他還不斷地探索新的思想,更新他早先關于軟件和 Forth 的思想:他為 Novix 實現的 cmForth 非常有影響力,最近的開發成果是 Color Forth 和 Machine Forth 。 Machine Forth 是一個只有 27 條指令的簡單虛擬機,這個機器通過硬件在 uP21 和后續的處理器上實現,但是也通過軟件在 386 處理器上以簡單本地代碼的方式實現。它與 ANS Forth 的差別是:每個堆棧頂都包含一個擴展的進位 CARRY 位,有一個寄存器 A 用于存儲器訪問(替代通過棧頂元素作地址指針訪問存儲器的尋址方式)。 返回常見問題列表 哪些觀點是口水大戰?有些觀點引起了長久和熱烈的爭論,參加的雙方都在重復自己的觀點而從來都想聽別人是怎么說有,我希望你不要陷入其中。 這里我列出了一些針鋒相對的觀點,作為你閱讀的起點,這樣可以避免像他們一樣地投身到戰斗中去。 返回常見問題列表 商業化的還是自由軟件的 Forth 系統?“付出什么,你就會得到什么。使用一個商業化的 Forth 系統,你可以得到商業化的文檔和支持,我們需要一個商業化的系統,否則 Forth 就是死路一條”。 “我使用自由軟件方式的 Forth 系統有良好的經驗。我沒有錢付給商業 Forth 系統。我想要源代碼(有些商業系統不提供整個系統的源代碼),文檔和支持很差的商業軟件開發者也不乏其例。沒有自由軟件方式, Forth 就是死路一條 ” 。 返回常見問題列表 自由軟件的 Forth 是很差的 Forth ?“任何人都可以寫一個很壞的 Forth ,然后沒有文檔和支持地發布出來;使用了這樣的系統之后,沒有人再想用 Forth 做任何工作。自由的 Forth 敗壞了 Forth 的名聲,自由的 Forth 搶了開發者的生意。 ” “許多人通過 fig-Forth 學習 Forth ,確實有優秀的自由軟件 Forths 。許多成功的語言開始都(并且現在仍然)提供自由軟件版本。沒有自由軟件式的實現(就像 Ada、Eiffel 和 Miranda ),一種語言就不能普及(現在也有了自由軟件的 Ada 和 Eiffel 實現).” 返回常見問題列表 塊還是文件?“每個人都使用文件,所有的第三方工具都是使用文件來進行設計的。文件浪費的空間更少。塊導致水平的、不可讀的代碼。塊使得 Forth 很可笑?!? “我們并不總是在操作系統的支持下工作,在有些機器上我們就沒有文件。我們已經有了非常優秀的塊編輯器和其它工具以及與塊一起工作的編碼標準(比如 shadow screens )?!? 返回常見問題列表 我從哪里能夠找到 C-to-Forth 編譯器 ?Parag Patel <mailto:parag@pinhead.parag.codegen.com> 寫到 : 我們 (CodeGen, Inc. <http://www.codegen.com>) 銷售 C-to-Fcode 編譯器。它實際產生 IEEE-1275 Forth 并以 token 化方式運行。 但它產生的 Forth 代碼真的是很難看。產生不好的代碼比較容易,而產生清晰的代碼則非常困難。 C 和基于堆棧的語言不能很好地混合在一起,我最后通過使用 Forth $frame 變量用于局部變量而實現 C 語言的變量棧幀。 Stephen Pelc <mailto:sfp@mpeltd.demon.co.uk> 寫到: MPE 生產 C 語言到堆棧機器的編譯器,它為兩個堆棧的虛擬機器產生 TOKEN 化的代碼。這種代碼質量好, TOKEN 所占用的空間情況比我們測試的商業化 C 語言編譯器要好,這是虛擬機設計的結果。當然,需要的改進是虛擬機可以支持局部變量。 tokens 可以由編譯器后端進行解釋,也可以翻譯到一個 Forth 系統中去,所以大部分是可移植的,只有與目標體系結構相關的部分除外。 這個軟件是收費的,支持一個二進制兼容系統。 返回常見問題列表 從哪里可以找到 Forth-to-C 編譯器 ?一個沒有技術支持的原型 Forth-to-C 編譯器在 <http://www.complang.tuwien.ac.at/forth/forth2c.tar.gz>. 有關它的描述在 EuroForth'95 paper <http://www.complang.tuwien.ac.at/papers/ertl&maierhofer95.ps.gz>. 另一個 Forth-to-C 編譯器由 Rob Chapman編寫: <mailto:rc@compusmart.ab.ca> Timbre <http://www.compusmart.ab.ca/rc/Timbre/timbre.htm> system. 返回常見問題列表 Forth 中有記錄類型嗎?許多軟件包提供了像 Pascal 的 RECORD 和 C 的 struct 一樣的數據結構,比如 Forth Scientific Library ( <http://www.taygeta.com/fsl/fsl_structs.html>) 或者 <http://www.complang.tuwien.ac.at/forth/struct.fs>. 返回常見問題列表 為什么使用 THEN 來結束一個 IF 結構 ?一些人認為 Forth 使用 THEN 很別扭,而另一些人則不以為然。 按照 Webster's New Encyclopedic Dictionary 解釋, then (adv.) 有以下的意義: 2b: following next after in order ... 3d: as a necessary consequence (if you were there, then you saw them). Forth 的 THEN 具有 2b 的意義(接著、然后),而 Pascal 和其它程序設計語言則引用了 3d. 的意義(那么就、則)。 如果你不喜歡這樣來使用 THEN ,可以按下列方式定義一個 ENDIF 替代: : ENDIF POSTPONE THEN ; IMMEDIATE 返回常見問題列表 什么是串線編碼?不同的串線編碼技術之間有什么差異?串線編碼是實現虛擬機解釋器的一種方法,你可以從下列站點得到關于串線編碼的更深入的解釋: <http://www.complang.tuwien.ac.at/forth/threaded-code.html>. 返回常見問題列表 有沒有人寫過把 Forth 編譯成 Java 字節碼的程序?Paul Curtis <mailto:paul.curtis@ra-ltd.demon.co.uk> 寫到: 盡管 JVM 是一個堆棧機,但是并不能有效地編譯 Forth 程序,下面是一些原因: , ?? 一個調用方法的最大堆棧深度必須是已知的,見 JVM Spec, p. 111 ?? JVM 方法只能為調用者返回一個單一的對象,這樣的堆棧結果就不可能實現: ( n1 n2 -- n3 n4 ) ?? 對于無符號數沒有直接的支持; ?? CATCH 和 THROW 不能很容易地實現,你需要通過異常表來俘獲異常,這不能夠很好地匹配 Forth 模型,見 JVM Spec, p. 112 ?? 你不得不擴展 Forth 以便為 JAVA 方法產生所要求的屬性; ?? 沒有指針運算一類的事情; ?? 你不能把一個東西放到堆棧上然后強制地把它轉為另一種類型; ?? 你不能在原始字節碼之外產生一個對象,這是由于安全的原因; 這就是說,你可以使用 JVM 的字節碼來產生一些類似 Forth 的東西,但是不能用 JVM 來實現 Forth 的堆棧。 如果你對這個答案不滿意,應該使用 Jasmin 來直接編寫 JVM 的程序。 返回常見問題列表 能夠把 JAVA 字節碼翻譯成 Forth 嗎?把 JAVA 字節碼翻譯成 Forth 需要處理許多瑣碎的事情: ?? 垃圾收集 ?? 線程 ?? 控制結構 (branches->ANS Forth's 七個通用的控制結構字 ) ?? 異常 ?? 子程序 (JavaVM 碼不指定一個子程序返回到它的調用者 ) ?? JavaVM 與直到 Forth-83 的標準 t 都犯了同樣錯誤:它指定類型的大小,比如 JavaVM int 總是 32-bit ,為了支持這些必須增加幾個操作符 ?? 本地庫(沒有它們則 JavaVM 不能做任何事情) 返回常見問題列表 沒有操作系統的 Forth 怎么運行?在裸機硬件上運行的 Forth 系統被稱為獨立系統(與協同系統相比:協同系統在一個操作系統上運行)。注意不要把獨立系統與本地碼系統相混(后者指的是把 Forth 代碼編譯成機器碼的系統);獨立系統以本地串線編碼方式存在。 Forth 系統從一開始就是獨立系統,它執行操作系統的功能(從硬件到多用戶多任務), 現在的嵌入式 Forth 系統通常都是獨立系統。 服務器和桌面系統通常是協同系統,這樣做是為了避免本來在這些系統已經可以使用的大量設備再重新編寫驅動程序,同時也方便了 Forth 用戶和其它軟件用戶。 返回常見問題列表 為什么不用 Forth 來編寫一個操作系統呢?獨立 Forth 系統可以被看成是一個用 Forth 語言編寫的操作系統,所以用 Forth 來寫一個操作系統當然是可能的。有些人多次建議用 Forth 來開發一個操作系統,但是反對者也列出了這樣一些理由: ?? 如果你是在計劃為臺式機或者桌面系統編寫一個操作系統的話,我們將面臨與獨立 Forth 系統同樣的問題,當然這也是任何一個新操作系統所必須面對的問題:我們需要為那些廣泛使用的各種硬件編寫驅動程序,需要為新操作系統編寫新的應用程序; ?? 為了解決應用程序編寫問題,有些開發者建議可以讓我們自己開發的操作系統與某個現有的操作系統比如 Linux兼容,包括API 甚至 ABI 兼容,不過我們還應該明確開發這個操作系統的目的: ?? 如果這是一個練習,則項目可能太大; ?? 如果僅僅是為了得到一個操作系統,這可能沒有什么意義,因為現有的系統已經工作得很好了; ?? 如果是為了顯示 Forth 的某些優點,比如代碼特別小等,似乎有更簡單的辦法。而為了保持與舊操作系統的兼容,這些優點可能會蕩然無存,再說了,究竟有多少人真的關心一個操作系統核心代碼的大小呢? 返回常見問題列表 | ? |
|
總結
以上是生活随笔為你收集整理的Forth 常见问题解答的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 爬取百度文库内容(Selenium+Be
- 下一篇: 读书札记:30个因素预示美国将再现“大萧