日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Forth 语言概要

發(fā)布時(shí)間:2023/12/18 编程问答 63 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Forth 语言概要 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Forth 語(yǔ)言概要

原作者 Peter Knaggs

原文標(biāo)題《 Forth: An underview 》

本文的目的是給出 Forth 編程系統(tǒng)的一個(gè)整體輪廓,包括語(yǔ)言的歷史、突出的特點(diǎn)和使用方法,討論了最常用的實(shí)現(xiàn)方法,但更重要的是討論了 Forth 編程的方法和哲學(xué)思想。

1.Forth 的來(lái)歷

按照 Forth 語(yǔ)言的發(fā)明人 Charles Moore ( Chuck )的說(shuō)法:

我第一次把各種想法組合成一個(gè)整體之后,它在“第三代計(jì)算機(jī)” IBM1130 上工作得如此有效,以致于我認(rèn)為它是“第四代語(yǔ)言”,理所當(dāng)然地應(yīng)該被稱為 FOURTH 。不過(guò),當(dāng)時(shí)的 IBM 計(jì)算機(jī)只允許 5 個(gè)字符的標(biāo)識(shí)符。所以 FOURTH 變成了 Forth ,這是一個(gè)非常好的的文字游戲。

2. 歷史

Forth 語(yǔ)言是 60 年代發(fā)明的,當(dāng)時(shí) Moore 在斯坦福線性加速器中心做計(jì)算機(jī)程序員工作,后來(lái)變成了一個(gè)自由工程師。當(dāng)時(shí)的工程技術(shù)人員為了控制編譯程序必須學(xué)習(xí)大量的方法,包括連接器、匯編器、偽指令以及高級(jí)語(yǔ)言,開(kāi)發(fā)這個(gè)新工具的目標(biāo)就是為了克服這些問(wèn)題。

第一個(gè)稱為 Forth 的程序大約是在 1970 年編寫(xiě)的。第一個(gè)完整的實(shí)現(xiàn)是 1971 年在一臺(tái) PDP-11 上完成的,用于亞利桑那州國(guó)家射電天文臺(tái)的 11 米射電望遠(yuǎn)鏡。這個(gè)系統(tǒng)的責(zé)任是定向和跟蹤望遠(yuǎn)鏡,收集數(shù)據(jù)并記錄到磁帶上,支持一個(gè)交互式的圖形終端,供天文學(xué)家分析以前記錄的數(shù)據(jù)。系統(tǒng)的多任務(wù)特點(diǎn)允許這些功能同時(shí)執(zhí)行,沒(méi)有時(shí)間上和其它方面的沖突。

這個(gè)系統(tǒng)取得了巨大的成功,世界各地的天文學(xué)家開(kāi)始請(qǐng)求提供軟件拷貝。Forth的使用范圍迅速也擴(kuò)大,國(guó)際天文學(xué)會(huì)于 1976 年接受了 Forth 作為標(biāo)準(zhǔn)語(yǔ)言。

這個(gè)應(yīng)用的成功還促使 Moore 和 Elizabeth Rather ( ("Bess") 于 1973 年成立了 Forth, Inc. 公司,目標(biāo)是開(kāi)發(fā)這種語(yǔ)言的商業(yè)應(yīng)用。 Forth, Inc. 在小型機(jī)上開(kāi)發(fā)了多用戶的 Forth 版本,可以用于從數(shù)據(jù)庫(kù)到圖像處理等科學(xué)和應(yīng)用領(lǐng)域。和第一個(gè)應(yīng)用一樣,它們需要不同工具的組合。

1977 年,公司為剛剛出現(xiàn)的 8 位處理器開(kāi)發(fā)了一個(gè)稱為“microForth”的版本,對(duì)小型機(jī)上的“miniForth”做了擴(kuò)展和補(bǔ)充。1979 年,稱為“PolyForth”的產(chǎn)品替代了這些系統(tǒng)。從此以后,它就成了市場(chǎng)上銷售量最大的 Forth 系統(tǒng)。

“microForth”系統(tǒng)在美國(guó)、歐洲和日本的嵌入式微處理器應(yīng)用中取得了成功,由此產(chǎn)生了歐洲 Forth 用戶團(tuán)體 (EFUG) ;1978年,位于北加利佛尼亞的計(jì)算機(jī)愛(ài)好者成立了 Forth 興趣組織 (FIG).

FIG 從天文臺(tái)得到 Forth 系統(tǒng),再用這個(gè)系統(tǒng)開(kāi)發(fā)出一個(gè)簡(jiǎn)單的模型,然后在幾個(gè)不同的系統(tǒng)上實(shí)現(xiàn)(那當(dāng)然是得到了 Forth,Inc 的許可之后)并以非常低的價(jià)格銷售。這個(gè)模型后來(lái)變成了著名的 FIG-Forth 模型。所有這些使得對(duì) Forth 的興趣迅速增大。 FIG 目前在 15 個(gè)國(guó)家中有 60 個(gè)分支。

3. 特點(diǎn)

Forth 是一個(gè)交互式的程序設(shè)計(jì)環(huán)境,最初是為程序員在小型和微型計(jì)算機(jī)上開(kāi)發(fā)應(yīng)用程序而設(shè)計(jì)的。最早用于科學(xué)和工業(yè)應(yīng)用,比如儀器、機(jī)器人、過(guò)程控制、圖形和圖像處理、人工智能和商業(yè)應(yīng)用。 Forth 的主要優(yōu)點(diǎn)是軟件開(kāi)發(fā)快速、交互式、計(jì)算機(jī)硬件的高效使用等。

Forth 常常被作為一種語(yǔ)言,這當(dāng)然也是它最常見(jiàn)的方面,然而 Forth 所提供的功能比傳統(tǒng)的程序設(shè)計(jì)語(yǔ)言要多。傳統(tǒng)的高級(jí)語(yǔ)言工具包含有許多分離的工具(編譯器、編輯器、匯編器等等), Forth 把它們?nèi)跒橐惑w。與傳統(tǒng)的高級(jí)語(yǔ)言相比,它是經(jīng)過(guò)深思熟慮的,完全沒(méi)有傳統(tǒng)高級(jí)語(yǔ)言那么復(fù)雜的語(yǔ)法特性。

最早實(shí)現(xiàn)的 Forth 是一個(gè)獨(dú)立的系統(tǒng),它包含獨(dú)立操作系統(tǒng)的一般功能,還包括有編輯器、編譯器、匯編器、調(diào)試器和其它工具。一個(gè)單一的、簡(jiǎn)單的、一致的規(guī)則支配這些能力。今天,盡管還能在許多處理器上見(jiàn)到獨(dú)立的版本,但更多的版本是與 MSDOS 、 WINDOWS、UNIX 一類操作系統(tǒng)協(xié)同工作的。

