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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

1x Forth

發布時間:2023/12/18 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 1x Forth 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1x Forth

Charles Moore, April 13, 1999

這篇文章是 Jeff Fox 根據 Charles Moore 談話錄音所寫。

我請求 Chuck Moore 允許我對這次關于 15 年來 Forth 語言變遷的談話進行錄像。我們安裝了攝像機,他談論了我在這個網站上提出的問題,但是這一次我們不再把焦點集中在固體物理、 VLSI 或者芯片和調試方面的經驗,而是 Forth 語言。我覺得他談論了這些年來的 Forth 語言,但是相比我所關心的、 30 年前發明的語言來說,他談及了更多的方面。

我介紹 Chuck.

(Jeff Fox) 今天,我請 Chuck Moore 對 Forth 做一個介紹,我想請他談一談對于自己發明的語言在最近 15 年里的經驗。現在我們請 Charles Moore 。

(Charles Moore) 這可是一個大話題,我們談多長時間?

(Jeff) 磁帶只有一個小時。

(Chuck) 15 年,那差不多是我用計算機面對軟件的整個經歷。回想 15 年前,把重點從 Forth 語言轉向 Forth 微處理器的動機主要有兩個。

首先是軟件的問題已經解決了。編寫應用程序很容易,不用費太大的勁。所有的問題都是硬件,硬件笨拙、零亂、可靠性差,特別是你需要為客戶的硬件而編寫客戶化的軟件時。如果你想調試硬件那就更是一個大麻煩。這些都說明硬件工程師并沒有做出出色的工作,當然,他們比工業界的軟件工程師做得好,但是沒有 Forth 軟件工程師做得好。因此我想看看我能夠在這些硬件問題方面做些什么。這可能是個錯誤。 Forth 有許多有趣的事情可做,硬件可就不這么有趣了。

我不知道你是不是聽過這些歷史,第一個 Forth 處理器是 Novix ,它也可能是所有這類處理器中的第一個。它是一個 16 位的處理器,使用高速工藝制造,平均 8MIPS 。這個工作很有趣,我們給它配了一個很好的 Forth 系統,稱為 cmForth ,比我為 Forth Inc. 所做的其它 Forth 都更小、更簡單,后來 ShBoom 是 32 位處理器, 50MIPS ?,F在 i21 是最新的成果,它是 20 位的,我很高興地宣布它的速度是: 500MIPS.

每個處理器都有它自己的 Forth 語言,目標非常簡單:使硬件與軟件結合的復雜性最小。只要我沒有看到其它的人在做這件事情,只是嘴上說說的人不算,沒有人真的在使復雜性最小方面做任何事情,那就是我需要盡力去做的。

我們正在建立一種文化,它不能夠抗拒比如 Y2K 這樣很小的災難。一但我們失去了十億美元的封裝廠、一但我們失去了由數千人組成的程序員團隊,我們還能夠重新建立起來嗎?不用關心能不能重建的事情?計算機值得我們的社會這樣投入嗎?它本來可以簡單得多。如果它更簡單,那么我對技術在未來不確定社會中更持久這樣的事情就會更有信心。

把事情弄復雜好象是一個傾向。人們喜歡把它們弄得復雜,這種情況隨處可見。你可以在電視節目中是看到,可以在市場的產品中看到,也可以在網站網頁上看到,簡單地表示信息不足,你把它弄得精彩。我想可能有一個最佳的復雜度是人腦能夠設計它們。你把事情弄簡單了,大眾會覺得無聊,但是你把它們弄得太復雜,一樣會失去大眾。

我從來沒有因為簡單而覺得無聊。給我做一件事情更簡單的方法,我就會迫不急待地去得到它。但是在汽車、飛機、航天器和大量的復雜設備方面卻不是這樣。 Forth 不需要這么復雜。經典的 Forth 是從簡單開始的,它慢慢地被復雜所包圍。在 Forth Inc. 里,這都成了公司的文化。我們有了一個軟件包,我們銷售它、我們拓展它、我們鐘情于它。當我離開 Forth Inc 之后,就有了一個簡化的機會, cmForth 就是成果。不幸的是 cmForth 并沒有廣泛應用,所以我很難告訴你它能夠工作得多好。

