巧然天成的 RUN 指令
曾慶潭 Ching-Tang Tseng
ilikeforth@gmail.com
Hamilton, New Zealand
2 August 2026
實踐確實是檢驗真理的唯一標準,真正親自動手做過事情的人,才有資格講這句話,能講出這句話的人,也才能體會出真理的可貴。我是以整合許多名家作品的方式,設計出 ABC FORTH 數學計算系統,憑心而論,名家作品中的許多伏筆,均非淺顯而易見,設計當初,我自己並不完全知道系統竟然另外擁有許多性能,這樣的問題,唯有依靠實踐來檢驗,本文討論一些這種特性。
這個系統擁有遠大的前程,充滿著無限的發展希望,就如同 FORTH 程式語言可以無限制成長的本質一樣。但其意義並非單純的只是指令名稱可以無限的增加,也不是發展到可以直接應用於處理問題後就此作罷,而是顯現在系統無窮的性能增建能力上。這種吸引人的特質,經常會令我只顧勇往直前添加新的設計,不顧驗證已經完成的成果;只想拼命的增添系統性能,無暇管它到底能做甚麼?
如果仔細回顧我所參考過的名家設計,確實能夠體會出許多可圈可點的名家技術,但是,如果只是照抄這些技術,缺乏自己的組織構想,最後必然難成氣候,在我設計的系統中,可舉出來的這種例子很多。 ABC FORTH 數學計算系統內,由 FORTH 轉進 BASIC 式環境後,其中一個性能特異的 RUN 指令,就是一個最典型的例子。
我設計 ABC FORTH 系統時,最原始的根據是莫查理(Charles H. Moore)於 1981 年發表的論文,裴麥克(Michael Perry)隨後將其改寫成 fig-FORTH 的版本。此後,因為只須照抄,我們便能很快的將同樣設計轉進了 F83 系統,繼續維持它的存在。
翻閱這些過去的舊記錄,很容易看得出來,幾位名家都只將 RUN 指令,當作 BASIC 程式語言中,最原始定義的意義來設計。那種 RUN 指令,只能讓單一個 BASIC 程式被系統執行,與我所設計的 RUN 指令不同,我的 RUN 指令,允許無限個 BASIC 程式可以被系統執行。
因為,當時,大家只想驗證出 FORTH 很容易設計出 BASIC ,確實也辦到了,但沒有人想到要根據 RUN 指令的特性來改善系統性能。
近代 FORTH 大型系統中,健全的浮點數計算能力,以及由作業系統自然融入 FORTH 系統的中文顯示功能,是兩件吸引我選擇這個時機,在 FORTH 系統中重現 BASIC 功能的主要因素,其他大型 FORTH 系統優秀的特點都在其次。
2008 年,我在 Win32Forth 系統中完成加建 BASIC 功能的初期,並不看好這樣的設計。道理無他, 1964 年發明的 BASIC 舊觀念並不吸引人,舊觀念還有許多長期被人攻擊的缺點,例如: BASIC 中的 GOTO 指令,會令龐大的程式,形成麵條式的結構,自認為是電腦專家的人,就拿這樣的論點來嘲笑 BASIC 。我自己從不這樣批評 BASIC ,相反的,還特別鍾愛 GOTO 這種指令,道理無他,一切電腦軟體的基礎 -- 組合語言中,凡會跳躍分支的 jump 指令,都與 GOTO 相當。因此,無 GOTO 何來其他所有的程式語言?講句不客氣的話,結構化程式語言中,想添加能讓系統不出亂子的 GOTO 指令,根本很難設計,排斥 GOTO 的專家,是不是酸葡萄心理?確實難說。要不然,請以實踐檢驗真理,檢驗完了,大家也可以不用,以尊重您高尚的論調。
我常認為,自封為專家的人,都應該謹言慎行,他們的一舉一動,對社會影響重大,性能非凡的 GOTO 指令就是這樣被毀掉的。但是,請仔細想想看,多少人過去就用 GOTO 完成了多少偉大的事情? GOTO 對整個社會總的貢獻,絕對比任何一位自以為高尚的電腦專家要來得多多, GOTO 何辜?
為了這個 GOTO ,我長期思考對應之策,因此,系統設計完成之後,足足有半年時間,我並不想對任何人介紹我所設計出來的系統。思考的問題,就是如何解決被批評為『麵條式程式』?的問題,而且設定了自己的打算,如果解決不了,就不要推出自己的設計,因為歷史已經淘汰了傳統的 BASIC 。
最後,自己私下決定,經由 RUN 指令來代勞,改變它的特性,而且解決辦法精簡之至,僅只是大膽起用一個從不被列入作為標準指令,卻是每一個 FORTH 系統內必定都有的天王指令『INTERPRET』。此一自創附加技術,是一種巧然天成的安排,足夠擠進名家之流,讓我敢將自己的設計,加寫進入 Charles H. Moore 的名著,從此與他的技術共存。
在前已刊出的好幾篇文章中,可以見到 INTERPRET 指令的全盤精神,它主宰 FORTH 系統的一切。 FORTH 系統執行起來之後,系統等待著接受輸入。一旦有了輸入,就從系統中比對輸入是否為一個指令? 是,就將其執行掉,不是指令,就試著將輸入轉換成數字,轉得成就放在堆疊上,轉不成就反問使用者,這是甚麼東西?然後永無止境的繼續循環,這麼簡單的主宰工作,就由 INTERPRET 完成。
教科書不教使用者如何用它來設計程式?或如何發揮 INTERPRET 指令的基本精神?我在這裡傳播這種技術,是補技術傳承上的不足,只是聊表善意而已,沒料到好心有好報, 2011 年 4 月起我開始使用 ABC FORTH 系統設計一些略有規模的應用程式,便實踐出了許多 RUN 指令的好處。此前,這些特性,連我這個系統的設計人,自己都不知曉。
系統中的 BASIC 程式,原本只強調用來改善 FORTH 執行數學計算程式的能力,其他的功能,全依靠 FORTH 原有的基本性能,都能另外完成。這樣的思考方式,確實是輕忽了 BASIC 在 FORTH 系統中的地位了,好像只宜將數學計算交給 FORTH 中的 BASIC ,其他的都不適宜。但是,實踐大型程式的設計後,才發現,其實不然!
三年前,我只耗用了大約 6 頁的程式,設計出 ABC FORTH 數學計算系統。最近卻耗用將近 20 頁的規模,設計出一個性能優越的大型應用程式。為了增加使用上的彈性,還刻意盡量將大型應用程式,分割成最小單元的模組化格式。最後,就靠可以不限使用次數的 RUN 指令,來整理出更清楚明確的結果。 RUN 指令的內容,相當於只有 INTERPRET , RUN 存在於 BASIC 中時,就好像是 BASIC 可以叫用執行無數個 FORTH 系統。他的巧然天成特質,絕對能令人嘆為觀止。
以前,我在使用傳統 BASIC 設計大型信號處理程式時,經常苦於系統不允許使用者,可以同時開啟好幾個被順利執行的程式,而必須進行繁雜的人工操作。例如:我建成過一套系統,能夠自動讀進輸入硬體數據信號,系統可以選擇要不要進行信號的過濾處理?或直接進行從時域(Time domain)轉換成頻域(Frequency domain)的快速傅利葉轉換(FFT,Fast Fourier Transform),最後,還有決策程式必須執行。那時,一次只能開啟一個程式被 BASIC 系統執行,用起來痛苦得很。因此,每當見到 FORTH 同好在精研其他的 BASIC 系統時,我首先向他請教的問題,就是這個 BASIC 一次能跑幾個程式?答案是,就算行,數量也是非常有限的。 ABC FORTH 隨您設計,跑幾個都行,直到系統記憶體容量裝不下了為止,這種性能,靠的就是巧然天成的 RUN 指令。
這個 RUN 指令的性能,首先讓『麵條式程式』不見了,就按照電腦高尚專家的踹言踹語,設計符合他們要求的程式,我將 BASIC 大型程式全面模組化,僅只剩下幾個 GOTO 指令,自由使用於單一模組之內,以少於一個螢幕畫面的短程距離內自由跳躍,沒有看不懂的地方、沒有分析不了的流程、沒有不安全的例外、沒有陷入無限循環的可能,這些缺點,全都不會再在程式中發生了。
不再有開檔數量限制之後,許多程式也不用自己重新設計了,就大方的用滑鼠去複製別的程式,供自己使用。嫌別人純用 FORTH 寫成的程式,不容易看懂,日後會有追查上的麻煩,索性就直接黏貼在上或下方,然後邊追蹤、邊改寫成我的 BASIC 格式程式,結果是程式永遠可以看得清楚明白,更加好用了。這樣做,改成的 BASIC 程式,並不會增加記憶體的耗用量,也不會令執行速度變慢。因為,前引的列首編號不會被編譯進系統,而且 BASIC 式的一列程式,除數學式子之外,都只會被編譯成單一個 FORTH 指令而已,程式被執行的速度當然不會變慢。也沒有多耗用記憶體,這種情況,就形同原為橫式書寫的 FORTH 程式,現在改為直式書寫的 BASIC 程式,如此而已。
這兩段敘述,告訴大家,我改善了 FORTH ,同時也改善了 BASIC 。更有甚著,可以建議有心的讀者,仿照同樣方法,將別的程式語言建進 FORTH 系統後,改善它們的性能。有一位小老弟,熟 LISP ,他也留心國際舞台上用 FORTH 設計出來的 LISP ,何不試試我的建議?自己跟著創造出另外一套別有風味的 FORTH 中的 LISP 。也有人用 FORTH 設計出 C ,何不像我一樣?大膽起用巧然天成 RUN 指令的來源 INTERPRET ,建成之後,絕對能帶給您意想不到的效果。如此必能實現由 FORTH 來統管一切程式語言的性能,這些 FORTH 哲理的高度運用,絕對不是我一個人的專利,但也不是應該由我來實現它們的責任。
像我一樣,單只搞 FORTH 的同好,透過這篇網文,您熟讀融會貫通之後,也應該可以大大增高自己的 FORTH 功力。學一個沒人教您的 INTERPRET 指令,可以在 FORTH 系統中再執行 FORTH ,讓程式有多重層次性,這在除錯系統中的斷點式性能規劃上可以用到。也在 FORTH 駐留後再執行一個 FORTH 時,可以用到。其他還有許多例子可以舉出,用法是不勝枚舉,我寫不完。但請大家記住, INTERPRET 是每一個 FORTH 系統都有的指令,卻不是一個標準指令!
坐而言不如起而行,我就用 RUN 指令將 FORTH 翻譯成 BASIC 給您看。在 Win32Forth 系統中繪出柵格線原為 FORTH 格式單一指令 GRID 的程式如下:
沒有留言:
張貼留言