Forth 并不起源于其它已有的程序設(shè)計(jì)語(yǔ)言,所以它的外觀和內(nèi)部特點(diǎn)對(duì)于新用戶來(lái)說(shuō)是特殊的。但是 Forth 的簡(jiǎn)單性、高度模塊化和交互式特性可以彌補(bǔ)初學(xué)者的陌生感,使得 Forth 非常易于學(xué)習(xí)和使用。一個(gè)新的程序員通常需要花一些時(shí)間來(lái)掌握 Forth 巨大的命令集,通過(guò)一個(gè)月左右的全面使用,程序員就可以理解它的整個(gè)內(nèi)部工作機(jī)理,所學(xué)到的東西要比傳統(tǒng)操作系統(tǒng)和編譯器多得多。

Forth 與傳統(tǒng)語(yǔ)言最大的不同是它的可擴(kuò)展性。 Forth 的編程過(guò)程就是定義新的字,字實(shí)際上就是語(yǔ)言的新命令。字可以用一系列以前定義的字來(lái)定義,這個(gè)過(guò)程與教育孩子的過(guò)程相似:我們總是用孩子們以前理解的概念來(lái)教給孩子們新的概念,而這些字被稱為“高級(jí)定義”。同樣,新的字也可以用匯編代碼定義,因?yàn)樵诙鄶?shù) Forth 實(shí)現(xiàn)中都包括宿主處理器的匯編器,而這些字被稱為 CODE 字。

可擴(kuò)展性的結(jié)果是我們?cè)陂_(kāi)發(fā)一個(gè)應(yīng)用的同時(shí),也間接地開(kāi)發(fā)了一個(gè)特殊的、針對(duì)這一類應(yīng)用的“面向應(yīng)用的語(yǔ)言”,它可以用于或者經(jīng)過(guò)修改之后被用于相似的應(yīng)用。

Forth 的可擴(kuò)展性并不僅僅是為語(yǔ)言自身增加新的命令,所以不要把定義字與傳統(tǒng)高級(jí)語(yǔ)言定義函數(shù)、過(guò)程等同。可擴(kuò)展性還能夠創(chuàng)建一個(gè)可以定義其它字的字,這種字被稱為“定義字”。在創(chuàng)建這樣一個(gè)定義字的時(shí)候,程序員能夠指定它所創(chuàng)建的字在編譯時(shí)間、運(yùn)行時(shí)間或者這兩種狀態(tài)下的特殊行為。這個(gè)能力允許我們定義特殊的數(shù)據(jù)類型,并對(duì)其行為和結(jié)構(gòu)實(shí)施完全的控制。又由于這種字的運(yùn)行時(shí)間行為可以用高級(jí)語(yǔ)言或者匯編語(yǔ)言來(lái)定義,所以由定義字創(chuàng)建的字將具有與其它 Forth 字一樣的性能。系統(tǒng)也允許我們?cè)黾右粋€(gè)新的“編譯指示符”以實(shí)現(xiàn)特殊類型的循環(huán)或者其它的控制結(jié)構(gòu),比如 CASE 結(jié)構(gòu)。

4. 編程

Forth 語(yǔ)言和英語(yǔ)非常相似,它的基本元素是已命名的數(shù)據(jù)項(xiàng)、過(guò)程,以及創(chuàng)建用戶化數(shù)據(jù)項(xiàng)的定義字的能力。過(guò)程和定義字可以使用以前定義的字或者匯編代碼來(lái)定義,它們與其它語(yǔ)言的子程序相似,也與其它語(yǔ)言的命令等效。 Forth 允許我們?cè)阪I盤(pán)上打入一個(gè)函數(shù)的名字,這個(gè)函數(shù)將被立即執(zhí)行。然而,如果我們把功能的名字放到定義中,將編譯成對(duì)于這個(gè)函數(shù)的引用。

高級(jí)字是由其它字的集合來(lái)定義的,我們可以把這個(gè)過(guò)程想象成是其它語(yǔ)言的宏或者詞典中的英語(yǔ)定義。新的字被加入到它們可以使用的存儲(chǔ)器中,其定義被加入到字典中。在一個(gè) Forth 字的命名規(guī)則中,只有很少的幾個(gè)字符不能作為命名字符使用。許多程序組織使用更好的命名約定,通過(guò)可打印的字符以增加程序的可讀性。

當(dāng)遇到一個(gè)字的時(shí)候, Forth 就通過(guò)字典搜索希望找到這個(gè)字的定義,如果找到,這個(gè)字定義的功能或者被立即執(zhí)行,或者作為引用而被編譯到新的定義中。然而,如果在字典中沒(méi)有找到這個(gè)字,系統(tǒng)就試著把它轉(zhuǎn)換成一個(gè)數(shù)。如果轉(zhuǎn)換成功,就把它放在堆棧上。如果不能轉(zhuǎn)換成數(shù)字,就顯示這個(gè)字并打印出一個(gè)錯(cuò)誤的信息來(lái)報(bào)告這個(gè)字是系統(tǒng)所不知道的。

Forth 堅(jiān)持“結(jié)構(gòu)化程序設(shè)計(jì)”原理:

?? 字必須在引用之前被定義;

?? 邏輯流限制只有順序、條件和循環(huán),有專門的字用于實(shí)現(xiàn)常用的程序控制結(jié)構(gòu);

?? 程序員使用許多小的、獨(dú)立的模塊(字)來(lái)實(shí)現(xiàn)最大的可測(cè)試性和可靠性;

這種方法有兩個(gè)明顯的優(yōu)點(diǎn)

?? 新的字總是用以前定義和測(cè)試過(guò)的字來(lái)構(gòu)造,所以調(diào)試更容易。模塊可以單獨(dú)執(zhí)行以測(cè)試它的功能;

?? 固有的模塊性使 Forth 成為一個(gè)“設(shè)計(jì)性語(yǔ)言”,允許自頂向下的設(shè)計(jì)同時(shí)保持自底向上的測(cè)試。一個(gè)字可以在不同的程序中使用,但是它的功能只需要定義一次;

這些都保證了 Forth 軟件能夠快速和有效地被開(kāi)發(fā),同時(shí),如果管理得當(dāng),也可以作為自身文檔的基礎(chǔ)。

Forth 的 5 個(gè)主要元素決定了它的特點(diǎn):

?? 一個(gè)字典;

?? 兩個(gè)堆棧,一個(gè)是參數(shù)棧,另一個(gè)是用于嵌套的返回棧;

?? 鍵盤(pán)(輸入流)解釋器;

?? 一個(gè)匯編器;

?? 虛擬存儲(chǔ);

用 Forth 開(kāi)發(fā)的項(xiàng)目

以下是一些使用 Forth 開(kāi)發(fā)的項(xiàng)目

Atari 的許多投幣游戲機(jī)都是用 Forth 開(kāi)發(fā)的。他們相信開(kāi)發(fā)高性能代碼的最快方法是使用 Forth ,加上使用匯編語(yǔ)言來(lái)重寫(xiě)最內(nèi)層的循環(huán)。