在我的記憶中, ShBoom 與 cmForth 一樣好。我做的最大應用是使視頻能夠工作并開始客戶芯片設計包的過程,所以我知道使用 ShBoom 的捷徑。

i21 ,我現在使用的是帶顏色的 Forth ,還沒有用它做有效的應用。它極端地簡單,它比任何的前輩都簡單。我想說說為什么。

i21 本身是一個簡單的處理器,但也沒有做到可能的最簡化,因為好象我們能出售這個處理器的唯一希望就是它的速度,所以我增加了許多的復雜性以滿足速度的要求。我希望我得到了某種平衡的理由。 500 MIPS 是一個誘人的速度。我們只能使這個速度保持片刻,但某一天它會變得平滑。問題是沒有哪些應用需要這樣的速度,或者說沒有大量的處理器要求這種速度。它很難銷售。

我最近已經看到的最有趣的應用是 SETI 的家庭計劃,在這個計劃中,你可以從 Arecebo 網站上下載數據并在自己的 PC 機上處理兩個星期,然后把結果傳回去與研究機構分享。所以一個快速的處理器可以很容易在那里銷售和應用。可能 SETI 分布式處理器系統有一些事情可以做。

一但你得到了一個處理器,你希望它適合 Forth。之后, Forth 應該怎樣開發這個處理器呢?這個問題引出了 Forth 是什么的問題。我期待有人能夠告訴我答案。我不斷在問, Forth 是什么?

Forth 是高度因子化的代碼。我不知道除了說 Forth 是定義之外還能說什么。如果你有了許多短小的定義,那你就是在編寫 Forth 程序。為了寫出許多短小的定義,你需要一個堆棧。堆棧并不流行,我很奇怪為什么它沒有流行。許多壓力來自于既得利益者,他們不喜歡堆棧,他們喜歡寄存器。堆棧并不是能夠解決所有問題的一個概念,但它的確非常非常有用,特別是對于信息屏蔽,并且你需要兩個堆棧。

這些思想到現在已經有 30 多年了,我已經談論它們 30 多年了,可現在被人們接受的程度與 30 年前沒有什么差異,可能隨著工業的發展,對它們的關注反而是更少了。

Forth
?Defintions
?Stacks

這就是 Forth 。需要支持定義。

什么是定義?非常經典的說法是一個定義就是用冒號說明一些事情、字、在什么地方結束定義等等

: some ~~~ ;

我總是試著通過縮寫來說明其中的意義,不論你這里寫下的字串是為了更常用或者是更方便。但它并不嚴格地是縮寫,它可以有一個或者兩個參數。這里有一個程序員相關的問題,也可能是與所有程序設計都有關的問題:我們給一個子程序輸入了太多的參數。看看許多 C 語言程序,它們很可笑。程序中的每件事情都通過調用序列傳遞,而子程序只是一個啞巴。

一個 Forth 字不應該有多于一個或者兩個參數。人們處理堆棧時有這么多的麻煩來處理堆棧,絕對不應該有多于 3 至 4 個元素的深度。

我們現在的具體做法是使一個字(:)以紅色顯示。通過這種方式你就不需要再使用冒號了,這不僅減少了你存儲源程序文本的大小,而且也使得后面的工作極為清晰。紅色的字是被定義的字:

some ~~~

定義是綠色的,在定義之中可以有一個分號表示返回,但是并不結束一個定義。如果需要,你可以有多個返回,你還可以有多于一個入口點。沒有冒號定義,這個定義就會落入另一個定義,并在下一處返回;我們已經沒有表示編譯模式和執行模式的狀態。你或者是在運行綠色或者是在運行白底黑字。黑色意味著執行,綠色意味著編譯,紅色意味著定義。

這對我來說更簡單也更清晰,這是一個嶄新的概念,但是還沒有被廣泛接受,不過我們馬上就會看到。

但是對于堆棧來說,堆棧應該很淺。在 i21 芯片上,堆棧只有 18 個元素的深度,這個尺寸的選擇是一個有效的數字。

處理這個堆棧的字是 DUP 、 DROP 和 OVER ,沒有別的了。 SWAP 也很方便,你需要它,但它不是一個機器指令。但是,我們沒有 PICK 和 ROLL ,沒有什么復雜的操作可以使你能夠按索引來訪問元素。前兩個元素是你需要關心的堆棧部分。當然。在一個芯片上,它們是兩個 ALU 的輸入端,這也是硬件相關的。