按照最近與著名的 Infocom 高級(jí)游戲開(kāi)發(fā)者的談話,他們的游戲解釋器也是用 Forth 寫(xiě)成的。

Unison World 為 CP/M 操作系統(tǒng)開(kāi)發(fā)了許多游戲,全部都是用 FIG-Forth 編寫(xiě)的。按他們技術(shù)總監(jiān) Marc de Groot 的說(shuō)法,把一個(gè)基于 Z80 的游戲移植到 6502 或者 MC6809 上,典型的時(shí)間不多于 3 個(gè)月。

美國(guó) Federal Express (聯(lián)邦快遞)公司的手持式行李分撿系統(tǒng)的程序是用 Forth 編寫(xiě)的。項(xiàng)目經(jīng)理 Gene Farrar 說(shuō),他可以按需要在幾個(gè)星期內(nèi)升級(jí)新固件,相比而言,其它的小組維護(hù) C 語(yǔ)言代碼則至少需要 6 個(gè)月的時(shí)間。

1990 年 11 月哥倫比亞航天飛機(jī)的 4 個(gè)載荷中有 3 個(gè)是用 Forth 編程的。按設(shè)計(jì)團(tuán)隊(duì)之一Johns Hopkins University's Applied Physics Laboratory的 John Hayes 說(shuō)法,他們選擇 Forth 來(lái)解決飛行中的硬件問(wèn)題,靈活性是一個(gè)主要的因素。

SUN 公司把 Forth 用于它的工作站可編程 Boot ROM 中,以每天 500-1000 臺(tái)的速度發(fā)貨,是可編程 Forth 系統(tǒng)中數(shù)量最大的。 1994 年 IEEE 1275-1994 將 Forth 用于 BOOT (初始配置) 固件的標(biāo)準(zhǔn),這也是 POWER PC 通用硬件平臺(tái)的基礎(chǔ)。

在電影《終結(jié)者 II :世界末日》中, Cyberdyne Systems T1000 系統(tǒng)的特技效果是基于 Morphing 軟件包 Forth 產(chǎn)生的。

5. 字典

Forth 程序存儲(chǔ)在字典中。字典占據(jù)了系統(tǒng)存儲(chǔ)器的很大部分,它由一個(gè)串線鏈接的可變長(zhǎng)度的項(xiàng)目組成,每個(gè)項(xiàng)目定義了一個(gè)字。每個(gè)定義的內(nèi)容根據(jù)字的類型(數(shù)據(jù)項(xiàng)、常數(shù)、操作序列等)而有所不同,字典是可擴(kuò)展的。

字是由“定義字”加入字典的,最常用的定義字是:(冒號(hào))。當(dāng)冒號(hào)執(zhí)行的時(shí)候,它為后面的字建立一個(gè)字典項(xiàng),然后進(jìn)入“編譯”模式。有許多不同的編譯方法,最常用的是“串線編碼”,這種方法把定義編譯成一系列以前定義字的地址引用。定義由;(分號(hào))結(jié)束。下面就是一個(gè)定義:

: NETWORK ( -- ) OPEN LINK TRXT. ECHO CLOSE LINK ;

圖 1 編譯的字典項(xiàng)

當(dāng)一個(gè)名字項(xiàng)被編譯到字典中的時(shí)候(稱為定義的首部),它包含一個(gè)指向字典中前一個(gè)首部的指針。新字的名字加入字典(這里就是 NETWORK ),接著一個(gè)指向名字為“( : )”子程序調(diào)用的指針編譯到字典中作為定義的第一部分,這個(gè)指針指向一段在解釋定義體時(shí)需要執(zhí)行的代碼。當(dāng)然,這里所說(shuō)的不是唯一的編譯技術(shù),但它的應(yīng)用最為普遍,這種技術(shù)稱為間接串線編碼,因?yàn)槎x中的第一個(gè)項(xiàng)目是一段代碼的引用,這段代碼知道如何解釋定義的其它部分。

定義的其它部分稱為這個(gè)定義的體。在編譯模式下,系統(tǒng)將依次尋找每個(gè)字的首部。每個(gè)首部地址依次放到定義體中,這樣就產(chǎn)生了一個(gè)地址列表。最后在到達(dá);時(shí),一個(gè)稱為“EXIT”的子程序地址被編譯進(jìn)定義。 EXIT 子程序用來(lái)將控制返回到調(diào)用字,就像一個(gè)子程序返回一樣。

6. 堆棧

Forth 維護(hù)兩個(gè)下推式堆棧,下推式堆棧也稱為后進(jìn)先出列表,它們提供了 Forth 字之間通信以及邏輯控制的有效機(jī)制。

盡管兩個(gè)堆棧的結(jié)構(gòu)是相同的,但它們的用途卻大不相同。與用戶/程序員關(guān)系最為密切的是數(shù)據(jù)棧,它保存有調(diào)用字之間傳遞的參數(shù),以替代傳統(tǒng)語(yǔ)言的參數(shù)列表,同時(shí)也是一個(gè)實(shí)現(xiàn)定義重用的有效內(nèi)部機(jī)制。第二個(gè)堆棧是返回棧,用于保存嵌套定義的返回地址,偶爾也用于臨時(shí)保存其它的數(shù)據(jù)。

數(shù)據(jù)棧的使用導(dǎo)致了一種操作數(shù)位于操作符后面的“后綴”表示方法,這種后綴表示方法常常被稱為 RPN 或者“逆波蘭表示法”,用以紀(jì)念 Lukasiewicz 教授,上個(gè)世紀(jì) 20 年代時(shí), Lukasiewicz 教授在華沙大學(xué)工作,為 Sentential Calculus 開(kāi)發(fā)了這種方法。

作為一個(gè)例子,我們來(lái)看一下字 BLANK 。這個(gè)字希望堆棧上有一個(gè)地址和一個(gè)數(shù),字 BLANK 將從指定地址開(kāi)始填充指定數(shù)目的 ASCII 空格,于是:

PAD 25 BLANK

將向 Forth 系統(tǒng)的便箋區(qū)填入25個(gè)空格,這里地址是由字 PAD 放到堆棧上的。應(yīng)用字通常按相似的方法定義,比如:

100 SAMPLES

將定義一個(gè)用于保存 100 個(gè)測(cè)量值的數(shù)據(jù)數(shù)組。算術(shù)操作也從堆棧上取值并將結(jié)果保存到堆棧上。例如, + 操作把棧頂?shù)膬蓚€(gè)數(shù)相加,并用它們的和替代棧頂。由于操作的結(jié)果仍然留在棧頂,所以連續(xù)的操作就可以組合在一起而不需要臨時(shí)存儲(chǔ)變量。例如,表達(dá)式

tempn + ((reading % interval) / interval) * (tempn1 - tempn)

變成:

reading interval % interval / tempn1 tempn - * tempn +

7. 解釋器

Forth 本質(zhì)上是一個(gè)解釋系統(tǒng),在這樣的系統(tǒng)中,程序的執(zhí)行是由數(shù)據(jù)項(xiàng)而不是由機(jī)器代碼控制的。解釋系統(tǒng)通常很慢,但是 Forth 卻通過(guò)兩級(jí)解釋而保持了實(shí)時(shí)應(yīng)用所需要的高速度。當(dāng)然,我們這樣說(shuō)是假設(shè)系統(tǒng)使用普通的串線編碼方法,如果使用編譯技術(shù)來(lái)產(chǎn)生本地代碼,就根本不會(huì)有任何速度上的損失了。

?? 第一個(gè)解釋器是文本解釋器,它掃描從終端(或者從海量存儲(chǔ)器)得到的字符串,并在字典中查找每一個(gè)字。如果找到了這個(gè)字,就通過(guò)第二級(jí)地址解釋器執(zhí)行。

?? 第二級(jí)解釋器是“地址解釋器”。盡管不是所有的系統(tǒng)都用這種方法實(shí)現(xiàn),但這種方法卻是最早的和最基本的方法,地址解釋器通過(guò)執(zhí)行每個(gè)定義點(diǎn)的程序來(lái)處理地址(或者標(biāo)記)串,這些定義點(diǎn)是由:(冒號(hào))創(chuàng)建并編譯到定義中的。

7.1 文本解釋器

上電之后。 Forth 啟動(dòng)一個(gè)稱為 QUIT 的無(wú)限循環(huán)。這就是 Forth 文本解釋器,也稱為鍵盤(pán)解釋器。

: QUIT ( -- ) BEGIN RESET QUERY INTERPRET AGAIN ;

RESET 清除堆棧, QUERY 等待用戶從鍵盤(pán)(或者從海量存儲(chǔ)設(shè)備)輸入一個(gè)命令, INTERPRET 尋找字典匹配,然后執(zhí)行。 BEGIN 和 AGAIN 是程序控制字,用于構(gòu)造無(wú)限循環(huán)。

QUIT 循環(huán)提供了語(yǔ)言的“交互式”特點(diǎn),如果輸入命令,它就可以立即被執(zhí)行,而執(zhí)行的結(jié)果可以使用相同的文本解釋器來(lái)觀察。與其它的編輯 - 編譯 - 鏈接 - 測(cè)試程序開(kāi)發(fā)過(guò)程相比,一個(gè)新的定義可以在極短的時(shí)間里被反復(fù)地測(cè)試和排錯(cuò)。

7.2 地址解釋器

定義項(xiàng)首部的最后一個(gè)字段是指向功能執(zhí)行的代碼指針,這個(gè)字段所在的地址被稱為“代碼域地址”,簡(jiǎn)稱 CFA 。對(duì)于所有的 Forth 高級(jí)定義字(使用 : 冒號(hào)定義的字),這個(gè)地址就是地址解釋器的地址,它指向字 (:) 。

地址解釋器有一個(gè)寄存器 I ,其中包含被執(zhí)行列表的下一個(gè)入口的地址。這個(gè)入口就是某個(gè)字的 CFA 地址,這個(gè)字被當(dāng)前正在執(zhí)行的高級(jí)定義字所調(diào)用。正是 CFA 決定了一個(gè)字的屬性(或者類型)。

在下面的例子中,字 A 調(diào)用字 B ,字 B 調(diào)用字 X 等等。 CFA 保存在中間寄存器 W 中。采用這種兩級(jí)間接尋址和字典列表結(jié)構(gòu)的 Forth 編碼方式也被稱為“間接串線編碼”。

圖 2 間接串線編碼

地址解釋器讀入 I 并使用列表中的下一個(gè)地址裝入 W ,然后從 W 讀出并執(zhí)行由它指示的代碼。 I 自動(dòng)增量指向列表中的下一個(gè)入口,因?yàn)榈谝粋€(gè)入口是 CFA ,所以 I 現(xiàn)在指向了定義體。這對(duì)于查找表一類的數(shù)據(jù)結(jié)構(gòu)非常有用,因?yàn)槎x體就是表元素的存儲(chǔ)區(qū)。在高級(jí)定義的情況下,代碼域地址指向子程序 (:) ,它把當(dāng)前的 I 保存到返回棧上,然后從 W 裝入 I 并重復(fù)這一過(guò)程。在高級(jí)定義的結(jié)尾,字 EXIT 被執(zhí)行,恢復(fù)原來(lái)的 I 值,程序像以前一樣繼續(xù)執(zhí)行。這三個(gè)動(dòng)作“讀 I 指針,保存 I 指針,恢復(fù) I 指針”是地址解釋器得以工作的基本機(jī)制。

地址解釋器有三個(gè)重要的特點(diǎn):

?? 特別快。盡管實(shí)際的速度依賴于特定的實(shí)現(xiàn),但專業(yè)化的實(shí)現(xiàn)是高度優(yōu)化的,每個(gè)地址通常要求 1-2 個(gè)機(jī)器字。這相比純的匯編代碼只增加 0%-50% 的開(kāi)銷。在許多基準(zhǔn)程序測(cè)試中,好的 Forth 實(shí)現(xiàn)遠(yuǎn)遠(yuǎn)勝過(guò)諸如 BASIC 或者 LISP 一類的解釋語(yǔ)言,可以與其它的編譯高級(jí)語(yǔ)言相比;

?? 它使得 Forth 定義極其緊縮,每一個(gè)引用僅僅需要一個(gè)單元(可以把單元理解成機(jī)器字,但是“字”在 Forth 中是指一個(gè)定義項(xiàng))。作為比較,我們可以考慮一下許多高級(jí)語(yǔ)言產(chǎn)生的子程序調(diào)用結(jié)構(gòu):一個(gè) CALL 或者 JSR 指令,后隨地址,在這之前和之后,還有參數(shù)序列的訪問(wèn)指令。

?? 使用返回棧保存地址的方法對(duì)于程序員是透明的,字也可以按需要嵌套許多層,這樣的高級(jí)定義字序列可以被自動(dòng)處理而不需要特殊的代碼。

Forth 系統(tǒng)中的許多字都是用 : 定義并通過(guò)地址解釋器進(jìn)行解釋的,而許多 Forth 系統(tǒng)本身也是用這種方法定義的。

8. 匯編器

大多數(shù) Forth 系統(tǒng)都包含一個(gè)宏匯編器,為它們所在的 CPU 進(jìn)行匯編語(yǔ)言編程。通過(guò)使用定義字 CODE ,程序員可以創(chuàng)建由實(shí)際的機(jī)器代碼組成的定義。 CODE 定義可以用來(lái)完成 I/O 、算術(shù)原語(yǔ)和其它依賴機(jī)器(時(shí)間緊迫)的處理功能。當(dāng)程序員使用 CODE 時(shí),他就和使用其它匯編器一樣對(duì) CPU 有完全的控制能力, CODE 定義的字以機(jī)器速度全速運(yùn)行。