其它的元素也在堆棧上,因為你把它們放到了那里,你準備以后當堆?;氐侥抢飼r再處理它們。它們不在那里是因為你正在使用它們。你不想堆棧上的東西太多,因為你很快就會忘掉他們的意義。

所以,那些畫堆棧圖示的人馬上應該明白他們正在做著不正確的事情,哪怕是很常用的短小的圖示。這種方法是:如果你定義了一個字,你還寫上一個說明來顯示堆棧的影響,比如說 F 和 x 和 y

F ( x - y )

過去,當我把堆棧弄得太復雜時我也使用這種方法,但是現在不再這樣了。我們不需要這類的信息,它應該能夠從源代碼中很容易地得到,或者應該在另外的地方編寫文檔。

所以我使用的堆棧操作非常有限,而條件操作也是這樣,在經典的 Forth 中我們使用 IF ELSE THEN ,現在我排除了 ELSE 。

我不認為 ELSE 的用途能夠與介紹它的復雜性相比較,你可以通過我的代碼明白這一點。我將把 IF 和一個分號一起使用,我將在一個點上退出定義或者繼續。

IF ~~~ ; THEN

我有兩條分支,但是我用了“分號并不結束一個定義”的新特點。

還有循環,有許多循環結構。原來我使用的結構來自于其它的語言,我想事情就是這樣發展的。它們是

DO LOOP 還有

FOR NEXT 還有

BEGIN UNTIL

DO LOOP 來自于 FORTRAN 語言, FOR NEXT 來自于 BASIC 語言, BEGIN UNTIL 來自于 ALGOL 語言。

我們在 Forth 中選擇哪一個?這個 (DO LOOP) 有兩個循環控制參數,太復雜了。這個 (FOR NEXT) 有一個循環控制參數,非常便于硬件實現,如果有足夠的硬件實現時它本身也非常簡單。這個 (BEGIN) 有可變數目的參數。不幸的是……(錄像帶雜音)

我們正在使用 iTV 的記錄設備,這是它的拱頂 (vault) 。如果你聽到了一個回音,那是什么?那就是拱頂。

我得到了一個新的循環結構,它在 COLOR Forth 中使用,我覺得它比另外的那些都好。這種方法是:如果我有一個字 WORD ,我可以實現對這個字 WORD 的某種有條件的引用。這就是我的循環方式。

WORD ~~~ IF ~~~ WORD ;
?THEN ~~~
;

我回到當前定義的開始 , 這就是我現在使用循環的唯一方法,它是足夠而方便的。它還有兩個邊際影響:一個就是它要求一種遞歸版本的 Forth, 這個字必須在當前的定義中被引用,而不能夠要求被預先定義。這就省去了 SMUDGE/UNSMUDGE 概念, ANS 正準備為這個概念找一個合適的名字。但是最終的結果是它更簡單了。

對于嵌套的循環這種方法當然很不方便,但是嵌套的循環畢竟是一個不確定的概念。你也可以有嵌套定義。你應該條件化地執行一個字,還是應該有某種像 IF THEN 這樣的結構?這個問題我們已經討論 15 年了。這里有一個例子,我想它說得很明白,唯一的循環是必須重復一個字。

WORD ~~~ IF ~~~ WORD ;
?THEN ~~~ ;

如果你這樣堅持做下去,能夠實現更徹底的因子化。這是我頭腦中的 Forth 的關鍵,你因子化、再因子化、再因子化,直到你的大多數定義都只有一行或者二行長。

(Jeff) 你也許指的是 WORD 之后的那個分號導致一個尾遞歸,可以把對 WORD 的調用轉為跳轉。

(Chuck) 所以你沒有理由進行一個調用,因為之后你不會到任何一個地方,你用一個跳轉就可以了。實際上在我最近所有的 Forth 中,像分號一類操作的意義究競是一個返回還是一個跳轉將依賴于上下文,其中的優化是由編譯器完成的。那是一個很簡單的回朔優化,實際上是節省了重要的資源,那就是返回棧。