這是 Forth 的一個(gè)重要特點(diǎn)。它允許那些明顯地依賴機(jī)器的代碼通過(guò)機(jī)器無(wú)關(guān)接口變換成為可管理的片斷。當(dāng)需要把應(yīng)用移植到不同的處理器上時(shí),我們僅僅需要重新編寫(xiě) CODE 字,這些 CODE 字就可以嚴(yán)格地按相同的方法與其它 Forth 字進(jìn)行交互。

Forth 匯編器本身也是極其緊縮的(典型地為 1K 字節(jié)),它們可以和編譯器、編輯器以及其它編程工具一起駐留在系統(tǒng)中。這就意味著程序員可以打入很短的 CODE 定義,然后立即執(zhí)行它們,這個(gè)能力在調(diào)試客戶硬件時(shí)特別有用。

9. 虛擬存儲(chǔ)

Forth 最后一個(gè)獨(dú)特的組成元素是它按數(shù)據(jù)和源程序虛擬存儲(chǔ)器的方式使用磁盤(pán)(或者其它海量存儲(chǔ)器)。在地址解釋器的情況下,這種方法在歷史上是典型的 Forth 方式,但現(xiàn)在并不通用。磁盤(pán)被分成 1024 字節(jié)大小的塊,在內(nèi)存中則準(zhǔn)備兩個(gè)或者多個(gè)緩沖區(qū),數(shù)據(jù)在引用時(shí)被自動(dòng)讀入緩沖區(qū)。每個(gè)塊有固定的塊號(hào),直接對(duì)應(yīng)于本地存儲(chǔ)系統(tǒng)的物理位置。任何時(shí)候程序需要訪問(wèn)時(shí),它都會(huì)在內(nèi)存中找到數(shù)據(jù),并不需要顯式的讀寫(xiě)操作。

這樣一個(gè)面向塊的磁盤(pán)管理方法對(duì)于 Forth 獨(dú)立系統(tǒng)的實(shí)現(xiàn)是簡(jiǎn)單和高效的,結(jié)果是塊為獨(dú)立和協(xié)同駐留 Forth 實(shí)現(xiàn)中的源程序和數(shù)據(jù)處理提供了一個(gè)完全透明的機(jī)制。

在源程序塊中的定義通過(guò) LOAD 命令編譯到內(nèi)存中。許多系統(tǒng)包含一個(gè)編輯器,它把每個(gè)塊組織成 64 字符 16 行的顯示模式并提供命令來(lái)修改源程序。

源塊在歷史上曾經(jīng)是 Forth 風(fēng)格的一個(gè)重要組成元素。就像 Forth 的定義可以被視為自然語(yǔ)言中的句子,一個(gè)塊相當(dāng)于是一個(gè)段落,通常包含有與一個(gè)主題相關(guān)的定義,比如“向量處理”。在塊文本的頂行含有這個(gè)主題的注釋說(shuō)明,應(yīng)用程序可以按實(shí)際需要來(lái)選擇裝入塊。

塊也被用于存儲(chǔ)數(shù)據(jù)。小的記錄可以組合進(jìn)一個(gè)塊,大的記錄也可以分布在幾個(gè)塊中。程序員可以根據(jù)應(yīng)用的需要分配塊,獨(dú)立的 Forth 系統(tǒng)還能夠按磁頭運(yùn)動(dòng)最少的原則來(lái)組織數(shù)據(jù)以優(yōu)化系統(tǒng),還有幾個(gè)開(kāi)發(fā)商提供了基于 Forth 塊的文件和數(shù)據(jù)庫(kù)系統(tǒng)。

在主機(jī)操作系統(tǒng)之上運(yùn)行的 Forth 版本使用文件系統(tǒng)來(lái)實(shí)現(xiàn)塊機(jī)制,另外也提供基于操作系統(tǒng)環(huán)境的一般文件操作方法。

10. 數(shù)據(jù)結(jié)構(gòu)

所有的高級(jí)字共享相同的數(shù)據(jù)結(jié)構(gòu),這種字的首部含有文本解釋器識(shí)別一個(gè)字所需要的數(shù)據(jù)信息,見(jiàn)圖 3 所示。

圖 3 定義的首部

“LINK”字段包含字典中前一個(gè)命令的首部地址,在搜索字典時(shí)需要這個(gè)地址。

“名字長(zhǎng)度”字段包含名字中全部字符的數(shù)量,后隨這些字符,在解釋過(guò)程中進(jìn)行名字匹配時(shí)需要這些數(shù)據(jù)。許多 Forth 系統(tǒng)僅僅存儲(chǔ)名字的前3個(gè)字符,這可以在占用空間最小的情況下避免名字沖突,而許多系統(tǒng)的名字長(zhǎng)度允許在 3-31 個(gè)字符之間選擇。

本文解釋器從字典的最后一個(gè)入口開(kāi)始處理,并沿著鏈表向后查找直到匹配名字為止?,F(xiàn)在還有許多系統(tǒng)提供散列算法,它們把字典分成幾個(gè)表,每次只查找其中的一個(gè),這種方式可以大大地節(jié)省查找時(shí)間。

“代碼指針”是這個(gè)字將被執(zhí)行的第一個(gè)指令的 CFA ,它形成了定義體的第一個(gè)入口。它也是代碼的地址,這個(gè)地址解釋定義的其它部分,對(duì)于不同的數(shù)據(jù)結(jié)構(gòu)將指向不同的代碼。

圖 4 不同的數(shù)據(jù)類型所指向的行為也不同

字的其它部分也就是定義體,它依不同的數(shù)據(jù)類型而不同,如圖 4 所示:

?? 在匯編 (CODE) 定義中,體中含有定義命令行為的機(jī)器操作碼列表,因此 CFA 含有這個(gè)體的地址;

?? 在諸如 VARIBLE 和 CONSTANT 這樣的數(shù)據(jù)結(jié)構(gòu)命令中,字義的體中含有實(shí)際的數(shù)據(jù)。 CFA 含有處理這些數(shù)據(jù)所需要的子程序的入口地址,用戶定義數(shù)據(jù)結(jié)構(gòu)的例子如圖 5 所示。

?? 在高級(jí) : (冒號(hào))定義中,字的體中含有構(gòu)成這個(gè)定義的所有以前定義字的地址列表。 CFA 是地址解釋器 (:) 的地址。

11. 程序舉例

下面是一個(gè)典型的 Forth 源程序塊。這個(gè)應(yīng)用程序用來(lái)控制 8 個(gè) LED 提示燈,它也說(shuō)明了 Forth 定義是如何組合以形成應(yīng)用環(huán)境的。

圖 5 一個(gè)源程序塊

注意第一行 (LINE 0) 的注釋說(shuō)明了這個(gè)塊中所列出的其它字的屬性,這一行通常被稱為索引行。多數(shù) Forth 系統(tǒng)都有一個(gè)命令字來(lái)查找塊的第一行以發(fā)現(xiàn)哪個(gè)塊是應(yīng)用程序所需要的。

所有的 LED 通過(guò)一個(gè)位于地址 40H 的 8 位口來(lái)訪問(wèn)。這個(gè)位置通過(guò)第一行的常數(shù)定義給出,于是這個(gè)口可以通過(guò)名字來(lái)引用,而如果以后硬件地址改變了,我們也僅僅需要調(diào)整這個(gè)常數(shù)。字 LIGHTS 在堆棧上返回這個(gè)地址,定義 LIGHT 得到棧頂值并把它發(fā)送到設(shè)備上。這個(gè)值的屬性是位掩碼,每一位對(duì)應(yīng)一個(gè) LED 。于是命令:

255 LIGHTS

將點(diǎn)亮所有的燈,而命令

0 LIGHTS

將關(guān)閉所有的燈。如果硬件變化了,我們也只需要改寫(xiě)字 LIGHTS 以適應(yīng)新的硬件,而應(yīng)用程序的其它部分則不需要做任何改變。

行 4-6 含有對(duì)我們終端輸入進(jìn)行的處理,終端輸入是為了能夠進(jìn)行簡(jiǎn)單的診斷以確認(rèn)各個(gè)方面都能夠工作正常。這里 DELAY 含有以微秒為單位的延時(shí)時(shí)間,執(zhí)行字 DELAY 返回這個(gè)變量的地址。 DELAY 的兩個(gè)值是由 FAST 和 SLOW 定義的,使用 Forth 的操作!(讀作 STORE )從棧頂?shù)玫降刂泛椭?#xff0c;并把值存儲(chǔ)到相應(yīng)的地址中。

定義 COUNT 運(yùn)行一個(gè)從 0-255 的循環(huán)(在字 DO 和 LOOP 之間)。字 I 把循環(huán)的當(dāng)前值放到棧頂,然后發(fā)送給 LIGHTS 。接著系統(tǒng)等待由 DELAY 指定的時(shí)間。

字 @ (讀作 FETCH )從 DELAY 提供的地址讀取一個(gè)值,并把這個(gè)值交給 MS 等待指定的毫秒。執(zhí)行 COUNT 的結(jié)果就是以指定的速率從 0 到 255 之間計(jì)數(shù)。可以這樣調(diào)用:

SLOW COUNTS 或者

FAST COUNTS

8-10 行提供單獨(dú)命名燈的能力。在這個(gè)應(yīng)用中,它們用作燈的指示器。字 LAMP 是一個(gè)使用位掩碼作為參數(shù)的定義字。字 CREATE 把一個(gè)首部編譯進(jìn)字典,同時(shí)字,(逗號(hào))把掩碼放到定義體中。字 DOES> 把代碼地址放到新字的 CFA 中。于是當(dāng)新字執(zhí)行時(shí),它的動(dòng)作就是獲得所定義的新字體中的第一個(gè)項(xiàng)目的內(nèi)容。

行9和10使用 LAMP來(lái)命名特別的指示燈。當(dāng)其中的一個(gè)字比如 POWER 執(zhí)行時(shí),掩碼就返回到棧頂。實(shí)際上,這種行為與 Forth 字 COSNTANT 一樣。但是 LAMP 是一個(gè)例子,像這樣使用 CREATE …… DOES> 定義字的能力是 Forth 語(yǔ)言最強(qiáng)大的功能之一,它允許我們定義基于數(shù)據(jù)結(jié)構(gòu)的“智能應(yīng)用”。

最后,行 13-15 ,我們有了控制燈面板的字。 LAMPS 是一個(gè)變量,它包含有燈的當(dāng)前狀態(tài)。字 LAMP-ON 得到一個(gè)掩碼(由其中一個(gè) LAMP 字提供),然后點(diǎn)亮燈。 LAMP-OFF 將指定的燈關(guān)閉,同時(shí)改變 LAMPS 的狀態(tài)。

在應(yīng)用程序的其它地方,燈的名字和 LAMP-ON 、 LAMP-OFF 可能才是需要直接執(zhí)行的字。用法是:

POWER LAMP-ON 或

SAMPLING LAMP-OFF

在系統(tǒng)上編譯這個(gè)代碼塊的時(shí)間大約是半秒,包括從磁盤(pán)上讀入的時(shí)間。這樣程序員就有可能簡(jiǎn)單地打入一個(gè)定義然后立即執(zhí)行它。另外我們總是具有與外部設(shè)備直接通信的能力。我們可以首先打入:

HEX FF 40 OUTPUT

來(lái)看看是不是所有的燈都亮。如果不是,可以假定有些地址不對(duì),因?yàn)樯厦娴木渥邮前讶?1 直接發(fā)送給設(shè)備。這種類型的交互在與硬件打交道的時(shí)候特別有用,它們能夠縮短硬件的開(kāi)發(fā)時(shí)間。

12. 擴(kuò)展

由于 Forth 是可擴(kuò)展的,大量的開(kāi)發(fā)商為 Forth 語(yǔ)言的應(yīng)用提供許多擴(kuò)展產(chǎn)品。這些擴(kuò)展包括自動(dòng)化的文檔、終端驅(qū)動(dòng)、磁盤(pán)文件管理、數(shù)據(jù)庫(kù)管理、目標(biāo)編譯器、交叉編譯器和 META 編譯器。

一個(gè)目標(biāo)編譯器允許我們使用一個(gè)主機(jī) CPU 比如PC機(jī)來(lái)編寫(xiě)系統(tǒng)程序。程序可以通過(guò)鍵盤(pán)編輯和交互式地測(cè)試,之后可以把這些程序編譯到目標(biāo)環(huán)境中并產(chǎn)生對(duì)應(yīng)的 ROM 代碼。目標(biāo)編譯器的一個(gè)功能就是剔除目標(biāo)系統(tǒng)中不需要的代碼,比如編輯器、編譯器和匯編器。通過(guò)這些工作,運(yùn)行系統(tǒng)的 ROM 開(kāi)銷可以從開(kāi)發(fā)系統(tǒng)所占用的 8K 字節(jié)減少到大約 600 個(gè)字節(jié)。

交叉編譯器與目標(biāo)編譯器類似,它允許用戶在主機(jī)上開(kāi)發(fā)和測(cè)試代碼,然后交叉編譯器將像目標(biāo)編譯器一樣編譯 Forth 系統(tǒng),只是交叉編譯器是使用不同的機(jī)器語(yǔ)言、為不同的目標(biāo) CPU 產(chǎn)生代碼。這個(gè)特點(diǎn)允許快速地為新的 CPU 開(kāi)發(fā)新的 Forth 系統(tǒng),由于 Forth 系統(tǒng)主要是用 Forth 語(yǔ)言編寫(xiě)的,所以我們只需要為新的處理器編寫(xiě)一個(gè)匯編器,然后為新的處理器進(jìn)行 Forth 系統(tǒng)的交叉編譯就可以了。大多數(shù)的 Forth 系統(tǒng)就是用這種方式開(kāi)發(fā)的,結(jié)果, Forth 通常成為一個(gè)新處理器上的首選語(yǔ)言之一。