在我的 i21 中,返回棧的深度中只是 17 個,使用這種嵌套結構的人可能會遇到麻煩,你不能嵌套得太深,使得不可能再進行下一步的程序設計。你也可以使用調用來得到像使用 GOTO 一樣的亂七八遭的代碼。你應該保持簡單。

這就是我能想起來的最近 Forth 所做的主要修改。可能 BLOCK 是個例外。 BLOCK 是一個有趣的塊訪問字,用于訪問磁盤的一個區?,F在我把它定義成訪問存儲器的一個區。沒有任何理由使用磁盤了,由于有了兆字節級的存儲器,你只需要把數據裝入存儲器,并從那里運行就可以了。由于需要磁盤, BLOCK 這個字就變得非常非常地簡單,基本的 BLOCK 定義是一個與 1000 的積:

BLOCK 1024 * ;

這就指定了你訪問的存儲器是 1024 字節寬。 BLOCK 的值是你為存儲器所做的分區值,它把你的存儲器因子化成可管理的片斷,你可以認為存儲器是由一個兆字節所組成的,也可以認為是由幾千個塊所組成的。

我看過 NASA 的一個網頁,現在想起來還很有趣。它說宇宙飛船的速度是每小時110,000 公里。因為我對這樣的數字沒有什么感覺,覺得如果把它轉換成每小時69,000英里可能就會好一些。不過,這些數字對于普通人來說還是沒有什么意義。我想應該把它轉換成每秒多少公里或者其它我們能夠感覺到的更小的數字。當我們使用 120M 字節的存儲器時,使用這么大的數字不會有什么好處,它只不過是一個很大的數字而已,雖然令人印象深刻,但并沒有什么用。所以 BLOCK 可以為我們進行適當的定標。

一個說法是 Forth 完全由程序員來決定。我愿意把這理解成 Forth 程序員應該做些什么。我發現教給了某人 Forth 語言,并不意味著他就是一個很好的 Forth 程序員了。在你能夠進行有效的工作之前,有一些 Forth 形式和語法之外的東西已經嵌入到你的頭腦中了。

我的觀點是:我看到的每一個應用,只要不是我自己寫的,它的代碼量就會是它實際需要的 10 倍。我也看到 Forth 程序員正在用所需要代碼量的 10 倍長的代碼來編寫應用程序。

我所關心的,我這幾年一直深思的問題是:我怎么才能說服這些人編寫好的 Forth ?我怎么才能告訴他們說編寫好的 Forth 程序是可能的?為什么人們編寫的程序是他們需要編寫的 10 倍?

微軟是這樣做的,我想大家都知道,但是他們至少還有一個理由就是他們必須與任何以前所做的事情相兼容。如果你不能從一張清晰的白紙開始,那么你就得寫更多的代碼。但是需要 10 倍的代碼嗎?好象是太多了。

一個程序應該有多大?例如, TCP/IP 協議棧應該有多大?我不知道。在我坐下來編寫代碼之前我不知道。但是它不應該很大,大約 1K 字就可以了。

i21 的每個字有 4 個指令。奔騰計算機每兩個字節一條指令。這很難判斷。你應該討論指令而不是指令駐留的存儲器的大小。

看來大約有 1000 條指令就能夠讓我做任何事情,所有的程序都應該是 1000 條指令長。

你怎么做得到呢?這里面有什么訣竅?你怎樣使應用程序很小?這里有幾件事情是在任何情況下、使用任何語言都應該小心地去做的:

沒有鉤子

第一件事就是沒有鉤子。不要留一個接口,想著未來的什么時候當問題變化時插入一些代碼,因為問題會以你不能預見的方式變化。反正這個成本肯定是浪費了。不要預測,只解決你眼前的問題。

不要復雜化

簡化你遇到的問題,至少不要使它變得復雜化。我自己就是這樣做的,很有趣。你遇到了一個令人厭煩的問題,在它之后是一個更有趣的問題。所以你應該為更有趣的問題編寫代碼,你所遇到的只是它的子集,它是微不足道的。但是,如果你努力地為這種微不足道的問題編碼,那就當然地為你所需要解決的問題編寫了相當于實際需要 10 倍的代碼。