寫(xiě)一個(gè) Forth 編譯器的過(guò)程也被稱為 META 編譯。

13. 多任務(wù)

多任務(wù)在 Forth 中從一開(kāi)始時(shí)就有了。這些系統(tǒng)不僅僅是語(yǔ)言處理器,而且包含操作系統(tǒng)的特點(diǎn),許多集成系統(tǒng)完全是獨(dú)立運(yùn)行的,執(zhí)行所有操作系統(tǒng)的功能。

Forth 的操作環(huán)境運(yùn)行速度快,所以基于 Forth 的系統(tǒng)就能夠支持多用戶和多任務(wù),甚至在那些看似不能實(shí)現(xiàn)這些功能的計(jì)算機(jī)硬件上也是這樣。例如,一個(gè)電話交換板的生產(chǎn)商在一個(gè) Z80 上執(zhí)行 50 個(gè)任務(wù)。在 IBM PC 上也有幾個(gè)多任務(wù)產(chǎn)品,有些甚至能夠支持多用戶。在一般支持多用戶操作的計(jì)算機(jī)上,可以支持的用戶數(shù)就更多了,一個(gè)運(yùn)行在單個(gè) MC68000 處理器上的數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)能夠支持 100 個(gè)終端更新和數(shù)據(jù)庫(kù)請(qǐng)示,而運(yùn)行速度卻沒(méi)有明顯的降低。

多用戶系統(tǒng)可以支持多個(gè)程序員同時(shí)工作,每個(gè)程序員都有自己的私有字典、堆棧和一系列變量來(lái)控制任務(wù)。私有字典連接到一個(gè)共享的、可再入的、包含全部標(biāo)準(zhǔn) Forth 功能的字典。私有字典可以用來(lái)開(kāi)發(fā)應(yīng)用程序代碼,這些代碼以后可以加入到共享字典中。

圖 6 給出了 Forth 系統(tǒng)實(shí)現(xiàn)多任務(wù)的典型方法。這是一個(gè)“輪循調(diào)度算法” 調(diào)度器,是 Forth 系統(tǒng)中實(shí)現(xiàn)多任務(wù)最常用的方法。然而,有一些實(shí)現(xiàn)使用時(shí)間片調(diào)度或者基于優(yōu)先級(jí)的調(diào)度以及其它可剝奪的算法,在這樣的系統(tǒng)中每個(gè)任務(wù)都有自己的用戶區(qū)以保存控制變量、私有字典和堆棧。用戶區(qū)的第一個(gè)字段是 STATUS 變量。這個(gè)變量有兩個(gè)可能的值:喚醒或者休眠。

圖 6 在循環(huán)調(diào)度隊(duì)列中的 4 個(gè)任務(wù)

可以被選擇調(diào)度執(zhí)行的任務(wù)必須處于喚醒狀態(tài)。當(dāng)任務(wù)被選擇執(zhí)行時(shí)它的狀態(tài)就被復(fù)位到休眠狀態(tài)。任務(wù)一直執(zhí)行直到調(diào)度器執(zhí)行到字 PAUSE ,這將把任務(wù)的狀態(tài)置為喚醒,控制重新返回到調(diào)度器。當(dāng)調(diào)度器再次輪循到這個(gè)任務(wù)時(shí),將從 PAUSE 的指令之后繼續(xù)執(zhí)行。

除了 PAUSE 字之外,任務(wù)也可以執(zhí)行 STOP 字將控制返回到調(diào)度器。這與 PAUSE 類似,但是任務(wù)的狀態(tài)并不切換到喚醒狀態(tài)。這樣,當(dāng)調(diào)度器再次輪循到這個(gè)任務(wù)時(shí),當(dāng)前的狀態(tài)仍然是休眠。這意味著這個(gè)任務(wù)不能再被執(zhí)行了,除非它的狀態(tài)被另外的任務(wù)或者中斷設(shè)置為喚醒。

系統(tǒng)以這種方式編程并允許中斷。當(dāng)一個(gè)中斷發(fā)生時(shí),一些與機(jī)器有關(guān)的代碼將指定的任務(wù)狀態(tài)置為喚醒,這樣當(dāng)調(diào)度器再次到達(dá)這些任務(wù)時(shí)它們將被執(zhí)行。當(dāng)任務(wù)執(zhí)行時(shí), STATUS 變量被置為休眠,這就允許一個(gè)任務(wù)執(zhí)行時(shí)可以發(fā)生中斷。因此,如果一個(gè)任務(wù)執(zhí)行了 STOP 指令而它的狀態(tài)沒(méi)有改變,在它執(zhí)行中一個(gè)中斷設(shè)置了它的狀態(tài)為喚醒,它就可以再次被調(diào)度,于是我們能夠緩沖一個(gè)中斷。然而,這也就意味著當(dāng)一個(gè)任務(wù)主動(dòng)放棄處理器并希望下一次調(diào)度繼續(xù)執(zhí)行時(shí),它必須把狀態(tài)設(shè)為喚醒。

輪循調(diào)度器使用存儲(chǔ)在 LINK 用戶變量中的地址作為下一個(gè)任務(wù)的地址。如果這個(gè)任務(wù)的 STATUS 是喚醒的,該任務(wù)將被調(diào)度執(zhí)行,否則,調(diào)度器取出它的 LINK 地址轉(zhuǎn)到下一個(gè)任務(wù)。

這種方法有兩個(gè)主要問(wèn)題:

?? 當(dāng)一個(gè)任務(wù)為了其它任務(wù)可以運(yùn)行而主動(dòng)放棄處理器時(shí),從放棄到再次得到處理器的時(shí)間是不確定的;

?? 中斷設(shè)置一個(gè)任務(wù)為喚醒狀態(tài)到這個(gè)任務(wù)實(shí)際執(zhí)行之間的時(shí)間也是不可知的。

通過(guò)小心地使用 PAUSE ,再加上 Forth 的運(yùn)行速度很快,已經(jīng)在主要的應(yīng)用系統(tǒng)中克服了這些問(wèn)題。

14.Forth 硬件

早在1980年,ROCKWELL公司就生產(chǎn)了65F11處理器,這是一個(gè)6502處理器的變型,它在6502芯片的 ROM 中固化了 Forth 原語(yǔ),這個(gè)芯片被成功地應(yīng)用到了許多嵌入式系統(tǒng)中。

1981年, Chuck Moore開(kāi)始設(shè)計(jì)一個(gè) Forth 虛擬機(jī)芯片。這個(gè)工作首先在 Forth,INC. 進(jìn)行,后來(lái)專門成立了一家公司來(lái)開(kāi)發(fā)這個(gè)芯片。 1984 完成設(shè)計(jì), 1985 年生產(chǎn)了第一個(gè)樣片。后來(lái), HARRIS(INTERSIL) ,Johns Hopkins University 和其它人也開(kāi)發(fā) Forth 硬件?;?Forth 的芯片提供了極高的性能,一般可與 RSIC 芯片相比,但是它沒(méi)有傳統(tǒng) RISC 的程序設(shè)計(jì)復(fù)雜性。

15. 標(biāo)準(zhǔn)

Forth 界認(rèn)識(shí)到需要一個(gè)標(biāo)準(zhǔn),使得應(yīng)用和擴(kuò)展都以此為基礎(chǔ)。第一個(gè)這樣的標(biāo)準(zhǔn)從上個(gè)世紀(jì) 70 年代中期 FIG(Forth 興趣組織 ) 開(kāi)始,這個(gè)標(biāo)準(zhǔn)后來(lái)變成了 FIG-Forth 標(biāo)準(zhǔn)。

第一個(gè)主要的 Forth 標(biāo)準(zhǔn)來(lái)自于 1977 年在 Utrecht 召開(kāi)的一次會(huì)議,與會(huì)者提出了一個(gè)原始的標(biāo)準(zhǔn)并同意以后繼續(xù)舉行會(huì)議討論, 1978 年的會(huì)議包括了 FIG 成員,經(jīng)過(guò)一系列由用戶和開(kāi)發(fā)商參加的會(huì)議,產(chǎn)生了一個(gè)更加廣泛的標(biāo)準(zhǔn),稱為 Forth-79.

盡管 Forth-79 標(biāo)準(zhǔn)的影響力是巨大的,但是許多 Forth 用戶和開(kāi)發(fā)商發(fā)現(xiàn)這個(gè)標(biāo)準(zhǔn)中有一些致命缺點(diǎn)。 1983 年,兩次進(jìn)一步的會(huì)議產(chǎn)生了 Forth-83 標(biāo)準(zhǔn)。

受到 Forth-83 標(biāo)準(zhǔn)被廣泛接受的鼓舞,一組用戶和開(kāi)發(fā)商從 1986 開(kāi)始討論美國(guó)國(guó)家標(biāo)準(zhǔn)的可行性。美國(guó)國(guó)家標(biāo)準(zhǔn) Forth 技術(shù)委員會(huì),也稱為 ANS ASC X3/X3J14 委員會(huì),于 1987 年召開(kāi)了第一次會(huì)議,目標(biāo)是“達(dá)到一個(gè)可接受的標(biāo)準(zhǔn),被 Forth 產(chǎn)品主要開(kāi)發(fā)商接受,對(duì)現(xiàn)有在用產(chǎn)品的不利影響最小”。 1994 年,也就是大約 7 年之后,新的標(biāo)準(zhǔn)最終產(chǎn)生了,這是所有標(biāo)準(zhǔn)中走得最遠(yuǎn)的。使用來(lái)自 5 個(gè)國(guó)家的說(shuō)明,通過(guò)開(kāi)發(fā)商向社會(huì)公開(kāi)。兩年之后,國(guó)際標(biāo)準(zhǔn)化組織接受這個(gè)標(biāo)準(zhǔn)為國(guó)際標(biāo)準(zhǔn)。

16. 研討會(huì)和定期出版物

由于人們使用 Forth 進(jìn)行工作并不斷做出有益的擴(kuò)展,所以 Forth 語(yǔ)言也在不斷地發(fā)展。有三個(gè)年會(huì)關(guān)注著 Forth 語(yǔ)言的發(fā)展:

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.

對(duì)于 Forth 的許多新的思想最先在這些 Forth 相關(guān)的雜志上出現(xiàn):

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.

17. 總結(jié)

FROTH 可以被看成是有兩個(gè)堆棧(參數(shù)棧和返回棧)的、有可擴(kuò)展匯編語(yǔ)言的處理器。 Forth 解釋器可以看成是這個(gè)抽象處理器的完全宏匯編器和完全集成的操作系統(tǒng)。

這就給我們提供了一個(gè)交互式的調(diào)試環(huán)境,使我們可以增加新的宏(高級(jí)定義)和新的指令(低級(jí) CODE 定義)。它甚至允許我們通過(guò)定義新的數(shù)據(jù)類型(使用定義字 CREATE …… DOES> )擴(kuò)展宏系統(tǒng)本身。因?yàn)檫@個(gè)解釋器也是一個(gè)全功能的操作系統(tǒng),所以程序員只需要學(xué)習(xí)一種工具。

Forth 有四個(gè)直接的優(yōu)點(diǎn):親善、直接、可擴(kuò)展和經(jīng)濟(jì)。它還有兩個(gè)間接的優(yōu)點(diǎn):可理解和符號(hào)化。

Forth 不僅僅是一種語(yǔ)言,它更是一種解決問(wèn)題的哲學(xué)思想。這可以用縮寫(xiě) K.I.S.S 來(lái)概括( Keep It Simple and Stupid ,保持它的簡(jiǎn)潔和易用)。我們可以引用 Jerry Boutelle (owner of Nautilus Systems in Santa Cruz, California) 的話,當(dāng)被問(wèn)及“使用 Forth 是怎么影響你的思維”時(shí),他回答:

“Forth 以許多方式改變了我的思維。從學(xué)習(xí) Forth 開(kāi)始,我已經(jīng)使用了各種語(yǔ)言編程,包括匯編、 BASIC 、 FORTRAN 。我發(fā)現(xiàn)我一直在使用 Forth 的問(wèn)題分解方式,通過(guò)創(chuàng)建字的方式把它們組合在一起。例如,在處理字符串的時(shí)候,我會(huì)像 Forth 的 CMOVE 、 -TRAILING 、 FILL 那樣來(lái)定義子程序。更基本地, Forth 堅(jiān)定了我對(duì)簡(jiǎn)單性的信念。在面對(duì)一個(gè)問(wèn)題的時(shí)候,許多人使用特別復(fù)雜的工具,但是簡(jiǎn)單的工具也可以使用而且更有用。我試著簡(jiǎn)化我生活的方方面面?!?

這里我引用中國(guó)哲學(xué)家老子的一句話:

“為學(xué)日益,為道日損”

或者引用 Antoine Lavoisier (1789) 的話:

“把科學(xué)和語(yǔ)言分離是不可能的,因?yàn)槊恳豁?xiàng)自然科學(xué)總是包含三件事情:科學(xué)所基于的一系列現(xiàn)象,在頭腦中命名這些現(xiàn)象的抽象概念,表達(dá)這些概念的詞匯。為了說(shuō)明一個(gè)概念,我們需要一個(gè)詞匯;為了描繪一個(gè)現(xiàn)象,我們需要一個(gè)概念。所有這三件事情都反映了同一個(gè)現(xiàn)實(shí)。”

這就是包含在 Forth 語(yǔ)言背后的哲學(xué)。

18. 參考文獻(xiàn)

略 ( 可參見(jiàn)原文 )

總結(jié)

以上是生活随笔為你收集整理的Forth 语言概要的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。