10 倍的代碼意味著 10 倍的成本;編寫的成本,文檔的開銷,存儲器的開銷,磁盤的開銷,編譯的開銷,裝入的開銷。你所做的每件事情都要貴 10 倍。實際會更壞,因為復雜度是按指數增加的。

10x 代碼

10x 成本

10x 錯誤

10x 維護

10 倍的錯誤! 10 倍的維護困難在 Y2K 問題上給出了很好的說明。奇怪的是我看到人們都在用 COBOL 解決 Y2K 問題,把程序明顯地變得更復雜、更大、引入了更多的意大利面條式的代碼,這些代碼更不可維護。如果他們是使用 Windows ,那么 50 年之后,應用會再次崩潰。程序員們并不是擴大日期的范圍,而只是移動它,所以在 Windows 運行到盡頭的時候,它就會產生另一個問題。

這就是我們至今還在運行 10 年或者 20 年前老程序和為什么人們沒有錢去更新、理解和重新編寫這些程序的原因。因為它們太復雜了,比它們本來所應該有的程度復雜了 10 倍。

所以,你如何避免這個陷阱?你如何編寫 1 倍的程序?

1 倍, 1x 應該是一個網頁的名字

你因子化、因子化、因子化、因子化,你扔掉了所有不使用的東西、不合理的東西。

Forth 的全部在于你不能用 Forth 來編寫程序,而是用 Forth 來編寫字典。當你設計一個應用的時候,你寫出 100 個左右的字,它們可以描述應用,然后你使用這 100 個字寫出一行定義來解決應用的問題。找到這 100 個字并不容易,但它們是存在的,它們總是存在的。

讓我給出一個應用程序的例子,在這個例子中你不僅能夠減少 90% 的代碼,而且有一個情況可以減少 100% 的代碼。這個例子就是我們熟悉的文件。如果你在應用或者 Forth 系統中使用文件,你差不多有這樣一些字:

OPEN CLOSE READ WRITE REWIND 等等

它們可能不是這么短的字,比如,像在 Windows 中 OPEN-FILE 。如果你覺得這些都不需要,那你將節省實現文件系統代碼的 100% 空間。文件系統在一個典型的應用程序中并不是一個大個子的部分,但它是一個不常見的無用部分。確定了你要做的方面,說出了我們不需要做事情。我們不需要在校驗和頂上再來做一次校驗和。我們不需要編碼加密因為我們根本就不需要傳輸任何東西。你可以省去所有這些事情。

你現在看到的是一個全世界所有的程序員所遇到的所有問題的一個解,這個解是通用的,但是沒有任何人會遇到通用的問題。

我希望我告訴你的話能夠使你寫出好的 Forth 。我可以證明。我已經證明了應用程序代碼可以減少 90% ,在某些情況下可以減少 99% ,我可以做,但是需要一個案例一個案例地做。我一直找不到一般性的原理。

(Jeff) 我有一個問題是有關你 COLOR Forth 屏幕的。人們已經注意到你在屏幕上使用了很大的字體,但是只有較少的信息。它多少是由于你的視力?你每次看的時候有多少的信息受到限制?

(Chuck) 我對小字體越來越沒有耐心,幾乎不能閱讀網頁。直接去看那些字符模糊不清,戴上眼鏡看,它們還是模糊不清。如果加大字體,這有時能夠做到,有時做不到,會失去一些上下文。這是一個問題,可能對于大眾中不斷增加的群體來說都是一個問題。所以我盡量地使用大的字符,但是如果你把它們弄得太大,那你就會丟失信息。

現在一個用于設計幻燈片翻頁的經典規則是你拾取一幀然后在其中放入一些主題,你不能在一張幻燈片上放太多的內容,否則你的聽眾就會糊涂,如果你使用太小的字符,人們就不可能閱讀這些內容。

在 COLOR Forth 的情況下,我想字符也可能太大了。我可以一次在一個屏幕上得到 256 個字符。根據所使用計算機的不同,我可以得到 20x14 或者有時是 24x15 。這就足夠了。在 256個字符中,我得到的信息大約與過去 1024 字節得到的信息一樣多,因為我沒有進行格式化,甚至沒有任何的換行。在我的屏幕上充滿字符。

一個原因是我想探究彩色字的價值,如果我有一些帶顏色的字,那么不同的顏色將如何工作?我發現它們做得好極了,我不需要用定義字來格式化它們。當然,實際上并不好看,因為在屏幕的左邊好象有一個紅墻,如果你也使用這種方式,那就不一定非使用紅色不可。

我覺得你在做一個網頁時也應該使用這種哲學。在網頁上放入盡量少的信息,只要能把你想告訴人們的事情說清楚就可以了,不要弄得費話連篇。另一方面是不要在頁面上放一個索引。你只應該放入真實的信息,你需要把重要的信息加亮,你需要使它清晰和可讀。

要改變我的字體比較困難。我使用 32x32 像素點。下一次我可以使用 24x24 像素點試一試。

這種格式的應用程序很少是一個屏幕。一個應用程序大約是 2 個或者 3 個屏幕長,這與我在一個上下文中為一個應用程序所寫的代碼相當。

例如,我有一個應用程序,它把一個特殊芯片性能的譜顯示在屏幕上。這是一個漂亮的顯示,對于把信息表示成可理解的方式是一個很好的練習和重要的方法,如果以后你有機會看到它的演示,那一定是很有趣的。

小的應用程序。應用程序不是適當的字,小的代碼只做特別的事情,從來都不做通用的事情。

Jeff 使我想起了 Machine Forth 的另外一些概念。 Machine Forth 是一個我很愿意回憶的 Forth ,它使用在機器中構建的 Forth 原語來做一些事情而不是使用解釋器版本或者宏定義來做這些事情。這些事情之一就是 IF 。

經典的 IF 去除留在堆棧上的東西,這在 i21 上實現并不方便,所以 IF 把它的參數留在堆棧上,于是你就不得不經常寫類似 IF DROP 這樣的結構,但也不總是這樣,看起來似乎方便和不方便各占一半。它不再使用 DUP IF 或者 ?DUP ,也就是說有了這種方便性,就不用 ?DUP 了。 ?DUP 并不是個好詞,它在堆棧上留下了不同數目的東西,做這樣的事情很不明智。

IF

-IF

除了 IF 之外, Machine Forth 還有一個判斷 -IF 。這個字用于測試 0 ,那個字只用于測試符號位。我想你可能經常需要根據一個數是正還是負的來進行決策。但它并不是以那種方式工作的。在 COLOR Forth 中,我甚至不關心它怎么使用。

在過去的二十年中,世界已經發生了明顯的變化,但我想沒有人能夠預測出來,當我 50 年代第一次開始工作時,只有 7 臺用于計算的計算機。那時的計算機總是用來解決又大又長的算術表達式。我們所做的因子化工作就是把這些事情因子化,使得這些不必重復計算,它就可以運行得更快,那就是 FORTRAN 語言的全部觀點。這種傳統甚至到了今天還在影響著我們。

我沒有做過統計,但是我猜想今天的計算機,絕大多數都不是用來做計算的,而是在移動字節。如果你有一個瀏覽器,這個瀏覽器除了一次性地計算機屏幕的大小外,幾乎不進行什么計算。查看一個數的符號的概念可能并不像我想的一樣有用,幾乎所有的數都是正數,并不需要查看它們的符號?;谕瑯拥脑?#xff0c; Machine Forth 沒有減法操作。我把減法處理成 1 的補碼。

- one comp

這種做減法的方式并不方便。但是對于今天的應用來說,實現協議或者顯示文本,算術運算是不需要的。一個計算機不應該為算術運算進行優化,我的計算機也不是。

另一方面,為了數據傳輸方面的優化,實現一個增量存取操作就很有用。地址是在任何計算機上都有的問題,但在 i21 上這是一個更特別的問題。在 i21 上,地址是一個 20 位的數,為了裝入一個地址,你最好做一個文字常量的取,它可以取出 20 位的擴展字。需要一個附加的存儲器裝入周期,之后你可以進行存儲器讀取,這又需要另外一個存儲器周期。所以地址的處理非常昂貴,你應該盡力使它最小。取加 (@+) 操作字對此有所幫助。你把一個地址放入地址寄存器中,然后它就存在那里。如果你執行 @+ , A 將被增量,你就可以連續地讀取后面的內容了。同樣,你也可以存入一串東西。當然在需要的時候,你還有不進行增量的取 (@) 和存 (!) 操作。

在經典的 Forth 系統中并沒有這些操作,我想在標準中也沒有提及。它們導致了一種完全不同的程序風格。在 DO LOOP 的情況下,最有效率的事情就是把實際的地址作為循環參數,然后通過字 I 讀出它,在循環內部進行對 I 的取 (I @) 。 DO LOOP 與地址一起工作,如果你做這些,如果你使用讀加操作 (@+) ,那你就不需要 DO LOOP 了,你也不需要 I 了,你在循環中使用讀加 (@+) 就可以每次讀出不一樣的事情,它們不同但是等效。你可以把一個轉換成另一個,方便地讀取那些地址在 A 寄存器中的東西。

在 MOVE 的情況下,你想把某些東西從存儲器的一個區域移動到另一個地方,你就需要兩個地址,因此作為地址的值存儲在 R 寄存器中,因為只有在一個上下文中你才可能把地址放到 R 寄存器中,它有一個自動增量能力。所以我基本上有對于 A 的取加 (@+) ,對于 R 的取 R 或者存 R ,你可以有效地進行 MOVE 。

這就引出了另一個問題。 A 除了作為地址寄存器使用外,它還非常像一個局部變量,你可以在其中存一些東西,過一會兒再讀出來。把它作為一個地址寄存器的原因和我使用它的原因是一樣的,從字面上講,它為地址訪問提供了一個機制( (@+) 。從程序員的角度看,它比放在堆棧上的地址更方便。但是如果你準備反復地訪問這個寄存器,就必須把它放在一個你可以對它進行增量的地方。為了放置它你必須訪問那個寄存器,如果你能夠做到這些,你就可以使用這個寄存器做別的事情,就像你使用返回棧做別的事情一樣。

不同之處是如果你把一些東西放到返回棧上,還必須記著把它拿下去,對于 A 寄存器就不用這樣了。有人試著把 A 作成一個堆棧,使得你可以把一些東西 PUSH 進去或者 POP 回來,是不是值得這樣做并沒有一個明確的答案??隙ㄐ枰嗟闹噶钊ピL問 A 。你希望 DUP A ?你需要 DROP A ?現在這種 A 的方式是最容易的。

我也許還需要一個寄存器稱為 M ,可以在 40 位的乘法中保存一個乘數。但是我的系統中并沒有足夠多的乘法要做,所以這件事還沒有成為現實。

但這樣一個寄存器卻引出了一個局部變量的問題。有許多關于局部變量的討論,這是在你的應用中能夠節省 100% 代碼的另一個方面。我堅信局部變量不但沒有用,而且很有害。

如果你正在編寫需要使用局部變量的代碼,那么你就是在寫……非優化的代碼?不要使用局部變量。不要出現新的語法來描述它們,不要出現新的策略來實現它們。如果你有局部寄存器你就可以使得局部變量很有效,但是不要這樣做。它不好。它是錯誤的。

變量是必要的。 COLOR Forth 需要許多的系統變量,當你編輯某些東西的時候,光標位置變量也非常有用。當你回到光標位置的時候,因為變量的值還在那里,所以你就能夠回到原來的位置。變量很有用,我沒有看到任何只使用少數變量的情況,也沒有看到使用瞬時訪問變量的情況。

聰明、解釋堆棧圖、給一個字命名,這些都是練習。你可以進行所有這些游戲。我想 Forth 程序員可能用他們已有的工具進行了太多這方面的游戲,因為沒有應用。如果一個 Forth 程序員能夠更多地關注應用程序而不是更新工具,那就更好了。

對于我來說,一個應用程序就是 Web 瀏覽器。如果你無事可做,那就寫一個瀏覽器。 Netscape 并沒有完成這件工作,沒有做到它應該能做到的樣子、沒有實現它應該有的功能,。事實上 Netscape 和 Microsoft 都從 Mosaic 那里借用了大量的東西,它們看起來就像是孿生的東西。如果還是用同一種語言編寫的,那種語言就是 FORTRAN 。

寫一個新的瀏覽器。這是一個很好的應用。它能夠使你訪問信息世界,我將在業余時間關注這個好應用。

感謝各位的收聽。

總結

以上是生活随笔為你收集整理的1x Forth的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。