2025年10月1日 星期三

游標控制

游標控制


曾慶潭 Ching-Tang Tseng
ilikeforth@gmail.com
Hamilton, New Zealand
2 October 2025


在 Forth 系統中,由於控制游標是一個與硬體顯示視窗有關的問題,控制游標的指令不被列入標準指令中。

Forth 系統在印出訊息時,控制印出訊息之格式的能力是很強的,這在此前本網頁的眾多例題中可以看得出來。與印出訊息有關的指令是 EMIT, SPACE, SPACES, CR, TYPE..... 等,以及所有與印出數字有關的指令 . (dot), U. (U dot), D. (D dot), R. (R dot), D.R, U.R, # (sharp), <#, #s, #>..... 等等指令。

上述指令均使用於系統游標到達當時所處位置後的控制,不需要將游標跳往視窗中其他的任意位置。能辦到任意跳動之功能所需要的指令,傳統上將其名稱定名為 gotoxy ( x y -- ),意思很直接,不需要特別解釋。橫是列,直是行, x 是第幾列的數字,y 是第幾行的數字。

只要是跟硬體有關的操作指令,通常都不在初建 Forth 核心基本系統時被列入考慮,以簡化發展。因此,許多精簡的 Forth 系統都不具有 gotoxy 指令,我個人愛用的 32 位元 Win32Forth 系統具有,但轉入 64 位元後的 Lina64 Forth 系統沒有。

很幸運, Lina64 Forth 系統的作者,根據 Linux OS 的性能,提供了一個易於借用作業系統中現成功能軟體來完成某些特定工作的指令,名稱叫作 system ( sc -- )。它很有用,善用它,就知道如何來擴充系統各種的功能,想設計出 gotoxy, !xy, @xy 這一組指令時,就能靠 system 指令完成設計。

要如何設計? 寫一大堆說明,不如給大家實際範例。讀過本文中的下列程式,使用過簡單範例 main 後,大家就很容易了解這種程式技術,它在許多場合能被依樣畫葫蘆,例如:我在設計語音輸出、操控其他語言或系統或軟體、取放與硬體相關的數據.....等等等問題時都派上用場。

這一個簡例,可作為如何運用 system 指令的標準範例。實際上,我在想要觀察記憶體內容會高速變化的狀況時,它會非常有用,否則,只能採用一直橫列印出數據的方式高速滾動列印出結果,對高速動態變化內容的數據變化狀況很難觀察與體會,其感覺係寒天飲水,冷暖自知。這樣的使用實例,在2025年5月2日貼出的網文 『時基』一文中展示過。但該文內未提及此 gotoxy 指令組的來源,它係加裝 tput 公益應用軟體後獲得的可加裝功能,加裝 tput 軟體按下列操作便能獲得:

$ sudo apt-get install tput

至於有關 tput 使用時該如何給予指定參數與指定的文字命令? 這些規定不在此處的討論範圍,讀者必須從網上自行了解,以下設計內容是在熟讀資料後才進行設計。

我們在發展與同一作業系統中並存於世之公益軟體的應用時,必須學會這種本領。沒有同時並存於世的公益軟體可用時,想自行設計出同樣的功能,並不是一件很容易的事情。所以我們在獲得了這許多的好處時,應該感謝那些貢獻者,我無法一一點名致謝,只能在用到時宣告。

我剛檢查過,使用 Ubuntu 20.04 版本的作業系統時有 tput 軟體可自由加裝,在 ARM 環境的作業系統,均暫時尚無類似 tput 的軟體可供加裝。

在某些 Forth 系統中也許不採用 gotoxy 指令命名,且功能略異,但共同目的都是設法便於控制游標,例如一次性的把游標跳到往下數列、數行的位置,其指令名稱可能是 at-xy,他有別於此處討論的 gotoxy 性能,at-xy 所提供的性能,因為游標只能往下跳,設計時可以不涉及硬體控制,使用時,請自行注意。

另外,具有多工性能的 Forth 系統,就能根據游標可以前往任意指定位置再回到原本位置的特性,而設計出可在同一視窗內能同時顯示多項內容的畫面,這樣,執行 gotoxy 後的顯示效果,就可以是動態的,或者是可以瞬間就暫態變化的。這一部份,涉及多工應用,不在本文討論範圍之列。


 
\ gotoxy

: test
  s" tput sc " system
  begin 
  s" tput cup 0 40 " system
  getticks 0 20 D.R
  key? 
  until 
  s" tput rc " system 
;

: !xy  s" tput sc " system ;
: @xy  s" tput rc " system ;
: gotoxy ( x y -- )
  s" tput cup " $buf $!
  swap
  (.) $buf $+!
  32  $buf $c+
  (.) $buf $+!
    0 $buf $C+		\ must to be used at the end
  $buf $@ system ;

: main
  !xy
     begin
           0 40 gotoxy 
           getticks 
           0 20 D.R
     key?
     until
  @xy 
;


2025年9月15日 星期一

為eForth設計高階定義的DO...LOOP指令群

為eForth設計高階定義的DO...LOOP指令群


曾慶潭 Ching-Tang Tseng
ilikeforth@gmail.com
Hamilton, New Zealand
16 September 2025


 

\ High level defined DO…LOOP words set for eForth
\ Author: Ching-Tang Tseng , New Zealand , 10 Dec. 2008
\ Reference: (1). FORTH DIMENSIONS, V. XIII No. 6 , p.34 , Rob Chapman, 1992
\ (2). MASTERING FORTH, Chapter 12, p.172 , Martin Tracy, Anita Anderson, 1989
\ (3). FORTH ENCYCLOPEDIA, Mitch Derick & Linda Baker, 1982 
\ (4). ALL ABOUT FORTH, Glen B. Haydon, 1982
\ (5). eForth Implementation Guide, Dr. C. H. Ting, 1990
: (DO)  ( limit, index - - )
 SWAP R> SWAP >R SWAP >R >R ;
: (LOOP)  ( - - )
 R> R> 1 + DUP R@ <
    IF >R DUP @ +
    ELSE R> DDROP CELL +
    THEN >R ;
: (+LOOP)  ( n - - )
 R> SWAP DUP R> + SWAP 0< OVER
 R@ < XOR
    IF >R DUP @ +
    ELSE R> DDROP CELL +
    THEN >R ;
: DO COMPILE (DO) HERE ; IMMEDIATE
: LOOP COMPILE (LOOP) HERE - , ; IMMEDIATE
: +LOOP COMPILE (+LOOP) HERE - , ; IMMEDIATE
: LEAVE R> DROP R> DROP R> DROP ;
: I=L? R> R> R> DDUP >R >R = SWAP >R ;
: ?DO [COMPILE] DO COMPILE I=L?
     [COMPILE] IF COMPILE LEAVE
     [COMPILE] THEN ; IMMEDIATE
: J R> R> R> R> DUP PAD ! >R >R >R >R PAD @ ;
: K R> R> R> R> R> R> DUP PAD ! >R >R >R >R >R >R PAD @ ;



為了方便讀者節錄程式,與本文切要相關的資料領文先行,引用時請尊重原始出處。

1. 緣起

採用eForth32發展地震早期警報系統期間,希望轉殖Tiny BASIC Compiler程式於此系統時,遇到下列設計:

… ?DO … IF…LEAVE THEN …+LOOP…

因eForth缺DO … LOOP指令群,致使希望直接引用程式的目的無法立即實現,甚覺遺憾。若欲修改程式,則因結構煩瑣,費時費事,因而暫時中止了發展,只希望有機會能設計出此指令群,以便日後又有其他程式想直接套用時,更為方便。
此事顯示在發展新系統的初期,發展者最好考慮歷史的包袱,不要將任何傳統習慣隨便棄之不顧,否則日後有好的現成程式可資利用時反成困擾。當然,eForth原作者繆比爾(Bill Muench)已經表明他個人喜好FOR…NEXT勝於DO…LOOP。只用FOR…NEXT也一定可以設計出任何你想要的有限迴路程式來,本人也數度如此實際運用於須要的程式中,證明所言不假。
我尊重Bill Muench的個人見解,但我也尊重任何可貴的前人設計,二者皆不可棄。欲解決因此而導致不能相容的問題,最好的辦法就是自己動手建立起兩者間的友誼橋樑,給自己也給世人帶來永久的便利,我參考了前人已經提供的資料與技術,整理出此指令群與世人分享。
所要設計的指令群,還強調必須用FORTH高階定義的方式完成設計,才符合eForth精神。此前,我們已經有無數的FORTH系統可供參考來設計此指令群,但全都是以低階方式完成的設計,只能參考,不能照抄。eForth精神的可貴處,就是在其發展初期,係以簡化整體結構為主,只有少數限量的基本指令要用低階方式設計,執行效率不是強調重點,系統中大部份指令則都用高階定義方式完成設計。因此,若欲將DO…LOOP指令群也加入eForth的範本系統,卻又不破壞其原始精神,就必須是高階定義方式完成的設計。
以eForth為起點發展出FORTH所有功能的觀念一直強烈的深植我心,我希望能以實務進行驗證。我已見到了許多人在各種CPU上的努力成果,這是橫向的實例,表示未來出現任何新的CPU硬體,FORTH都可在第一時間,以最迅速的手法立即跟隨實現。然而,向上繼續加強的垂直發展則仍有廣泛空間,很須要好手透過實際使用經驗來累積成果,達到所謂『不做不知,一做便知』的進展。我在這次刻意挑選典型eForth32系統來發展應用程式期間,發現了這個問題,覺得可能會是未來eForth被引用時的障礙,只要力有所逮,不必推卸責任,應該促其實現,因而花了一點心思,設計出可以久放的程式。

2. 程式設計經驗

完成這個指令群設計的經過是一次很好的經驗累積,其中有許多寶貴知識是從FORTH專業書本中學習得來的,也有自己經過思考後,新獲得了對FORTH的深刻體認。一般而言,很少有人會為文介紹FORTH的核心指令是如何設計出來的?就像學術論文的發表一樣,常略去一些寶貴的研究細節。我們看FORTH系統的源程式時,看到的是創作人的最終成果,看不到創作人研發期間的心路歷程。如果學習FORTH或用FORTH發展程式,能同時學到一些傑出的設計方法,必然是很有助益,本文留下一些此方面的記錄資料。

3. DO、LOOP、+LOOP

在廣讀群書後,找到一份最接近設計要求可供參考的文獻是來自FORTH DIMENSIONS 1992年3月出版的V. XII No. 6期刊,作者:Rob Chapman在期刊的讀者來書欄中提供了一些高階定義方式完成的FORTH指令設計,上列(DO)、(LOOP)、(+LOOP)三個核心指令便來自該文,純高階方式完成的漂亮定義,引用時僅將ENDIF改成對應的THEN,CELL在eFroth32中使用4,其他均直接引用。相關於此指令群的其他指令設計則未在文中出現,因此,必須另行設法。
由於此指令群除?DO指令外均屬於F83標準指令,在『FORTH Encyclopedia』及『All About FORTH』兩本書中可以找到指令的詳細說明與執行細節,整理出DO、LOOP、+LOOP三指令的相關設計,以倒敘法列出如下:

: DO COMPILE (DO) HERE 3 ; IMMEDIATE
: LOOP 3 ?PAIRS COMPILE (LOOP) BACK ; IMMEDIATE
: +LOOP 3 ?PAIRS COMPILE (+LOOP) BACK ; IMMEDIATE
: BACK HERE - , ;
: ?PAIRS ( value1, value2 - - ) – 13 ?ERROR ;
: ?ERROR ( flag, error message number - - )
SWAP IF ERROR ELSE DROP THEN ;

更進一步的ERROR指令追蹤不擬繼續了,因為早期系統的完整設計,多加了在編譯過程出差錯時要提示使用者訊息的功能,我們的eForth力求精簡,指令設計的內容能省則省,但仍要不失其基本功能,套用的結果就得到了本文中這三個指令的最精簡設計。

4. LEAVE

不幸,另一個同為標準指令的LEAVE,書中全以低階定義的方式進行解說,一時也看不出其關鍵意義,最後放棄了參考書本中的說明,改採自行思考尋求解決方法。
我記得fig與83標準的差異中,LEAVE性能不同屬其中之一,fig於LEAVE被執行時,在DO…LOOP中,由LEAVE到LOOP之間的剩餘程式仍然會被執行最後一次,而83標準則由LEAVE直接跳至LOOP之外。
根據這個靈感,產生了純用高階定義方式設計出LEAVE的方法,可以強迫留在回返堆疊內的兩個DO…LOOP有限迴路指標之值相等,系統便會在檢查指標值時因相等而跳出迴路,問題是這樣的LEAVE規格就等同於fig標準,自LEAVE至LOOP之間的程式仍然會被執行最後一次,它的設計方式如下:

: LEAVE R> R> DROP R> DUP >R >R >R ;

測試的結果也差強人意,勉強有了一個fig標準式的LEAVE指令可用了,但仍心存遺憾,還想從書本中找出更好的設計,使之符合83標準,可惜身邊資源並不豐富,網上FORTH DIMENSIONS資料要逐期瀏覽又非常辛苦,因此又回到自行思考的模式來解決問題。
有一天心血來潮,想到了如果能用強迫迴路指標值相等的方法來終止迴路,那麼,系統隨後豈不也得將回返堆疊上的兩個無用指標值丟棄以終止迴路?我何不更進一步,讓LEAVE主動進行丟棄的工作?在執行LEAVE時,迴路的兩個指標值放在回返堆疊的第二及第三個單元內,第一個單元內放的則是指到LEAVE後面那一個指令的位址,若要執行LEAVE離開迴路,此執行位址就可以不要了,因此,可以確定LEAVE被執行時應該一次要丟掉回返堆疊上最頂部的三個值,至於第四個單元內放的是那一個執行位址?當時我也毫無概念。
設計程式測試就會得知結果,因此,再將LEAVE指令重新設計如下:

: LEAVE R> DROP R> DROP R> DROP ;

測試結果令我驚訝!達到目的了!當我再度閱讀范瑞克(Rick VanNorman)在Os2中設計的eForth系統源程式時,見到了低階設計的LEAVE指令內容,它就是以組合語言直接執行將回返堆疊指標減去三個單位量的方式完成的,現在了解它的真正意義了,也知道回返堆疊指標用的是CPU內的暫存器,高階指令無法直接更改其內容,只好連續棄除三個值來達到目的,上列意外完成的設計是對的。

5. ?DO

這個指令不屬於標準指令,因此在上述基本參考書中找不到相關資料。它也不是一個非有不可的指令,一個?DO…LOOP形成的結構,可以用下列程式取代:

2DUP = IF 2DROP ELSE DO … LOOP THEN

亦即,前面一序列程式可以取代?DO,但最後面兩個黏在一起的指令也得同時被使用,才能取代整個?DO…LOOP,若所配合的成對指令是+LOOP時,情況相同。以人工方式調整出對應的程式,不是此處要強調的重點,設計出?DO才是主要目的。我也不希望因為要增加一個?DO,卻必須回頭去修改已經完成了的LOOP及+LOOP指令。如此一來,就得自行思考解決辦法了。
崔馬丁(Martin Tracy)是一位設計FORTH系統的個中好手,台灣Forth同好都不應忘記當年我們採用他設計的MicroMotion Forth-79系統當推廣標準時,只買了一份他的創作,他的系統非常好用,完全透通,他算是讓FORTH在台灣推廣起來的偉大貢獻者,我們應當經常心存感激。他也有不少有關FORTH的著作,在他的『MASTERING FORTH』這本書中,我找到了有關?DO指令的設計方法,第十二章介紹Compiling words時解釋得非常詳盡,MacFORTH系統也已經採用這個方法讓?DO指令存在系統之中。但是,研究他介紹的設計後,就可以發現,前面已經設計好的DO、LOOP、+LOOP的執行內容都得跟著再增加變化方能配合,非我所願。
拜讀Martin Tracy的大作,給自己增加了設計FORTH程式時的另外一個新的技術經驗,他特別指出:集結一序列指令來替代另一指令的技術,稱之為巨集指令擴充法。( The technique of substituting one sequence for another is called Macro expansion. ),也舉了一個簡單例子,介紹在FORTH環境中要如何運用這種技術?例子是:
: 2DUP OVER OVER ;
: 2DUP COMPILE OVER COMPILE OVER ; IMMEDIATE

這兩種設計完成的指令,都可以達到相同的功能,但在後續的使用上,後者被限制成要用[COMPILE]指令來配合編譯。可是當系統隨後執行到2DUP時,兩種設計就會呈現絕對不同的執行方式。僅對這兩種設計進行比對時,前者多了兩個額外負擔的動作,首先要將執行位址碼從FORTH系統IP擠入回返堆疊,然後才執行兩次OVER,末了還要多執行另一個動作,必須將原擠入回返堆疊的執行位址碼取回,置入FORTH系統IP。而後者就直接執行兩次OVER,完成2DUP所要求的功能。後面這個設計顯然執行速度較快,它就是一種所謂的巨集指令擴充法的技術,與一般FORTH ASSEMBLER中經常用到巨集指令的功能完全相同,習慣上又被稱之為使用了指令別名( Aliasing )。
這是一種很可貴的技術,也讓我能實現?DO的設計。因為我已解決了LEAVE指令的問題在先,利用已存在的LEAVE,以及Martin Tracy所傳授的巨集指令擴充法,我便可以不用更改其他DO…LOOP指令群內已有指令的內容結構,亦能完成?DO指令的設計。
如果再添加一個檢查迴路二指標數是否相等的指令如下:

: I=L? R> R> R> DDUP >R >R = SWAP >R ;

那麼?DO的實際意義就可以等同於下列程式的意義,但不能就這樣直接使用:

DO I=L? IF LEAVE THEN

巨集指令擴充法設計出來的指令,都必須是立即執行式的指令,因此,?DO最後被設計如下:

: ?DO [COMPILE] DO COMPILE I=L?
[COMPILE] IF COMPILE LEAVE
[COMPILE] THEN ; IMMEDIATE

有限迴路的使用,除了使程式能固定的執行幾次迴路外,迴路內部程式有時可能必須使用迴路被執行當時的指標量,對單一層的迴路而言,迴路指標的引用指令,習慣上稱之為I,這個指令對FOR…NEXT型的迴路或DO…LOOP型的迴路而言,沒有差別,均可使用此同一功能的指令I,而I的內容則為R@的意思,也就是取用回返堆疊頂端之值,便可得到迴路執行當時指標之值。
但若有限迴路的使用不只一層時,單使用一個I指令便無法獲得各層正確的迴路指標值,必須設計相同意義但內容不同的指標引用指令,我們習慣上將其稱之為J、K、L、…等,它們的高階定義型式設計,依理,便是由回返堆疊中更深位置的單元來取得,J為第四個單元,K為第六個單元,L為第八個單元…。

6. 延伸性的應用

如果完全了解上述說明,就可以進一步設計系統中須要的其他類似指令了,例如:eForth32中缺乏從FOR…NEXT跳出來的類似LEAVE指令,用騙的,騙系統迴路指標已經是0了的設計,就是fig標準的LEAVE,如下:

: LEAVE-fig R> R> DROP 0 >R >R ;

被執行時,從LEAVE-fig至NEXT的程式還會被執行一次。要符合83標準的LEAVE應該是:

: LEAVE-83 R> DROP R> DROP ;

為了尊重Bill Muench只設計FOR…NEXT的個人觀點,我贊成別的系統也可添加。而Win32Forth中缺此指令,我們也不該厚此薄彼,放任其缺乏而不顧,我為Win32Forth設計它們如下:

: (NEXT)
R> R> DUP
IF 1 - >R ABS>REL @ REL>ABS >R EXIT
THEN DROP CELL + >R ;
: FOR ( n - - ) COMPILE >R HERE ; IMMEDIATE
: NEXT COMPILE (NEXT) APP-, ; IMMEDIATE
: I@ R> R> DUP >R SWAP >R ;

看懂了前文,這裡就不用解釋設計內容了,在我心中,迴路指令群的紛爭想法,到此也已天下太平,皆大歡喜。

7. 其他的檢討

也許有人根本就不喜歡eForth,比較起來,其他的FORTH系統性能比eForth好太多了,所以不想浪費時間在搞這個舊系統、舊學問上面,可能會認為此處留下的相關文章形同無用之物,沒有價值。
我倒認為,做為一個FORTH的傳承者,眼光要放遠,不要拘泥於一時的不得意,而心胸狹隘放棄發展,要知道目前的流行並不代表未來的世界,試想,如果微軟明天就收攤了,那一種FORTH才表現了永恆?
eForth還有很多的不好用處,我所用的eForth32甚至於沒有FORGET指令,每次設計錯了,都得BYE掉重來,要上XP系統,就得換跑Os2的版本,它的EDITOR要藉助於Microsoft Word來編寫才好用,缺與視窗的連結功能……..等等等,許多的不方便,讓使用者覺得真是不好用。也許只有我們從艱苦環境中長大的人才能忍受這許多的不便,但要知道,全世界公認最好的poly Forth系統,它在使用上也一直都有許多的不便,它卻依然賣得很好,顯然很多人買來做了很多事情,總不會一直有人花大錢買它,只是為了表示自己在FORTH領域的身份吧?
作者花費了許多時間在與eForth相關的系統上,主要目的是想驗證此系統是否真正具有一貫性,真有則更可貴,別的FORTH系統較不能存活久遠,eForth希望較大。證明的方法無他,就是用它來進行實際設計,每逢阻礙就予以突破,走到盡頭就知道它很可行,如此而已,我也身體力行了,證明了它很可行。
FORTH在軟體界號稱可像一個『窮人的原子彈』,我自己深信,個人、不花錢、猛搞一通、將它搞大了,確實可以轟轟烈烈的爆炸一場,就像在網路上大作戰一般,只是事在人為,宜不宜如此做而已。
網路讓全中國的中國人有機會來接觸FORTH了,我不知道這些同胞能不能像我們當年一樣吃苦耐勞的學通FORTH,然後用它來做可貴的事情,整個華人的世界,比台灣大太多了,相對的發展潛力也將非常可觀,我常寫FORTH相關文章,寄望的也就是華人的世界在這方面能有點作為。
剛開始搞FORTH的人,可以不要把事情搞得又大又複雜,我先翻譯了F83標準的中文指令集,因為它規模較小,提供初學者參考,意思是想告訴想進入這個領域的新人,先搞這些就很夠了,初看的人最好將其妥善保存。
將本程式加入eForth核心系統後,除了FORGET指令外,大致已符合F83標準,足夠使用了。回顧FORTH標準指令的發展,事實上從無、到fig、到79、到83、再到ANSI,彼此之間差異不是全面的,而且還很有限,學通FORTH就知道了。

2025年9月2日 星期二

理論與實際

理論與實際


曾慶潭 Ching-Tang Tseng
ilikeforth@gmail.com
Hamilton, New Zealand
2 September 2025


子彈跟砲彈都不是飛彈,發射出去以後的飛行軌跡無法修正,它們的理論彈道是固定的,如果不考慮環境因素的影響,也不考慮彈藥質地的統計性差異,落點就是確定值。排除這些因素,根據理論公式設計砲彈射擊程式,是件趣味事情。

我從網上的社群網頁收集到這一張簡圖,它就在顯示砲彈彈道的理論公式,我拿它來設計程式,實際上的有用應用,應該還要添加以程式修正發射角度的能力。


我是職業軍人,只是專長比較特殊,從中正理工學院核子工程系畢業後,必須前往最基層的正規野戰部隊服役,我前往的部隊番號是陸軍第 57 師,這個師傳統上對軍官的要求比較嚴格。我駐防馬祖時,幹到 57 師連長後才考進中山科學研究院,看過軍史記錄,確認 1941 年 57 師打過長沙會戰,1974 年,連上還有經歷過長沙會戰的老士官班長。 57 師是輕裝師,新報到的軍官一律拔掉軍階,在幹訓班重訓單兵、伍、班、排之槍砲操練三個月,成績記入軍籍表。


以砲操為例,解釋理論彈道公式的用途,才能結合理論與實際來設計程式。

砲操的射擊口令是這樣喊出來的:

第一砲注意
12 點鐘方向
目標正前方機槍陣地
俯角 30 度
榴彈一發
裝藥兩包


戰場的口令都很簡潔,我們從口令的內容來解釋理論彈道公式中那些參數比較有用。

一門砲有裝填彈藥的士兵、操作瞄準具的士兵、射手。

聽到 12 點鐘方向口令時,砲口會轉置到正前方的大約位置。
聽到目標正前方機槍陣地口令時,瞄準手會進行精確的直線對準瞄準。
聽到俯角 30 度口令時,瞄準手會將發射砲口調整出俯角 30 度的角度。
聽到榴彈一發口令時,彈藥兵與裝填手會將一發榴彈砲彈塞進砲管發射座。
聽到裝藥兩包口令時,彈藥兵會塞進兩包炸藥包,關上砲栓。
聽到放的口令時,砲彈就發射出去了。轟的一聲,震耳欲聾。

現在回頭看彈道貼圖,砲彈射擊時,完成砲口直線瞄準後,確實只剩二維內的事項必須考慮,而且只須調整砲口的發射俯角單一個參數。

那一種砲彈、裝藥幾包,決定了砲彈的發射初速,這項決定由喊口令的砲長負責,砲兵只管操作。換句話說,每次發射砲彈,最後,只有一個參數需要調整,也就是發射俯角。

從實務的觀點來看貼圖,實際上彈道的軌跡,也就是 y 與 x 的關係,在沒有繪圖功能時,不太有用。我只令 x 等於最高高度之值來敷衍過去。

這樣理解砲操,就可以開始設計程式了。我設計的數學計算系統很簡明,彈道公式完全可以直接搬入程式。為了表示式能更清晰的顯示,幾個用到的三角函數數值,直接在輸入數據後就立刻執行,產生結果,所以我不吝於變數用量,直接宣告出 14 個變數的名稱來設計程式。

砲彈不是發射出去就算了,砲長直接觀察落點,或前進觀測官會回報落點與目標差了多少角度與多少公尺。砲長在發射下一發砲彈時就得修正涉及參數。修正的主值,除了直線瞄準外,仍然是發射俯角需要改為幾度。

於是,我再根據公式,增加設計了一個 adj 指令,這個指令可憑需要增加或減少落點的距離直接換算出新的發射俯角,提供的答案仍是砲口應該升或降的新角度。應該增加的公尺數用正值輸入,必須減少的公尺數用負值輸入。操作方式只用兩個指令,執行 main 指令時,只根據結果印出彈道相關之數據供砲長參考。需要修正發射俯角時,執行 adj 指令便可。程式附帶簡單的操作,列示如下:


\ shell.f

\ degree : 發射俯角(度度量)
\ z : 弳度量
\ T : 飛行時間 ( sec )
\ R : 炸點距離 ( m )
\ H : 最高高度 ( m )
\ y : 彈道軌跡 ( m )
\ x : 水平距離 ( m )
\ u : 砲彈初速 ( 250 m/sec )
\ g : 重力加速度 ( 9.8 m/sec^2 )
\ a : 調整距離 ( +/-m )

14 reals degree z u g T H R y x sinz sin2z cosz tanz a

: InputData basic
10 let { degree = 30.0 e 0 }
20 let { z = degree * f(pi) / 180.0 e 0 }
30 let { u = 250.0 e 0 } 
40 let { g = 9.8 e 0 }
50 let { sinz = sin ( z ) }
60 let { sin2z = sin ( f2.0e0 * z ) }
70 let { cosz = cos ( z ) }
80 let { tanz = tan ( z ) }
90 end ;

: main basic
10 run InputData
20 let { T = ( f2.0e0 * u * sinz ) / g }
30 let { H = ( (  u * u ) * ( sinz * sinz ) ) /  ( f2.0e0 * g ) }
40 let { R = ( u * u ) * sin2z / g }
50 let { x = H }
60 let { y = x * tanz - ( g * x * x ) / (  f2.0e0 * u * u * cosz * cosz ) }
70 run cr ." 發射俯角 = " degree f.  ." 度 "
       cr ." 飛行時間 = " T f. ." 秒 "
       cr ." 最高高度 = " H f. ." 公尺 "
       cr ." 炸點距離 = " R f. ." 公尺 "
       cr ." 砲彈初速 = " u f. ." 公尺/秒 "   
\ 70 print { z , T , H , R , u }
80 end ;

: adj basic
10 run cr ." 輸入修正距離為幾公尺? " cr
20 InputR a
30 let { R = R + a }
40 let { z = asin ( ( R * g ) / ( u * u ) ) / f2.0e0 }
50 let { degree = z * 180.0 e 0 / f(pi) }
60 run cr ." 修正射角成為 " degree f. ." 度 " cr
70 end ;

hing@ctt:~$ ./l

AMDX86 ciforth 5.3.0 
fload shell.f
g : ISN'T UNIQUE                                                
A : ISN'T UNIQUE                                                
 OK
main

發射俯角 = 30.0度 
飛行時間 = 25.510204081秒 
最高高度 = 797.19387755公尺 
炸點距離 = 5523.1211976公尺 
砲彈初速 = 250.0公尺/秒  OK
adj

輸入修正距離為幾公尺? 

? +230.0 e 0

修正射角成為 32.21704191  度 
 OK
adj

輸入修正距離為幾公尺? 

? -45.0 e 0

修正射角成為 31.756360366  度 
 OK

2025年8月16日 星期六

飲水思源追溯 BASIC 程式語言

飲水思源追溯 BASIC 程式語言


曾慶潭 Ching-Tang Tseng
ilikeforth@gmail.com
Hamilton, New Zealand
16 August 2025


慣用電腦上網看書,很久沒去過圖書館,我家附近就有圖書分館,但沒光顧過幾次。有幾個原因不去:
一是館中沒有什麼我願意看的書,小說居多,還都不是名著,是暢銷小說。
二是老了,視力不好,看書有點吃力,網上瀏覽的資訊,能自由放大縮小,都可以調整到滿意為止。
三是我不喜歡讀書期限被限制,借閱時間到了就得還書不自由,真有需要的書,我寧可自己買來用。

這半年來,我陪著小外孫長大,從脖子還需要扶著開始,現在剛滿一歲會走路了,我們每星期花四天,以他為主的方式過著生活,我搞創作受到影響,吸收新知則不受影響。

七月中,因為天氣很冷,外出時只宜在室內活動,我帶著小外孫在圖書館內走動,順便看看架上書籍,見到有兩本談論 Raspberry pi 的書籍,毫不猶豫的就借回家看了。不幸,是過時的書籍,介紹到 pi 2 而已。書籍我還是快速讀了一遍,想知道 Raspberry pi 的輸出/輸入機制,結果,沒有幫助,書中採用了兩種程式語言寫範例程式,一是 Python ,另一是 BBC Basic 。他們執行輸出/輸入的方式都得另外加裝驅動軟體,執行方法也只能跟著規定方法使用,不能更動。這樣的用法,連硬體實質位址的訊息都得不到,我很失望的把書還了,真想用 Forth 設計輸出/輸入程式的話,得另外設法從網上學習獲得硬體位址訊息,我估計只宜透過組合語言之類的程式才能從軟體訊息中受益。

開卷都是有益的,我也是讀了過時的舊版書後,才知道 Raspberry pi 電路板上有可以進行硬體重置(Reset)的開放式接點,只是出廠時都未安裝按鈕而已。在 pi 2 的舊書中提到,接點在 HDMI 影像輸出插座旁邊,有文字標示。我的板子是 pi 3 與 pi 4 的版本,找不到這個接點,但在 40 腳的 I/O 插座旁邊有一個標示了 RUN 文字、露出銅泊的兩點,可以焊接重置按鈕。於是,我試用了這兩點,待系統啟動後,我只用迴紋針插在一個洞口上,板上電壓立刻就被降壓下來,重置了。看來,不用再裝按鈕,想重置時,小心以導電金屬碰一下接點就能達到目的。由於單板電腦確實經常會碰到當機情況,需要重置系統,此前,我是買了帶有開關的插座,採用直接切除電源的方式來解決問題。看了舊書,得了訊息,自己親自動手做過幾遍,重置問題就解決了。

pi 2 的舊書中展示了 BBC Basic 系統,我也想加裝,但 pi 3 與 pi 4 的板子都不提供這個系統的下載安裝服務。我試用通配字元星號(*)置於 basic 前面,訊息顯示有 *basic 可安裝,是 bwbasic ,叫 bywaterBASIC 。安裝需時稍久,因為安裝時必須對系統進行組態設定的關係,我耐心的看它正確無誤的執行出結果。倒過頭來,我順便也為作業系統是 Ubuntu 20.04 的桌機也安裝了 bwbasic ,幾乎是瞬間就完成了安裝。裝的全都是 V2.20 的版本,網上已有 V3.0 的版本,但缺人手協助系統進行組態設定的設計。我只下載了源碼,沒有安裝。從 GitHub 中顯示的訊息可以看得出來,這個 bwbasic 是五年前貼網的,換句話說,它能免費下載安裝的時間也只有五年而已,還算新。

在個人電腦的領域,我最早接觸的程式語言就是 BASIC, 那是 1982 年時在台灣使用之 TRS-80 個人電腦的 BASIC ,已有浮點數計算功能。它確實是影響了我一生使用電腦的走向,尤其是後來我透過 Forth 系統設計出 ABC Forth 的研發過程,完全是根據了早期使用過 BASIC 程式語言所獲得的經驗在設計系統。中國人講求飲水要思源,追溯最早的根源,是件有意義的事情,甚至於我還能強調,我的電腦個人筆記已有 20 幾本,第 1 本中,開頭就記錄了 TRS-80 BASIC 的操作步驟。80 年代,我在核能研究所工作期間,曾經在夜間開辦過教導員工使用 BASIC 語言設計程式的課程半年,學完者發給中華民國 FORTH 語言協會的結業證書,全球有效,因為當時我們是 Fig 總會的會員組織,有許多人在美國有效使用過這樣的證書。

熟悉 BASIC ,我才能自己設計 BASIC 。
不尊重前人的創作,就不可能有後來的發展。
我仔細鑽研過 BASIC ,ABC Forth 才能比較健全的擁有 BASIC 的性能。
我用它來進行複雜的數學計算程式設計,也用它完成許多數值分析方面的研究。
程式語言的數學表示式,BASIC 的語法最好。
我用 Forth 的編譯後直接執行之精神,解決 BASIC 因係一邊執行一邊編譯而跑得太慢的問題。
我用 Forth 自然叫用已經存在之前程式的精神,解決 BASIC 被詬病為麵條式程式碼的缺點。
我用 Forth 之延伸性,發展出可以處裡任意一種數系的 BASIC 程式寫法。
還有許多特點,都是這樣發展而成的。

bwbasic 源碼的現行貢獻者叫 Ted Campbell ,據他自稱,這個以 C 語言設計出來的 bwbasic 最原始的作者是他的祖母 Verda Spell 於 1982 年設計的。他還提到謝謝 Mr. David MacKenzie 協助了安裝時對作業系統進行組態設定的程式設計。這樣的作法展現了尊重前人的技術傳承方式,我也感謝最原始的創作者。我的三台 Linux OS 電腦都裝好了 bwbasic , 有空時,我必會試用 bwbasic ,因為我熟 BASIC ,可以直接設計程式解決問題。

可以自由下載 bwbasic V2.20 版本源碼的網址如下:

https://salsa.debian.org/debian/bwbasic

它雖與自動安裝 bwbasic 的操作無關,留下這份源碼的資料,將來想要更動系統改成倍精度運算或其他規格時會有用途,只是您必須熟悉 C 語言以及組態設定檔如何運作的方法才能辦到。安裝 bwbasic 的操作,簡單到只須輸入下列文字:

$ sudo apt-get install bwbasic

今年,Forth 被號稱是已有被使用了 55 年 ( 1970 )的歷史。 BASIC 與其他知名程式語言的年紀則如下圖所示,僅供參考。飲水思源就在思考這些根源。





今天,我們能夠這麼方便的書寫中文創作文章,必須感謝中國人的祖先創造了中文的文字,它的起源可以追溯到幾千年前獸骨、龜殼上的甲骨文,與刻在銅器、陶器上的印記,還有石材上的碑帖,這些東西都是中國經過了千年流傳下來的寶物。至於幾千年前當代的文字傳承,可以簡單到窮人家只靠柳條在沙盤上寫字來教育下一代。我們從小都聽過亞聖先師孟子的母親為了教育孟子,曾經『孟母三遷』才找到適合之教育環境的故事。兩千多年前,孟母就用柳條沙盤教出了能成聖人的子女。沒有文字,那就難辦到了。

紙張還沒有出現以前,中國人主要是靠竹簡或木牘來傳承文字。最近環球時報的新聞報導了一則清華大學對戰國時期大量簡牘文本進行系統性研究後的成果,這些文本是清華大學於2008年7月獲得的戰國時期(公元前475-221年)竹簡的一部分。這批寶藏包含70多部古代文獻,其中60多部已佚失兩千多年。這些文獻涵蓋了哲學、歷史、天文、法律、數學和醫學等眾多學科,為了解早期中國文明提供了寶貴的資料。

研究還發現,大家都以為標點符號是現代發明的,但在這些竹簡中,我們清楚地看到了2000多年前就有人使用標點符號的證據。這些竹簡上的標記,能幫助古代讀者理解論證文章內複雜敘述之結構和含義。清華大學飲水思源式的簡牘文本研究,給中國文字帶來許多從未有過的創新見解。隨文附貼一份在湖北出土的典型竹簡,它們是中國文化中的寶藏。




飲水思源是對前人創作的尊重,不只是中國人該如此,全世界人人都該這樣。最近我在 Twitter(X) 社群媒體中見到一個帳號的貼文串,出現了西方人出言不遜侮辱阿拉伯人的訊息,強說阿拉伯人沒有科學貢獻。結果,阿拉伯人豪不客氣的連貼幾則漫畫,教訓西方人。

要知道,數學是開啟科學之門的鑰匙,而整個數學的根基是代數與幾何,阿拉伯人發明了代數與幾何,甚至於阿拉伯數字,誰有資格嘲笑阿拉伯人對科學沒有貢獻?

飲水要思源,任何科學都該感謝阿拉伯人創建了數學的源泉,科學才得以發展。數目字中,連零的觀念都是來自阿拉伯人的數學創舉,下列漫畫能告訴你阿拉伯數字是怎麼形成的?有『數目之量』與『幾何夾角』的意義在其中。你飲了甘泉,要感謝源泉啊 ! 別再瞧不起阿拉伯人。




2025年8月2日 星期六

舉一反三

舉一反三


曾慶潭 Ching-Tang Tseng
ilikeforth@gmail.com
Hamilton, New Zealand
2 August 2025

這是一句所有中國人都耳熟能詳的四字成語,不只是因為它用字簡單,它還是從兩千多年前就開始被中國人使用於教育及學習環境的鼓勵用語。

論語第七章述而篇中有一條孔子的敘述:子曰:「不憤不啟,不悱不發。舉一隅不以三隅反,則不復也。」

它很能說明這就是舉一反三成語的起源。

有過不少賢明的作者彙整出許多有用的成語出版成書,我們在學生時代就買過這種書。例如:『分類中國成語大辭典』。那個年代,電腦還不普及,更沒有網路可以使用,這本有助於自修、作文、書信、寫作的參考用書,是值得花錢買來終生使用的。我買過,很不幸,買書的時候沒有料到平裝書不耐環境的摧殘,用了五六十年的這本書,再翻幾次,封面、封底都得粉化了,就算這樣,我仍然珍惜。為了遣詞用字時少出差錯,也為了閱讀文章時能夠深刻了解且不搞錯文章的意思,經常查找成語工具用書是必要的。閒暇想看書時,成語辭典後面也附有成語故事,看故事書就是享受,也帶有修身養性的意義。

成語大辭典論述舉一反三的短文故事中,鼓勵大家掌握知識、靈活運用、發展知識。這種信而好古的精神,確實是學習的準繩,也是中國文化歷久不衰的主因,有太多的古聖先賢致力於傳承,我們才享受了文化。

我在學習、研發 Forth 的過程中沿用了同樣的方法鼓勵自己,舉一反三是經常做的事情。當然,舉一後不一定非反出三來不可,能夠反出一來也夠有益了,能反出大於三的結果來則是常有的事情。近幾年,我花了不少時間參與了幾個社群媒體的活動,幾乎天天都發表言論。但說實在的,活動產生的真正樂趣,來自別人有正面意義的網貼,我瀏覽它們的程度幾近於天天學習,看到好的題材,必定情不自禁的想方設法節錄下來,留參的多,轉發再炒作的比較少,就算這樣,我貼文的數量經常是高於常人。

最近有個數學帳號的網頁貼出了這麼一個簡單的訊息,訊息很普通,人人能懂,它卻激起了我寫程式的興趣,我用程式證明它。


ABC Forth 可以把程式寫得很簡單,只這樣做只算是舉一反一,我想反二時,問了自己: 64 位元的整數系統能算到多大的數字才會超出單整數能夠表示的範圍? 我寫了程式,得知只能算到 42 。

我還可以反三,能夠設計雙整數的最大公約數與最小公倍數,這樣就能擴大表現範圍,但我沒有這樣做。我跳過了反三,改搞反四,因為我設計的系統能夠處理無限位數的大數字,為了舉一反三而核對已經完成的系統,確定我並沒有為大數系統添加 BigBCD, BigLCM 兩個指令。所以,反四的取向,轉為設計大數字的最大公約數與最小公倍數。

在大數運算系統中,可用位數是可調變的,卻因此而必須先行宣告來決定可用位數,就是因為這樣,我在設計大數系統時才沒有把 BigBCD, BigLCM 兩個函數固定在系統中。

以下是今天寫出來的程式與執行結果:


 

3 integers i n tlcm

: imain 
basic
10 inputi n
10 let tlcm = 1 
20 for i = 1 to n
30 let tlcm = LCM ( tlcm i )
40 next i
50 print tlcm
60 end ; 

0 BIGVARIABLE A 1000 ALLOT
0 BIGVARIABLE B 1000 ALLOT
0 BIGVARIABLE A1 1000 ALLOT
0 BIGVARIABLE B1 1000 ALLOT
0 BIGVARIABLE C1 1000 ALLOT
0 BIGVARIABLE A2 1000 ALLOT
0 BIGVARIABLE B2 1000 ALLOT
0 BIGVARIABLE C2 1000 ALLOT
0 BIGVARIABLE BGCD 1000 ALLOT
0 BIGVARIABLE BLCM 1000 ALLOT

: InputData 
BASIC
10 LET B{ A = S" 12193263112482853211126352690 " S>BIG }B
20 LET B{ B = S" 440370366363 " S>BIG }B
30 END ;

: GCDLCM 
BASIC
10 LET B{ A1 = A }B
20 LET B{ B1 = B }B
30 IF B{ A1 < B1 }B THEN 50
40 GOTO 60
50 LET B{ C1 = A1 }B :: B{ A1 = B1 }B :: B{ B1 = C1 }B
60 LET B{ C1 = A1 MOD B1 }B :: B{ A1 = B1 }B :: B{ B1 = C1 }B
70 IF B{ C1 <> BIG0 }B THEN -60
80 LET B{ BGCD = A1 }B
90 LET B{ BLCM =  ( A * B / BGCD ) }B
100 END ;

: BMAIN 
BASIC
10 RUN InputData
20 RUN GCDLCM
30 PRINT " Big GCD is : "
40 RUN BGCD BIG.
50 PRINT " Big LCM is : "
60 RUN BLCM BIG.
70 END ;

\s
imain

? 10

                2520  OK
imain 

? 42

  219060189739591200  OK
bmain

Big GCD is : 
9 digits 
370370367 
=========1=========2=========3=========4=========5
12345678901234567890123456789012345678901234567890
=========(c) 2018 Copyright, Bottom Ruler=========

Big LCM is : 
32 digits 
14497789840742112468029233348410 
=========1=========2=========3=========4=========5
12345678901234567890123456789012345678901234567890
=========(c) 2018 Copyright, Bottom Ruler=========
 OK

2025年7月16日 星期三

系統性能探討

系統性能探討


曾慶潭 Ching-Tang Tseng
ilikeforth@gmail.com
Hamilton, New Zealand
16 July 2025


有許多規模比較龐大的程式,我沒有發表在這個網頁,純屬於我個人的應用程式者也不網貼。有些論題很適合用來檢討系統性能,因為它們的內容通常涉及一些比較特別的需求。這一次,我取用傅立葉轉換(Fourier transform)的技術來探討我設計之 ABC Forth 系統的一些性能。

網上已有很多傅立葉轉換技術方面的資源可供參考,我也不例外的大方採用,用到之處會說明來源,以尊重他人的創作。本文借用的貼圖來自不同的網頁,表示函數時的參數並不一致,這不是我所強調的重點,但很容易看懂。別人貼出的材料都是經過一番努力後的貢獻,所以不要太強求。

Twitter(X)社群媒體上,有一個名稱為歷史上的物理學(Physics in history)帳號,最近貼出過一份能夠精簡說明傅立葉轉換技術的照片,我轉貼於此處與大家分享。這方面的數學,要在大學二年級以後才學,它是專門用於信號處理的工具,也可以用來作為偏微分方程式(PDF)求解時的工具。它的完整數學表示式定義,照片中有。


以物理觀念更簡單的說明,就是傅立葉轉換,能把隨時間而變化的函數轉換成隨頻率而變化的函數,函數的本質不變。

我自己在工程實務上的應用,除了寫過大量信號處裡方面的相關程式外,就是曾將此技術應用於原子爐六台 600 匹馬力水泵兩公尺長轉軸各有四個軸承的長期監測上。當軸承安裝妥當後,以頻譜顯示儀獲得的頻譜,是只有很單純的一個尖峰。當軸承出現問題,例如是彈子盤保持器有微小破裂時,以頻譜顯示儀獲得的頻譜,是單一個的尖峰不見了,改以佔用頻率範圍很寬廣的許多低峰值圖譜出現。這個時候,運轉裝備必須停機更換軸承,否則直徑兩英吋的傳動軸就會被震斷,整套水泵連帶馬達都全毀,重裝新泵時,連地腳螺絲都得重新設計,損失非常大,我經歷過。量測元件獲得的訊號通常都是時變訊息,要想獲得對應的頻變訊息,就需要傅立葉轉換技術。貴重與安全要求較高的裝備,值得加裝這種監測系統,能防患於未然。

我大三時學過偏微方程專門課程,書中滿滿的傅立葉轉換應用,印象深刻。我從事過電腦信號處裡的研究工作,參與過台電核二廠雜波分析發展計畫,也參與過魚雷相控陣列聲納的電腦技術研發計畫,有過一些信號處裡方面的實作經驗。設計研發程式時,知道信號處裡軟體技術發展時講求的重點,但那時還沒有自己設計過系統。也因此在後來自己設計數學計算系統時,就會強行設計一些以前系統所沒有提供的性能。例如本文提到的複數運算系統,可以直接在複數體系觀念之下設計程式。

任何週期性的時變函數圖譜,都能由許多個不同週期的函數圖譜合成,這是一種線性關係(函數乘以常數後相加本質不變的函數關係),以簡圖表示就能看出,從時變轉換成頻變表示時,函數本質不變的道理。


我把細部強調式的傅立葉轉換數學式再貼一遍,此圖仔細說明了數學式中每個符號的意義。


電腦工程實務上,這樣的公式被改寫成離散傅立葉轉換(DFT)的數學表示式:


傅立葉轉換說明至此,不再深入,有興趣的讀者可以自行從網上學習。

接下來,我採用維基百科與 Rosetta code 網頁共同建議的快速傅立葉轉換(FFT)程序描訴虛碼來探討系統性能。資料來源網頁為:

維基百科自由百科全書(WikipediaThe Free Encyclopedia)

https://en.wikipedia.org/wiki/Cooley%E2%80%93Tukey_FFT_algorithm


我們逐列探討能直接執行這套虛碼的系統規格。

首先,第一列的說明強調要用到以 2 為基底的對數函數。
我在設計系統時,連浮點數的對數函數也全為採用以 2 為基底的根本函數來推導出其他所有的對數函數。但是以數學體系的觀念來設計系統時,整數與浮點數是不能混著出現在同一列運算表達式之程式中的,因為系統中兩者的資料格式完全不同。所以,在整數環境中,必須專為整數體系建立它自己的以 2 為基底的對數函數。我設計的系統中有此函數,名稱就叫做 nlb ( n1 -- n2 ),以對應於以 10 為基底的整數之對數函數 nlog ( n1 -- n2 ) 。

程式設計方法一開始就強調時變輸入信號 A 數列的點數必須為 2 的整數方次,例如:2 的 10 次方就是 1024 點,且輸入信號必須為複數的格式。我設計的系統中可以直接宣告產生陣列,所使用的指令是 [ARRAY] 。指標可以從 0 開始,這一條件,也是這套虛碼程序設計方法中的要求條件之一。

描述方法中有一列在計算複數的 exp 函數,它的參數必須是複數,結果也必須是複數。我設計的系統中建立了這樣的函數,在純粹 Forth 的環境中,我仍沿用 Forth 愛用者的習慣使用 zexp 的函數名稱。但在 BASIC 環境中,我直接就採用 exp 的設計,這樣設計不會搞混系統,因為浮點術與複數的資料格式不同,在同一列運算程式中只能有一種數字格式,所以複數環境仍可以照樣採用 exp 為該函數的名稱。

描述方法中只有指標需要運算之處是我設計系統時沒有實現的設計。這裡有兩個數列的指標 (k+j+m/2) 與 (k+j) 需要進行整數運算。在正整數運算之計算落定後,資料格式必須是正整數,這在整數環境內,不經設計就能直接執行得出來。但是在浮點數、複數等的非整數環境內就不能直接執行出來。要設計出這樣的規格時,必須在運算列內增加改變運算規格的暫態處裡,待指標之整數運算結束後,還得改變回來。我嫌這樣設計起來雜亂無章,只在 Win32Forth 系統中實現過設計後,便放棄了這樣的設計。解決辦法很簡單,凡是遇到指標有運算的地方,就必須在前一列直接增設一列程式。例如上述情況就寫成:


   
10 let k+j+m/2 = k + j + ( m / 2 )
10 let k+j = k + j


此處討論的陣列指標之運算,是快速傅立葉轉換(FFT)技術的關鍵部份。能這樣運算後調整陣列輸出數據指標,將計算所得放置到指標指定的位置,是快速傅立葉轉換能快的主因。研究 FFT 技術的主要工作,就是在探討如何處裡指標才能減少運算次數,以便加速獲得數位訊號整體的轉換結果。每種方式的技術細節,當初都曾被寫成博士論文而發表。這種技術就適合拿來檢驗系統的性能。

沒有其他限制了。換句話說,我設計的系統能夠直接書寫複數運算式子,設計好的程式跟虛碼所描述的步驟會很接近,系統有此特點。

輸入與輸出數據上了千點以上,很難再單憑人工輸入每一點數據的方式來完成工作了。我設計的系統因此而安排了可以簡易執行開關檔案、自動進行數據存取工作的能力。這一點很重要,遇到產生結果需要藉由別的軟體實現複雜工作時特別有用,過去的貼文中已有很多這樣的使用範例。

在套用這種功能時,有一點必須注意,如果數列只是單一個變數的數列,容易處裡。數列每列具有兩個以上的變數數列時必須注意 ! 按照 Forth 處裡輸出輸入數據的方式,一次只做一列,遇到跳列(LF或CR)時可以暫停。但輸入的數據在堆疊上是先進後出,輸出的數據是後進的先出。我在 Win32Forth 增建 ABC Forth 性能時,解決過這方面的問題,後來再增建的系統就簡化了設計,不再理會這種問題,特此聲明。

2025年7月1日 星期二

弦外之音

弦外之音


曾慶潭 Ching-Tang Tseng
ilikeforth@gmail.com
Hamilton, New Zealand
2 July 2025


這一次,我不談程式,改談 Forth 的哲理。哲理的範圍很廣,我縮小到只談 Forth 系統變數(user's variable)。我也不談各個系統變數的定義,只談整體的意義。

初學 Forth 的人在基礎教材中見不到這方面的論述,基礎教材通常只教標準指令的用法。也不談 Forth 的系統架構,因為各個 Forth 的系統架構大都不同,難談。

如果您想把 Forth 學得很好,將來想要大肆利用 Forth 發展出自己的抱負,Forth 哲理中的每個項目就都應該搞得清清楚楚。系統變數只是眾多哲理中的一個項目,它有必須存在之宏觀的理由,個別系統變數都有必須建立它的道理。這種哲理看似是在學習 Forth 時的弦外之音, 實則是使用者必需學會的基本觀念,碰到它時,不要逃避,不要排擠。

我們在 1984 年 4 月創辦的『FORTH期刊』p.19 中就有一篇諶其騮作者所寫的『FORTH系統變數簡介』,該文可以提供永久性的參考。即使後來其他系統的系統變數已有大量的變化,系統變數的使用觀念則沒有改變,是系統所需,也是使用者設計程式時經常非要用到不可的東西。

系統變數有幾項特色。

首先是通常被集中處裡,除了能讓系統結構整齊外,它另有幾方面隱含的性質。

古老的 Forth 強調多工(multi-task)性能,有少數幾個系統變數就是單工被執行時非得獨立起來使用不可的單套變數,例如:兩個堆疊指標 S0 及 R0 就是。它們都是能讓工多而不亂的變化根據。在 Forth 系統中,所謂的一工,可能只是一個程式,也可以是一位使用者(user),Forth 也因此把系統變數稱為使用者變數。

Forth 系統具有可以長出標的系統(target system)的固有性能,但不是每個系統的作者都能將這種性能設計得出來。所以,我在挑選可用系統時,會將這項要求列為首要考慮條件,以便自己長期努力發展出來的成果能被永久性的固定下來。Forth 系統無論是在初次以各種其他工具語言發展出來,或者是就憑祖代系統憑藉蛻變編譯(meta compile)能力產生新的子代系統,在系統長成的最後階段,都得對系統變數進行最後的調整修訂,如此,子代系統運行時,才能有正確的系統變數內容可用。

系統變數的放置方式有秩序性,不可前後隨便對調,這也是多工設計時的一項簡明要求。Forth 系統內的自有多功能力,在規劃出新的一工(task)時,第一個記憶體單元放的是此工是否要睡著(sleep down)不被執行時的跳躍指令,跳到下一工去。否則就該醒來(wake up)執行本工的第一件處置工作,那就是找到自己的回返堆疊指標,在那裡取得執行碼。因此,緊隨是否該跳躍的指令碼後,第一個系統變數就放此工總系統變數的指標,叫 U0 ,然後,緊隨著的就是 S0 和 R0 ,這種秩序絕不能變。

系統變數通常有幾十個,以現行的 ciForth 為例,Fig-Forth 是它的前身,系統變數大約有四十個。這些系統變數又可化分成兩大類,一類是多工狀況執行時要求至少必須獨立分出來的系統變數,在 ciForth 中選出了十一個。另一類系統變數則是分工程式被執行時還必須與它工共用的系統變數,成立新工時,就可以不必另外宣告出記憶體空間來放置此類系統變數。因此,成立新工的宣告過程,必定包含了需要宣告出多少個單元來存放該工之系統變數的用量。

傳統的 Forth 多工,是根據一種被稱為知更鳥輪唱(round Robin)法設計出來的多工方式,跟現行作業系統固有的多工運作方式不同,現行作業系統採用一種所謂的先佔式(temptative)多工來運作,那一工先被喚醒就先執行那一工,多 CPU 的時代,不再熱衷於傳統 Forth 的多工設計,逐漸地,大家也不設計傳統的多工程式了。

我們在 32 位元的 Win32Forth 系統中還能見得到純用 Forth 設計出來的多工範例,在 64 位元的 ciForth 中沒有這方面的需求。我需要時,也改採 Linux OS 中的多工方式,直接讓 Forth 去叫用另一套 Forth ,執行出另一個工。這在本網頁的貼文中可以看到好幾個使用範例, 凡是有程式執行的展示影片,同時出現有背景音樂的短片內,都依靠用 Forth 叫用另一套 Forth 執行音樂播放之先佔式多工而完成設計。

ciForth 是一個可以自行長出標的系統的好用 Forth,它在處裡出長成的標的系統時,有一段處裡系統變數的工作必須要做,這樣,整個系統的可執行碼檔案中才能固定出新的系統變數規格,這是一個很有效率的作法,卻不是其他 Forth 系統能辦得到的設計,是作者熟悉 Linux OS 使用環境後的創意設計。也請注意 ciForth 在各種作業系統中的版本,並非全部都具有此項功能,微軟的 Wina64 就不具有,沒有此項功能的系統我就不用。

能讀通系統源程式碼是件痛快的事情,看似弦外之音的系統變數之形成哲理大有意義存在,講述如何研究它? 則超出了貼出一個範例程式的範疇,只能專文討論。我在設計 ciForth 的 ABC Forth 數學計算系統時,動用到它,修改過執行 >NUMBER 時必須隱性影響 DPL (第 20 個系統變數)的方式,特貼此文說明。

黃河

中國所有的兒童都聽過『大禹治水十三年,三過家門而不入』的故事,也曉得故事的意義在強調工作時要用對方法,要堅忍不拔的完成工作,這是四千多年前流傳下來的故事。

大禹是夏朝的第一個皇帝(在位七年,時間為西元前 2205~2198 年,另有在位 27 年之說)。這個故事從此告訴了後人,黃河經常氾濫成災。古人形容邪惡帝王的惡劣統治就像洪水與猛獸,所指的洪水,就有如黃河的氾濫。

中國歷史上,黃河在過去的三千多年內共有高達 1,593 次的氾濫記錄,氾濫使其主幹道改變了 18 次;每次的泛濫也都造成大量傷亡及經濟損失。

近代的四次記錄則為 1410 年黃河氾濫, 1887 年黄河决口, 1921 年宫家决口, 1958 年黄河洪水。

1900 年以後的兩次災情記錄為:

宮家決口也稱宮家壩決口,是民國時期 1921 年 7 月 19 日發生在中國山東利津宮家的一次黃河決口。決口後水災影響到利津、霑化、濱縣、無棣四縣,災民 18.4 萬餘人,受災面積 5400 平方里。

1958 年黃河洪水指的是 1958 年 7 月發生在中華人民共和國黃河中下游地區的水災。此次水災淹沒村莊 1708 個,淹沒耕地 304 萬畝,房屋倒塌 30 萬間,京廣鐵路中斷 14 天,受災人口達 74.08 萬人。據中國政府官方資料顯示,河南、山東兩省出動約 200 萬人進行防汛,確保了黃河下游的防洪安全。

黃河氾濫的起因係上游大量沖積下來的黃沙,沉積在下游出海前的河床上,長久下來,河槽萎縮,造成河床高於地面的懸河現象,直到河堤受不了而潰堤,於是發生規模宏大之河水氾濫的洪災,這是定性的說法。最近我看到中國黃河教育電視台的科普教育新聞報導中,提供了一些近代的定量數據,可以讓大家更深刻的了解黃河。

根據科普新聞報導,現代的黃河,平均每年有 4 億噸泥沙堆積在下游河道裡。下游「地上懸河」現象長達 800 公里,最大懸差 10 公尺。

大禹治水能夠成功,用對的方法是疏導而非築堤圍堵,今人治理黃河,當然也只宜疏導。問題是年產 4 億噸的泥沙可不是個小量的數字, 800 公里的 10 公尺高度是個驚人的河床,就算動用南海吹沙填海的工程機器來幹此活,可能都不是一件輕鬆的工程,因此,最好的疏導方法,仍是讓沙流入海。

中國科普報導則介紹了一種借力使力的方式調沙,利用上下游水庫間歇性的突然大量放水,便可借大量的挾沙水流沖洗河床,這種調水調沙的方式可以清除河床積沙入海。今年一年已進行了 26 次,可以沖掉 21 億立方公尺的沙,讓河床平均下切了 3.1 公尺。

文末附貼一部陝西電視台製作的壺口大瀑布記錄短片顯示了大量的黃泥水,另附黃河下游廣闊的河道照片與幾張三門峽水庫與小浪底水庫調水調沙時的壯觀景象。在來沙的源頭執行沙漠造林、建造幾萬個淤沙壩有利於水土保持,中國做得到,最後展示一張在這一方面成就明顯的照片。

2025年6月15日 星期日

文化傳承

文化傳承


曾慶潭 Ching-Tang Tseng
ilikeforth@gmail.com
Hamilton, New Zealand
16 June 2025


Forth 是一種程式語言,比較好且適當的中文名稱是『符式』。簡明的解釋,就是其標準指令中使用了許多符號作為指令名稱。這樣用,有其原因,因為它是即時性控制語言,標準鍵盤上的符號用來當指令,更可以快速的執行出結果。

語言都會形成文化,Forth 亦然,它有它的文化。中文的 Forth 也有中文方面的文化,我用了它 40 幾年,比較熟悉它所形成的中文文化背景。用到後來,我發展出了數學計算系統,年紀大了還在用,於是產生了想要傳承它的使命感。跟中國文化傳承者的情懷一樣,傳承 Forth 中文方面的文化,是老來還能用它設計系統者應有的使命。

40 幾年來已有不少跟 Forth 有關的中文書籍或翻譯書本出版,台灣、中國大陸都有,但內容都偏重於最基礎的 Forth 使用教學。英文版本的書籍,有一些內容會涉及系統設計,但數量很少。用 Forth 設計出系統的公司,為了營利賺錢,不可能完全公開設計內容,網上能獲得源碼的檔案,都只有基礎之裸系統。因此,傳承屬於與 Forth 有關之系統性質的文化,是很可貴的工作。尤其是這種文化必須經過實際上使用過後的嚴格考驗,實做成功後,才能講得出它們的道理。可是,這種文化不會在基礎教學的書籍中出現,因為層次比較高,不容易介紹。

這一篇文章舉一個很簡單的例子說明:

應用 Forth 系統,不能自外於整個世界,也不能自外於另一個 Forth 系統。本網頁中刊出的題材,最可貴的地方,就是已經刊出過許多 Forth 與外界溝通的範例程式,讀者在別的場合很難見到,所以可貴。Forth 系統與外界溝通的方法都有侷限性,溝通方法會隨時間與背景環境的不同而不同,這種性質令系統設計者只能隨時間與環境而跟著調變,沒有規則可循。但是一種透過公稱方式的溝通慣例可以討論,那就是透過生成或接受『檔案』(file) 的方式來溝通。設計這種溝通技術,仍需要不少有關檔案格式的基本觀念,它超出了 Forth 的討論範疇,短文也不可能說得清楚。用法則需要先行建立起固定的使用協定(protocol)才能設計,也就是說,使用步驟絕非一步到位,有固定死的步驟才能完成設計。我再簡化舉例,只討論 Forth 系統輸出資料時需要進行什麼設計?

從檔案輸入資料進 Forth 系統的觀念比較直接,只要知道開啟了的檔案之起始位址,剩下的事情就是只須根據這個位址來進行資料處裡的程式設計。

從系統輸出資料到檔案,根據我多年的使用經驗,比較好的方法是必須找出所有 Forth 執行輸出時相關的最根本指令,然後令其執行內容改為被轉向到輸出至另外的緩衝區,待資料輸出工作結束後,才一次性的將緩衝區內的資料轉存進指定檔案。我歸納出最根本的通用指令,顯性的有三個 : TYPE, EMIT, CR 。 隱性的另有兩個 : LF, EOF。隱性的,只須適時適地的安放其碼就能完成工作。顯性的三個指令則需採用高階的明碼設計,內容並不複雜,只須記得 TYPE 是印出一大串字串,後二者則只印出單個字元,如此便可。而設計的關鍵,則在必須將這三個顯性指令規劃成為可改變執行內容的向量式(vectorized)指令,在資料被存進檔案後,系統才能據此而恢復成原來的標準輸出狀態。一套典型的相關設計如下:


 
0 value OriginalTYPE
0 value OriginalEMIT
0 value OriginalCR

: SaveTypeEmitCr
  ['] TYPE >body @ to OriginalTYPE
  ['] EMIT >body @ to OriginalEMIT
  ['] CR   >body @ to OriginalCR
;

: RecoverTypeEmitCr 
  OriginalTYPE is TYPE
  OriginalEMIT is EMIT
  OriginalCR   is CR
;

: TYPE>PAD ( addr len -- )
  PAD +PLACE ;
: EMIT>PAD ( c -- )
  PAD c+PLACE ;

: PAD>FILE ( -- )
  PAD COUNT Fadr Flen + SWAP DUP +TO Flen MOVE ;



每次傳承一個文化主題時,內容不需要多,要點是要有重點。

我也注重中國文化的傳承,每次提及中國文化時,只須提出一個簡單的要素,能將罕有的要素傳揚到全世界才是重點。

最近,我在環球時報新聞網頁看到這樣的照片,覺得珍貴,刻意將其轉貼此處,謝謝該新聞媒體的報導。

這是一幀取材自中國河南省鞏義市永熙陵旁之麥田裡的照片,永熙陵是北宋第二個皇帝宋太宗(西元976年~997年)死後葬身之地,今人已開墾成麥田,但保留了千年石雕之地上物, 照片顯示的場景頗為撼動人心。

我刻意介紹的這份中國文物,不是宏偉壯觀的建築,也不是華麗驚人的遺物,只是中國北方麥田裡的千年石雕,看到後卻令人發思古之幽情。我轉貼來跟全世界分享,也與大家分享我設計系統、解決問題時的一份小程式及其重要觀念。


2025年6月1日 星期日

ARM 使用環境之經驗記錄

ARM 使用環境之經驗記錄


曾慶潭 Ching-Tang Tseng
ilikeforth@gmail.com
Hamilton, New Zealand
2 June 2025

通常,我在試用 Forth 系統之發展末期,大約都是以能夠發展出數學函數的繪圖功能才告一段落。這次改到 ARM 使用環境之發展亦然,在我實現舊有的題材產生出同樣結果後,發展可以告一段落了。

前文曾經強調過,我的 ARM 發展環境就是 Raspberry pi3 與 pi4 ,以下就簡稱 pi3, pi4 。發展的過程中有許多經驗應該記錄下來,以防日後再使用它們又出問題時會是重蹈覆徹。

這種單板電腦套件(kit)沒有裝設電源開關,由於發展過程中時常要面對當機問題,我不得不為使用裝置添加開關。紐西蘭的壁上插座都附有開關,要讓電腦能夠跑得起來時,需要至少兩個電源插孔,為此,我刻意另外購用每個插孔均帶有個別開關的延長線插座,兩套單板電腦就買了兩條。使用的螢幕必須具有 HDMI 接頭,我有兩個這種螢幕,都是廉價回收品。一個是單純的電腦專用螢幕,另一個是帶有 HDMI 接頭的小電視。長期使用後發現,不宜將兩條電源線只透過單一個開關來控制供電,因為我發現僅由單一個開關送電時,開關會跳出火花,這就表示開關的接點在每次送電時,表面都被電擊燒過一次,開關遲早都會被燒毀,不應該這樣使用電器。螢幕與單板電腦各自使用一個電源開關時,開關就不跳火花了,以後注意,必須這樣使用。

這兩套電腦都不是很正規的日用電腦, pi3 甚至於不太適合安裝視窗作業系統,滑鼠常常跟不上響應是其最大的問題。早在 2012 年就已存在的 pi3 ,已經十幾年了,性能雖不頂好,還是能做一些事情的。東西在我這裡放了許多年,現在跑起來也沒有什麼問題。隨著時日的演進,它所需要的靜態硬碟(SD),以性價比考量,目前採用 64GB 的 MicroSD 最為恰當。舊的 32GB 之 MicroSD 不用淘汰,因為這套系統要與外界進行資料傳送時,還沒有很適合的網上軟體可供採用,只宜使用 USB 來傳送,所以舊東西就還有用處,而且比較好用,因為容量不大,資料不多時,視窗作業系統連通 USB 就比較不耗時間,也才能夠及時反應出可存取的狀態。一個裝滿資料的外加硬碟,裡面可能有幾十萬甚至於幾百萬個檔案,pi3 為了掃描整個硬碟的資料夾,所耗時間將形同已經當機。這種現象可以從 pi3 後面的兩個指示燈看得出來,紅燈亮時僅表示已經供電,綠燈亮時表示系統正在執行程式。

長久以來,我在三套作業系統 Windows', MacOS, Linux 之間傳遞資料時,都已改採透過網路直接傳送與接收的方式進行,所用軟體叫做 croc ,它用起來很方便,無論多少 個 GB 的影音圖字碼都能傳送,基本作法就是透過 GitHub 做中間緩衝環境,只要你不在乎所傳資料會被盜取,那就儘管使用 croc 來傳檔案資料,USB 就都免用了。使用 croc 的細節不是我想討論的題材,怎麼安裝?怎麼用?用時有何細節必須注意?我就不在此處討論。但是,我已試過了, pi3 沒得安裝, pi4 可以安裝,使用時卻以安全問題為由而不能用,我暫時尚未試出可用結果。所以,在 ARM 使用環境內,我仍使用硬體 USB 傳送資料。

為電腦裝上作業系統,都已採用將影像檔(.img)直接展開至 MicroSD 的方式進行,在什麼網頁可以取得那一種作業系統?不是我該在這裡介紹的題材,我只能強調我為 pi3 裝的是 Ubuntu mate 20.04,而為 pi4 裝的是 Debian 。安裝過程很簡單、也很快。只有兩件事情需要對答回應,一是時區的選用,二是設定 WiFi 的網通密碼。中文輸入法是否加裝?在安裝系統初期可以不用考慮。而且,我在安裝 pi3 時發現,加裝中文輸入界面後,滑鼠又變得慢到不可理喻的程度了,而加裝這方面的軟體,裝後不能刪除,牽涉太廣,出問題時,我改採重裝系統的方式解決問題,耗時最少。

裝好了基礎作業系統,才能發展軟體,我花了不少時間為 ciForth 延伸出 abcForth 的功能,這樣我便能大肆測試整個系統的性能。本網頁在 2 January 2025 貼出之『天下為公』一文,附貼了一份很好的多重語言互助互榮,完成數學函數繪圖的成果。這裡再次借用這份程式,同時展示在三套不同之 Linux 環境完成同一工作的成果。在桌機上的 Ubuntu 20.04 是直接完成所有工作的。在 pi3 上基於 ARM 設計的 ciForth,不能再以一次操作完成所有工作,問題出在下列這一列指令中的 -c 之工作內容會出現例外訊息

$ ./l -c datagen.f > data.txt

ciForth 在將數據寫入 data.txt 資料檔案時,出現的多餘訊息全進入了檔案頂部,我暫時也不熟悉如何修正這個問題,只好改採以人工操作滑鼠的方式刪除訊息,剩下的程式就都能執行了。三個系統的成果圖與文字操作畫面的記錄同時展示於此,供作比對之用。程式內容請回頭看『天下為公』一文,展示的效果表示,我為 ARM 環境發展的 abcForth 已經完成。

我在 pi4 的 Debian 作業環境中想要對畫面進行硬拷貝擷圖時出現困難,因為系統不提供像 Ubuntu 那樣,可以直接壓下 print screen 鍵就獲得整個螢幕畫面的能力,於是加裝了 Kazam 軟體,透過它來實現要求。
想要系統能做許多事情,加裝軟體是免不了的要求,這方面需求,因人而異,但不是我該談的主題,要談,題目也很大。
要區別那一張圖代表是在那一個作業系統內完成的?請看螢幕桌面的背景畫面就能區別。




20250519 的小作文

研發電腦技術的精神總是出現在半夜兩三點

這一段時日,我一直在設法適應 ARM CPU 的發展環境,生活有點像回到五十年前剛接觸個人電腦的日子那樣,半夜三更老是還在搞電腦。

年輕時是怕家人打擾,研究無法持續,所以選在夜晚磨練技術。但那時年輕力壯,身體很好,少睡幾小時還受得了,可以造就出後來的技能。

現在不能再這樣糟蹋身體,也沒有必要,可以就在白天自由自在的搞電腦。想半夜搞電腦,只宜顛倒作業,改靠調整睡覺時間來面對。

昨晚,我改在半夜兩點起床,搞 Raspberry pi3 名片型單板電腦的軟體加裝。它是個麻雀雖小五臟俱全的小東西,前曾被英國政府採用為兒童電腦教育專用裝備,號稱生產價格只需五美金,市售價低於 35 元。目前的版本已經進展到 pi5 ,速度與容量已與慣用電腦相當,已成歐盟國家用來抗拒美國產品的利器。

因為白天家人要用網路,這種還靠 WiFi 傳輸訊息的弱小裝備,競爭不過普通電腦訊號比較強大的裝備。因此,我長期試用過後,發現它很容易當機,原因就是處理無線電信號的能力不如別人。昨晚我八點就早睡了,刻意在半夜兩點起床,開啟 pi3 ,獨佔 WiFi,進行加裝應用軟體的操作,一試之下,果真見到了效果。凡是容量上百個 MB 的應用軟體,都能加裝成功,顯示了我的判斷沒有錯。這就是搞電腦搞到半夜三更的效果,理由仍是避免被外部打擾,靜下心來耐心發展,就能成功。

這種使用 ARM cpu 設計出來的產品,都只使用免費的 Linux 公益作業系統運作,它的使用特色就是輕鬆裝好全裸系統,然後只靠每次只打一列字的方式加裝應用軟體。如下列:

$ sudo apt install [app name]

多年來的使用經驗告訴我,大約需要加裝 30 幾套應用軟體後,才能擁有一個令我滿意的使用環境。有幾個比較大型的應用軟體都需要佔用幾百個 MB 。白天裝過幾次沒有成功之後,我痛下決心,重溫年少時的心情,再度發揮夜研精神,一下功夫,就立刻得到了結果。

今晨裝好的軟體是像小畫家那樣的工具軟體 Kolourpaint ,佔用一百多個 MB ,還有好幾個都是,半夜裝成後,我才睡回鍋覺。

今晨因此而培育出、獲得了這種電腦之新的使用經驗。東西的性能不是不好,只是運轉能力較弱,耐心應對,都能發揮效果。

2025年5月16日 星期五

實踐

實踐


曾慶潭 Ching-Tang Tseng
ilikeforth@gmail.com
Hamilton, New Zealand
16 May 2025


這一陣子,我在適應 ARM 系統的使用環境,經常會碰到一些問題,使用環境之適應性的建立,全憑身體力行的實踐,別無它法。這種事情已經不是時下青年喜歡做的事情,因為耗時又麻煩,要細讀許多資料,要實作許多設計,逐個度過難關後,才能有點成就。

以前,在發展系統時,沒有注意到摻雜了特例的用法,會給後來改到新環境繼續延用時產生麻煩。因此,重新在新環境發展系統時,我注意到重建的系統應該要注意永續可用的問題,最好不要強加個人偏好性的設計,以免自找麻煩。趁著這次再在 ARM 環境建立 abc Forth 運算系統的機會,把能夠永續使用的設計整理妥善,簡化發展程序,刪除所有個人偏好,不再添加於未來應用。刪除的部份可以另行建檔,需要時才載入系統。

有許多經驗是實踐後才知道的。今天,我在 Raspberry pi4 上完成了一套發展,改到 pi3 去試用,就出現了記憶體分段選址有問題之訊息,系統不能執行。但憑經驗,一看就知道,是因為我將系統容量宣告得太大了的關係,將設定改小就能解決問題。在 pi4 上有 4GB 的 RAM 可用,而 pi3 只有 1GB 的 RAM ,我在 pi4 上發展時,將系統宣告得很大,超出了 1GB 的範圍,就出問題了。由於我設計的 abc Forth 系統需要執行大數計算,它比較耗用記憶體,雖然長成的系統仍然是只有幾百 KB ,運算大數時,可能要耗用 Forth 系統從 HERE 開始算起以上的記憶體。因此,只宣告不到 1MB 的使用量絕對不夠。經過這次產生問題後的經驗告訴我, pi3 上只能用 1GB ,也就是 1000MB ,我若將 Forth 系統的記憶體使用量宣告成 1GB 的十分之一,也就是 100MB ,算是比較妥當。如此一來,我就能在操作上比較方便的 pi4 系統上發展出轉置到 pi3 也能執行的 abc Forth 系統。這件事已經測試完畢。

在家裡獨自發展系統,不易察覺這種單板電腦有什麼使用上的問題,家中若有人同時上網,就能體會出問題。昨天,我小女兒在我這裡使用網路開會,我才發現 pi4 啟動後連編寫程式都有困難,反應慢到無法接受的程度,只能關機停用,待我能夠獨享網路時再搞程式設計。單板電腦採用 WiFi 上網,響應速度當然沒有一般手提電腦的速度快,能分享的無線訊息傳遞必定大受影響。pi3 的運行速度為 1.2GHz ,pi4 為 1.8GHZ ,比起一般電腦為 2.5GHz 的速度,確實差了許多,用時不可不知。

ARM 是 Linux 的作業環境,我在產出基本系統後,必須取用原在 Window's 系統上發展出來的應用程式。程式中有些說明,包括中文,因係 big-5 的編碼,轉到 Linux 採用 utf-8 編碼時無法閱讀,要操作轉碼程式來更換編碼,才能看到中文的內容。每次打字總覺得麻煩,於是自己設計了一個小程式,想將檔案內容的碼轉換時,只須輸入檔案名稱就夠了,會用電腦的人,應該盡量自己設計程式簡化這種問題。這個程式可以在 Linux 作業系統中之 ciForth 系統使用,我用的是 Lina64 Forth。設計要點只是字串操作,然後設法運用以 Forth 轉交 BASH 執行出轉檔程式的技巧,就能完成工作。轉檔程式的名稱叫做 iconv ,它的詳細使用說明,不在此討論,這種 Forth 的使用技巧,則是當下程式發展者應該建立的運用觀念。程式能完成 big-5 與 utf-8 碼間的互換,只須輸入欲轉碼之檔案名稱便可。


 
\ utf8.f

create InputFile 32 cells allot
create OutputFile 32 cells allot

: InputSetup 
  InputFile 32 cells erase
  OutputFile 32 cells erase
  cr ." Input file name : " cr
  input$ InputFile $! 
;

: Utf8Setup
  S" iconv -f big-5 -t utf8 -o utf8-" OutputFile $!
  InputFile $@ OutputFile $+!
  BL OutputFile $c+
  InputFile $@ OutputFile $+!
;

: Big5Setup
  S" iconv -f utf8 -t big5 -o big5-" OutputFile $!
  InputFile $@ OutputFile $+!
  BL OutputFile $c+
  InputFile $@ OutputFile $+!
;
  
: utf8
  InputSetup 
  Utf8Setup
  OutputFile $@ system
;

: big5
  InputSetup 
  Big5Setup
  OutputFile $@ system
;


至聖先師


2025年5月2日 星期五

時基

時基


曾慶潭 Ching-Tang Tseng
ilikeforth@gmail.com
Hamilton, New Zealand
2 May 2025


取得時基(time base)訊息是一個很古老的電腦技術,卻是一個恆有需要的功能。

使用電腦實測事件發生的時距,在許多場合都有實用價值。它的硬體根據,就是在 CPU 旁邊必須具有能自動運行的系統時脈計數器(system timer)。

我在 40 年前接觸單板電腦時就開始用過這種技術,那時的電腦,沒有現成的時脈計數器,時脈訊號只供 CPU 直接運行使用,沒有計數器來留存時脈的數量。

在 6502 CPU 盛行的時代,我們採用專屬的 6522 晶片解決問題,其中就有一個 32 位元的計時器,如果嫌其留存的計數量不足,還能串接兩個 6522 晶片來使用。我曾用它來測量原子爐停爐棒的跌降時間,精確度可以達到微秒,實際需求只須百分之一秒。有一篇討論 Forth 指令精確執行時間的文章在 FORTH 期刊第 2 期中刊出,標題為: FORTH 程式執行速度之定量評鑑,也用這套技術。我還曾為一家地磅公司提供電腦內的自動時鐘,也用這套功能,那個年代的個人電腦不附帶這種功能,需要自己設計程式。

衛星定位系統能夠提供精確的定位、速度、時間等訊息,其工作原理也離不開這套技術,系統的時基越精確,訊息就跟著精確。

今日的電腦,內附現成的時鐘是基本配備,使用者已經不需要另外加裝硬體就能取得標準時基。我在使用 Lina64 Forth 時,為系統添加了一個低階設計的指令 getticks ,以備不時之需。
getticks 的整個添加內容,與一個簡單的 main 程式,及 main 被執行出來的視窗畫面,展示如下 :


#  **************
#  * GETTICKS   *  ( -- n )
#  **************
#
        .balign    8,0x00
N_CLOCKFET:
        .quad      8
        .ASCII      "GETTICKS"
        .balign    8,0x00
CLOCKFET:
        .quad    CLOCKFET+HEADSIZE
        .quad    CLOCKFET+HEADSIZE
        .quad    0x0
        .quad    INVERT
        .quad    N_CLOCKFET
        .quad    0
        .quad    0

	rdtsc
	shl	%rdx, 32
	or	%rdx, %rax
	push	%rdx

	LODSQ                  # NEXT
        JMP     QWORD PTR[%RAX]   

\ display Time-Stamp Counter

: main
  !xy
     begin
           0 40 gotoxy 
           getticks 
           0 20 D.R
     key?
     until
  @xy 
;




透過幾千年的時基,認識北京、周公與召公。

時基尺度以千年計量時,考古證據顯示,北京建城已有三千多年的歷史。當時老是被孔子尊稱的周公又是何等人物?他很能代表中國很古的名人。

引用的照片取材自中國新華社供圖,展示北京房山縣琉璃河遺址出土的五件青銅禮器 : 尊、卣(音永)、爵(音決)、觶(音至)、鼎。

五個禮器上都各刻有七處的四字銘文「太保墉燕」實證了北京已有三千多年的建城歷史。這是重要的事情,所以說了七遍!

「太保」是西周成王時期的召公 奭(音是),「燕」指琉璃河遺址所在的燕地,「墉」意為「築城」。
「太保墉燕」,意為「太保召公來到燕地建設都城」。

北京在民國時期被平民老百姓稱為北平,文人墨客寫作時喜稱燕京,解放後被稱為北京。

召公是太保,周公是太師。比照現在,太保召公,他相當於國防部長,另有太師周公,他相當於行政院長。這兩人是輔佐周朝各個帝王,直至西周成王的重臣。

孔子說周公制禮作樂,我們都能朗朗上口,那麼,召公就應該是克商(朝)平亂了。後來,周公管陝東,召公管陝西。

後人恭維文官周公時,似乎也不該忘了武官召公,要尊敬軍人才有國本。


時基另有妙用

我在設計亂數產生函數時,特別喜歡取用硬體計時器的內容來當作產生亂數的起始種子數字, abcLina64 Forth 系統就這樣使用時基。

三月份,我從台灣回到紐西蘭後,便打算在 ARM 系統上再度發展出 ciForth 的等效版本。我有 Raspberry Pi3 及 pi4 的單板電腦,試用一段時間後發現,在 pi3 上安裝 Ubuntu 20.04 mate OS ,用起來性能還算可以,只是 1.2 GHz 的速度太慢,滑鼠在視窗作業環境響應太慢容易當機。 pi4 則安裝了 Debian OS ,1.8 GHz 的運行速度,讓滑鼠的響應勉強跟得上需要,編寫程式時比較方便。我已在兩套單板上試跑過 ciForth ,只在文字視窗中運行,沒有問題。我的目標是設計出與 Lina64 性能相當的 abc Forth 數學計算系統。很不幸,在設計與 getticks 功能相同的指令時遭遇到困難。

ARM 系統發展與應用的生態環境尚不健全,出現問題時,網上能獲得的資源相當有限,現行軟、硬體資料能夠提供的說明比較含糊,發展起來確實有點吃力。甚至於在已公佈的ciForth 源程式中,也明白的提示了有那些指令還暫時不能正常使用。想讓系統發揮作用,還得努力。

相關資料顯示,ARM CPU 從系統計數器(system counter)抓取時基的指令是 MRS ,但文件也提示,這個指令在使用者模式時不能執行, 必須在特權模式狀態下才能執行。

關於這方面的問題,我暫時抱持著觀望的態度,靜待有比較好的範例可以採用時再行引用。

把亂數產生程式中的起始種子數亂化一下的方法很簡單,可以將 getticks 取得之值直接就存進種子變數。
也可以把 getticks 隨時取得的數字當種子數來亂化一次,再回存於種子數。這樣做,就能憑硬體計時器低效部份之內容高速變化的不確定性,產生另一組亂數群。
採用硬體來亂化種子數的效果是非凡的做法,尤其在 64 位元的時代,運用起來幾乎不可能被任何使用者猜得到第一個亂數函數產生的新亂數會是多少。
亂化的方法可以如下列這麼一個簡單的程式而已:

: RANDOMIZE ( -- )
GETTICKS GETTICKS * RANDOM ( n1 -- n2 ) SEED ! ;

時基的運用還有許多例子可舉。所以,無論是誰在建造新的 cpu 時,都應該考慮到,硬體計時器,是一種在系統應用方面常常需要的設置。

超短時基的科普概念

2024年9月2日,我曾取用科學期刊帳號貼出的電子裂射的時間為10的-21次方秒(或稱為一任秒, zeptosecond)的訊息,在 Line 社群活動中介紹超短時間的科普概念。

後來,新聞公佈了炸藥贖罪獎之物理獎的三位得主,就是搞出了一種10的-18次方秒(或稱為阿秒, attosecond)等級的閃光雷射而得獎。

科學超短時間名稱的劃分,是這樣的:
10的-3次方秒稱為一毫秒
10的-6次方秒稱為一微秒
10的-9次方秒稱為一奈秒
10的-12次方秒稱為一皮秒
10的-15次方秒稱為一飛秒
10的-18次方秒稱為一阿秒
10的-21次方秒稱為一任秒

以前,科普期刊介紹飛秒雷射本已是頂尖的技術突破。沒過幾天,就又介紹人類研究電子科學有任秒概念的需求。隨後就又報導了有阿秒雷射的創新,算是先知先覺的科技報導。果真不錯,炸藥贖罪獎之物理獎公佈的得獎者,就是技術領先的三位新人,可見科技創新的敏感性有多麼先進。
許多國外報社都報導了這些事情,卻誇大的說: 阿秒雷射能對電子狀態定位而可以進行觀察。這就錯了,因為阿秒還長於任秒一千倍,這種雷射還不能用來對更超短的電子裂射現象,取得定格後被觀察的閃光照。報導的記者誇大了。

超短時間的量度,全世界現在只能量度到任秒的程度,而最短的時間單位為10的-44秒,稱為普郎克時間(Planck time),是根據理論公式推導出來的單位 : 5.39X10^-44,還沒有技術能測量得到。

一般人不接觸這些科普概念,我們搞核子科學研究者則須深入理解。
舉例來說,原子核分裂時,有一種稱之為瞬發中子者,它與延遲中子的分別,其界限就在10飛秒(10的-14次方秒)。原子彈爆炸時,主要就是瞬發中子,也就是在10飛秒內釋出的瞬發中子。原子彈有效的炸開時間則只有10奈秒(10的-8次方秒)。

但是,原子爐的控制,高度依賴10飛秒後才釋放出來的延遲中子(delay neutron),它們所佔的比例不高,大約只有0.75%。可是,考慮與瞬發中子混存後的整體作用等效時間,高達13秒左右。這麼一來,它與瞬發中子進行權重配比混合後,就可以讓整體中子的倍增時間延長到十分之一秒左右。
我們在設計原子爐的控制系統時,就是利用這種中子特性來設計控制裝置,再讓中子倍增時間增長到10秒左右,原子爐就能被安全、穩定的控制住了。

我擔任主管以前,曾經接手參與過一個被稱為水鍋式反應器的爛尾巴工程,負責全所都已放棄了的中子量度。其中的主要工作,就在測量出能夠控制原子爐的中子讀數。那座原子爐是台灣全自製的,燃料使用濃縮度為19.5%三公斤多的鈾235,全部溶解在濃硫酸內作為燃料。我很熟中子,也熟知中子該怎麼用,更是很能量測中子,領導過許多應用中子的研究計畫,都有成效。

以上的超短時間概念,可以作為大家用來認知超短時間的科普說明。

2025年4月16日 星期三

日記幾篇

日記幾篇


曾慶潭 Ching-Tang Tseng
ilikeforth@gmail.com
Hamilton, New Zealand
16 April 2025


最近,我有家事要忙,定期貼出文章的工作受到影響,只能力求規律。

平時,為與幾位好友保持聯繫,交流技術,我花在 Line 社群媒體上活動的時間比較多,幾乎每天都在 Line 上貼出好幾篇有關科技的小作文。

這是一篇與 Forth 技術相關的貼文。貼出時只用 W10 OS 中的 Win32Forth 系統展示成果。此處再附加使用 Ubuntu 20.04 中的 ciForth 及 gForth 展示同一成果。

對於一個很好的問題,給出一個很好的測試方法,同時驗證自己設計的系統性能無誤,作為永久的記錄,貼文的目的在強調這種精神。

我看到此一貼文,立刻用我自己設計的系統檢測,驗證測試的程式與執行結果如下:


 

這是在 Win32Forth 系統中,以幾分鐘內的響應速度,直接執行出來的結果

: test basic 
10 print { 6.0e0 * fpi * fpi * fpi * fpi * fpi } 
20 end 
;  ok
test 
       1836.12   ok

真的沒錯, 6 * (pi)^5 = 1836.12, 這就是質子與電子質量的比值。

這是在 ciForth 中直接執行的結果

ching@ctt:~$ ./l

AMDX86 ciforth 5.3.0 
: test basic
10 print { 6.0 e 0 * f(pi) * f(pi) * f(pi) * f(pi) * f(pi) }
20 end 
;  OK
test

1.8361181087 E 3   OK

這是在 gForth 中直接執行的結果

ching@ctt:~$ ./g
Gforth 0.7.3, Copyright (C) 1995-2008 Free Software Foundation, Inc.
Gforth comes with ABSOLUTELY NO WARRANTY; for details type `license'
Type `bye' to exit
: test basic  compiled
10 print { 6.0e0 * pi * pi * pi * pi * pi }  compiled
20 end  compiled
;  ok
test 
     1.83611810871169E3   ok
     
系統不同,答案沒錯,只是數字輸出表達的方式不同,但都得正確。




清明掃墓有感

清明節到了,請把書讀通了、把道理搞懂了才去掃墓。

不久前,我剛去掃墓兩次,第二次是為了刻意跟兄弟姊妹同去而去的,就在台北市公墓,交通便利,公車 508 路能到山腳下。

公墓現場好幾年前就已經規定不准燒紙錢了,我也欣然接受。今年更甚,規定燒香也不准了,我們照樣接受。

上山時要走一段路,背著祭品有點累,以生鮮水果為主,聊表心意,這點累算什麼? 誰不知道祭過的水果還是自己吃? 有什麼好計較的?

我是反對燒香、燒紙錢的,理由很簡單,汙染、浪費又危險,人世間已經沒有那麼多資源可供這樣濫用。
堅持祭祀要燒東西的看法絕對沒有必要,人人都應該配合新時代的要求,必須守規矩。有誰不懂誠心、誠意才是掃墓的重點?

我這次回台,在街上仍然看到還有許多店家在燒紙錢,這種行為只會讓我感到痛心與噁心,尤其是在公車站牌旁邊的店家,難道不知道旅客必定受到汙染影響嗎? 無論是誰這樣燒紙錢,我都會在心裡咒罵 : 閻王不要放過他們的祖先,必須以其子孫正在汙染世間與浪費資源之罪讓這種祖先在陰間受罪。

我心目中的中國社會,要普設國營食堂

我曾經是職業軍人,1970 年起,在中正理工學院讀書四年,全在學校的餐廳吃三餐,學生副食費每個月 680 元。畢業後,在正規野戰部隊幹過三年,吃的都是連隊飲食,飲食再不好,吃起來也都是香噴噴的,國家補給的副食費是軍官每個月才 240 元。

1977 年起,在中山科學院幹了十二年,生活上也都以吃食堂的飯為主。工作區的院區餐廳食堂,就是用購置原子爐 20 億美金的經費設立的,因為食堂必須供應原子爐值班工作人員的三餐。這些技術人員搭值班車前往食堂,可以比院區員工提前半小時開飯。我記得那時一餐飯的價格大約 20 來元,每本飯票 200 元,大約可使用一星期。

中科院的宿舍區在石管局的石園區,那裏有另外一個全院員工可以使用的食堂,我在婚前,都在國營食堂解決日常飲食問題,生活過得健康、愉快,從不為吃飯問題煩惱。

1989 年,退伍之後,就只能吃自己了,但我養成了習慣,在外奔波工作,半夜兩點才回家也不願在外面吃晚飯,一定要回家吃,保證可以免得肝病,非常想念國營的食堂。

我常去大陸,在江西、上海、北京時最喜歡去吃公營食堂的飯,北京航空航天大學的第二研究生招待所的食堂、上海自己開創的新格公司食堂,都是我解決日常飲食的好地方。

2003 年我刻意去桃園虎頭山腳下退除役官兵輔導委員會開辦的職訓中心接受重型機械的維修訓練,想要培養出在紐西蘭自營農場時的基礎技能,又有機會再吃公營食堂的飯,每個月的伙食費才 2200 元台幣, 7 天 24 小時供應三餐,我吃得不亦樂乎。

公營食堂的飲食都很健康,固定的開飯時間當然確保了規律的飲食。看看前述的費用,就能知道不存在營利不實的問題。對我而言,食物都是自選付費的,公平、合理、方便、自由.....等等,具有許多好處。

我們老了,家裡每天都得為準備三餐付出不少時間,能吃食堂或能去食堂打飯來吃,已成空想。食堂能讓人專心工作、不必憂慮飲食問題、節省開銷、確保健康。

中國人的社會應該普設國營食堂,看看中國大陸,這張照片就顯現出了一個理想的社會。原文以英文向全世界報導。



AI 潛藏了三個問題

第一是搞 AI 耗能源,值不值得耗還很難說,光是目前的有限 AI 就已經是家家大公司都提高能耗到 150% 以上,後續會更糟。

第二是我個人網頁中強調過的訊息應該天下為公、世界大同。有美國在,這個理想就難以突破,東、西方只能自己搞自己的,AI 的能力就更加有限。

第三是版權問題,我的個人網頁有幾百個創作程式,就算貼出,版權仍是我的,誰都可以引用,但引用時要說明出處,尊重版權。
這一點,AI根本不做,所以歐盟禁止 AI 的公開營運,因為美國大公司的 AI 偷得的訊息,主要就是來自歐盟各國的科學訊息為多。

我不太需要 AI 。

我女婿的公司營運受到 AI 很大的衝擊,幫別人建網上資料庫的公司,現在都加重了負荷。要增設存取資料的安全設計,有些東西實在很難加建,他們就直接受害,他們所增加的設計負荷卻是在妨礙 AI 的能力。

誰是誰非?

AI 不會殺死創作,但會殺死平庸,主因就是 AI 不會創作,只會偷竊資料,實在沒有智慧。

現行 AI 是離網就沒有 AI 。

必也正名乎 ! AI 應該改稱為 NI (網哀) 。


電動車

日本與德國兩大汽車工業龍頭都被中國的電動車打倒了,國家經濟也因此而步向艱難的路途。

日、德這兩國的技術絕對不是不好,只是巧婦難為無米之炊。他們要研究、生產出車用電池的技術,絕對能領先他國,但材料沒有就是沒有,最後都必須向鋰低頭。

中國剛開始也不怎麼樣,但領導階層有眼光,敢在 Tesla 面臨破產之際出手貸款 90 億美金讓其起死回生,能貸出的條件就是 Tesla 必須在上海設生產廠。

如此一來,中國就有了能夠深入電動車工業的關鍵技術人才培養環境,造就了後來擊敗日、德所有汽車工業的潛力。

中國的鋰礦並不是國產的礦物,是收購了全球鋰礦的結果。

除了技術,無論那一種車,更需要的就是市場。中國在汽車尚未普及的情況下直接接受電動車,國家還一直補貼購車、換車優惠。因此,中國電動車工業就世界無敵了。

如此看來,與其說電動車是鋰材料決定了一切,還不如說中國領導階層的眼光才決定了一切。

那一國都能這樣搞,包括台灣也有這種可能,問題是,領導階層都沒有這種眼光。

2025年4月1日 星期二

學以致用

學以致用


曾慶潭 Ching-Tang Tseng
ilikeforth@gmail.com
Hamilton, New Zealand
2 April 2025


三月份,我回台灣一個月,再回紐西蘭至今,已經做完許多事情,生活趨於穩定,可以繼續發展各種技術。

我的一生忙於學習,也忙於學以致用,學習是因為生活上有需要,也是因為有興趣而不斷學習。作學問要力求致知,更貴在致用。

我家迎來第三個新生外孫小嬰兒已經七個月了,俗話說七坐八爬,九個月大就要學走路。我回紐西蘭的第一件家務事,就是動手改善嬰兒學步車,它已被兩個嬰兒使用過,性能一般般。以前,這個嬰兒學步車使用時,發現前輪輪軸只用木螺絲固定,會經常出現嚴重問題。每用一段時日,木螺絲就被轉輪帶動到脫落了,老是需要成人使用螺絲起子將其重新固定,設計的很不理想。

我花了一個上午的時間進行轉輪改裝工作。先從車庫內收藏的零件中找出一整盒 NTN 公司生產的微小滾柱軸承,外徑 8mm 、內徑 4mm 、 寬度 8mm ,每個輪子使用兩個軸承,可以改善嬰兒學步車的車輪轉動性能。我就憑藉著游標卡尺量度零件、鑽頭與加工後的成孔,讓它們的尺寸都能適當配合。原用木螺絲安裝轉輪,不合理,我改用鋼釘,軸承便能在鋼釘上自由轉動。

安裝前輪時,我知道該是學以致用的時候了。中國人自古以來就懂得安裝車輪的技巧,我也學過,轉軸會有三種偏裝角度上的要求,轉輪被驅動時,車體才能夠自動的迎合出前進的方向。一是前束(toe-in)、二是外翻(tilted out)、三是後傾(negative caster)。思考出這些術語的用意也很簡單,前束的要求能使車輪轉動後兩輪不會向外發散,車身才能保持前行。空車時兩輪外翻,車身載重後,外翻就能抵銷車軸受重受壓後的向下變形。後傾的目的,則是在推車前行時讓車身的力量帶動輪子,而不是任由前有動力的輪子來帶動車身。這三種術語的中文,均與英文用字並非直接匹配,原因就是中國人自古以來就懂得這些車用轉輪安裝技術的意義。

我學以致用的裝好了嬰兒學步車的前輪,只有前束條件能夠比較明顯的從照片中看得出來。因為前輪只有單一個固定點,就不用考慮後傾問題。成果有照片為證,效果是我施力推出車後,車能自由直行至少五公尺以上絕不跑偏。車載過大約十公斤的小外孫,已經在我家室內地毯上推行了半個月,沒有出過問題。

上述英文術語可在下列車輛學專著內找到:
James E. Duffy, Modern Automotive Mechanics, South Holland , Illinois The Goodheart-Willcox company, Inc.1990, chapter 70 Wheel Alignment,(p.927~ p.929).

隨文附貼照片兩張
圖一是我借用本地超市購物車拍攝的,可以明顯的顯示推車前輪後傾與後輪前傾的設計。
圖二是嬰兒學步車的上視圖,可以明顯的顯示前輪前束的安裝方式。

圖一

圖二

另外,我從台灣帶回三套被棄用之扶輪社捐贈了 2000 套用來長期監測地震自動傳送訊息的 Raspberry pi3 單板電腦。有空時,我就架設起電腦,跑我熟悉的 Forth 系統,此單板電腦有四枚 64 位元的 ARM CPU ,工作頻率只有 1.4GHz ,所以執行軟體的速度不夠快。我試過了,大約安裝 Ubuntu Mate 20.04 版的作業系統,效果還算差強人意。使用時,千萬不要為了貪圖新版而同意提昇作業系統的版本到 22.04 版,否則上網後顯示的速度會氣死人,慢到無法接受。

長期以來,我有種感覺,現行 CPU 的發展,到達 64 位元後,算是位元上限了,好像沒有必要再去搞出 128 位元的 CPU 。 換句話說,受完考驗的 64 位元 CPU 應該都是有用的東西。 Raspberry pi3 有個好處,就是整套單板在使用時不必另外加裝冷卻裝置,不必加裝散熱片,也不必使用冷卻風扇,我用手指直接接觸晶片表面,溫度不高。據說,只有它使用的 micro SD 記憶體在溫度比較高時會出問題,我生活在紐西蘭,常年溫度不高,所以沒遇到過這方面的問題。

我新購買了兩片 64GB 的 micro SD ,用來改裝原為 32GB 的純文字視窗 Debian 作業系統。有視窗可用時,不必非用純文字不可,有視窗的環境,編寫程式還是比較方便的。我也試過觀賞影片的性能,影、音輸出的效果都還不錯。檔案傳輸可透過 USB 或在家中使用 SSH 的軟體功能,在家裡幾台電腦之間利用網路互傳檔案。已有幾套 Forth 系統可以在此單板電腦上使用,發展環境算是優良。

現代電腦作業系統的安裝方法,採用取得系統之 .img 檔案後,直接在主機上將 .img 檔案展開至指定的外加碟片的方法。將此碟片插入插槽,就能直接啟動系統,進行設定。設定完畢,單板電腦就能自主運行了。安裝程序簡單、方便、迅速,但由於單板電腦上沒有電源開關,我特地採購了附加開關的電源插座,讓這樣的系統在開啟螢幕與單板電腦時方便一些。為了自己今後易於參考,我在此處留下不常用之系統安裝記錄,算是記錄了學以致用的事實,我在貼文前進行過下列完整的操作。

我取得 Ubuntu Mate 20.04 OS 之 .img 檔案的網址為:
https://releases.ubuntu-mate.org/20.04/arm64/
我挑選的 .img 檔案為:
ubuntu-mate-20.04.1-desktop-arm64+raspi.img.xz
1.1 GiB 2020-Oct-29 14:57

展開操作記要:
在將 micro SD 插入 USB 端口前,先用 df 指令確定當時系統的狀態。插入 micro SD 到 USB 後,再用 df 指令確定新插入的位置在 /dev/sdc2 。
確定這項訊息後,便可以開始進行將 .img 檔案展開於 micro SD 的對答式視窗操作。

點擊一下檔案 ubuntu-mate-20.04.1-desktop-arm64+raspi.img.xz 。
會出現我的本機為 480GB 硬碟的視窗訊息,其中有一空白欄,會問你想要將 .img 檔案展開前往的位置在那裡?
經由上列 df 的操作,確定新插入本機 USB 之 micro SD 所在位置為 /dev/sdc2 ,因此選擇此一將要展開 .img 前往的位置為 /dev/sdc2 。
隨後,畫面顯示受影響的裝置為 sdc2 後,點選 "還原" ,系統便會自動展開整個 .img 檔案於 micro SD 上,最後,耗用記憶體的量約為 6GB 。

此後,我會在 Raspberry pi3 單板電腦上發展一些軟體,也要花些時間來熟悉他的輸出/輸入性能,但不會用它來上網瀏覽訊息。
所有以展開 .img 檔案安裝系統的方式,都跟上述系統安裝的方法相同。

2025年2月15日 星期六

砥礪前行

砥礪前行


曾慶潭 Ching-Tang Tseng
ilikeforth@gmail.com
Hamilton, New Zealand
16 February 2025


任何設計好的系統都必須經過長期考驗,執行考驗測試出結果卻是一種磨練,這種工作做起來並不比設計系統來得輕鬆。磨練系統需要範例,範例貴在具有創意,創意還得要有意義,範例才值得採用,有意義、有創意的範例就值得珍惜。自己能設想出來的範例是有限的,從網上尋求一些資源則是必要的,我在網上搜尋範例資源時,有過這些體會。

大家最熟悉的資源莫過於 Rosetta code 網頁: https://rosettacode.org/wiki/Category:Programming_Tasks
這個網頁的好處就在其資料公開的透明度是百分之百,提出來的範例題目毫無隱瞞,附貼出各種程式語言的程式解答也毫無隱瞞。不限制瀏覽、不限制下載、不限制貢獻、不限制引用,全球使用者均能受益,網頁受人尊重,貢獻者也多。

網上還有許多可用資源,這裡介紹另一知名之 Project Euler 網頁:https://projecteuler.net/archives
經過許多年的發展,這個網頁目前(20250216)的範例題目已經累積到將近有 1000 個了。網頁則要求使用者必須登記後才能參與活動,也才能看到題目的程式解答,使用起來有點不便。我大致瀏覽過其範例題目的內容,顯示出不少問題均涉及必須使用具有可程式化大數計算能力的系統才利於獲得答案。因此,能貢獻解答而貼出的範例程式就比較有限了,一般傳統的程式語言不具有大數計算的功能,還要能程式化,那就更不容易見到了。所以,參與活動者的貢獻也就因此而不如 Rosetta code 網頁來得多。當然,相較之下顯示出這個網頁內的範例資源題目比較艱深。

設計 ABC Forth 系統曾經留下的記錄,可以追溯到 1980 年代,剛開始時,主要目標放在為 Forth 系統設計出好用的中算符程式寫法。因為我個人的研究工作,常需要進行可程式化數學計算程式的設計,中算符的程式寫法省時好用,於是愛用 Forth 就愛屋及鳥的研發出 Forth 自我形成的中算符系統,中算符功能是設計出整個系統之構想的起源。

後來的發展則偏重於程式結構語法,BASIC 程式語言表達數學式子的方式方便好用,有利於數學計算方面之程式設計,於是 ABC Forth 的雛型應運而生,有了系統性的結構。由於它是架設於一般 Forth 系統上延伸出性能而成,它的特色就是 BASIC 式的程式可以跟傳統 Forth 程式混用,共享資源後執行出共榮結果。

可程式化的大數計算能力,是後來的發展,因為需要而加裝。加裝的過程中順便發現了設計出可程式化的複數計算能力、或比較罕用的可程式化常規分數計算能力、甚至於其他數系的可程式化計算能力都是類似的設計。原本的大數計算只考慮處理大整數問題,延伸性的研究,則設計出了能處理不限位數大浮點數問題的系統。

這個網頁過去公佈過的實際程式,都附有貼出時間。曾有好幾次在我發展出特殊性能而網貼成果時,網上都還見不到能執行出同樣性能的程式語言系統,網文貼出後,大家互相勉勵、互相砥礪,後來我就看到了別種程式語言性能上的進步。

互相觀摩別種程式語言設計出來的程式,能幫助自己設計 Forth 程式。公開 Forth 程式,當然也能幫助別人使用各自喜歡之程式語言設計程式。這裡刻意挑選了一個 Project Euler 網頁提出的範例『題目 8 』進行一次小小的貢獻。

為了砥礪前行,繼續發展 Forth ,這次,不用 BASIC 式的語法設計程式,純用 Forth 。

題目雖只採用一千位數來考驗程式設計,它卻是個形同『海底撈針』式的問題,舉例不用太誇張而使用海量位數,使用一千位數點到為止就夠了,用來研究問題才能恰到好處。

題目問你一千位數中連乘 4 位數者,那一個位置的數字最大。然後,再問你連乘 13 位數時又是那一個位置的數字最大?

題目從網頁擷圖展示如下,隨後附貼純用 Forth 寫成的程式及其執行後所得的答案。

所採用的系統為 ciForth 5.3.0 ,作業系統為 Ubuntu 20.04 。

鍾情於 Forth 的愛用者可以直接載入程式執行出結果。別種程式語言的愛用者,請勿嫌這個程式的冗長與複雜,它有助於了解求解問題的程式規劃步驟,指令名稱就是說明。

附記 : 由於三月份遠行返台一個月,貼文暫停兩次。四月份再見。

\ euler08.f

: cinumber ( addr -- n )
  0 0  rot dup 1+ c@ [char] . = >r
  $@ r@ if 1 /string then
  >number nip 0 = 
  if d>s r> if negate then 
  else r> drop 2drop 
  then ;

create chr 128 cells allot
create val 128 cells allot
create tmp 2 cells allot

s" 73167176531330624919225119674426574742355349194934" chr $!
s" 96983520312774506326239578318016984801869478851843" chr $+!
s" 85861560789112949495459501737958331952853208805511" chr $+!
s" 12540698747158523863050715693290963295227443043557" chr $+!
s" 66896648950445244523161731856403098711121722383113" chr $+!
s" 62229893423380308135336276614282806444486645238749" chr $+!
s" 30358907296290491560440772390713810515859307960866" chr $+!
s" 70172427121883998797908792274921901699720888093776" chr $+!
s" 65727333001053367881220235421809751254540594752243" chr $+!
s" 52584907711670556013604839586446706324415722155397" chr $+! 
s" 53697817977846174064955149290862569321978468622482" chr $+!
s" 83972241375657056057490261407972968652414535100474" chr $+!
s" 82166370484403199890008895243450658541227588666881" chr $+!
s" 16427171479924442928230863465674813919123162824586" chr $+!
s" 17866458359124566529476545682848912883142607690042" chr $+!
s" 24219022671055626321111109370544217506941658960408" chr $+!
s" 07198403850962455444362981230987879927244284909188" chr $+!
s" 84580156166097919133875499200524063689912560717606" chr $+!
s" 05886116467109405077541002256983155200055935729725" chr $+!
s" 71636269561882670428252483600823257530420752963450" chr $+!

: chr>val ( -- )
  val 128 cells erase
  chr $@ over + swap 
  do 
     tmp 2 cells erase 
     I c@ tmp $c+
     tmp cinumber val $c+
  loop ;

: mult13 ( add -- n )
  dup c@ swap 1+ dup 12 + swap
  do 
     I c@ * 
  loop ;

variable maxaddr
variable maxval

: 1000calculations ( -- )
  0 maxval !
  val $@ over dup maxaddr ! + swap
  do 
    I mult13 dup maxval @ >
    if   I maxaddr ! maxval !
    else drop
    then
  loop 
;

: check ( -- )
  maxaddr @  val $@ drop - 
  chr $@ drop + 13 type
; 

: main
  chr>val
  1000calculations
  cr ." greatest product 0f 13 adjacent digits are  " check 
  cr ." product value =  " maxval @ . ;

\s

Largest product in a series
Problem 8 
The four adjacent digits in the 1000-digit number 
that have the greatest product are 9 × 9 × 8 × 9 = 5832.

73167176531330624919225119674426574742355349194934
96983520312774506326239578318016984801869478851843
85861560789112949495459501737958331952853208805511
12540698747158523863050715693290963295227443043557
66896648950445244523161731856403098711121722383113
62229893423380308135336276614282806444486645238749
30358907296290491560440772390713810515859307960866
70172427121883998797908792274921901699720888093776
65727333001053367881220235421809751254540594752243
52584907711670556013604839586446706324415722155397
53697817977846174064955149290862569321978468622482
83972241375657056057490261407972968652414535100474
82166370484403199890008895243450658541227588666881
16427171479924442928230863465674813919123162824586
17866458359124566529476545682848912883142607690042
24219022671055626321111109370544217506941658960408
07198403850962455444362981230987879927244284909188
84580156166097919133875499200524063689912560717606
05886116467109405077541002256983155200055935729725
71636269561882670428252483600823257530420752963450

Find the thirteen adjacent digits in the 1000-digit number 
that have the greatest product. What is the value of this product?

Ans : 23514624000

greatest product of 13 adjacent digits are  5576689664895 <-- from 197 digits
product value =  23514624000  OK


2025年2月1日 星期六

專家系統

專家系統


曾慶潭 Ching-Tang Tseng
ilikeforth@gmail.com
Hamilton, New Zealand
2 February 2025


53年前(1972)出現過一個曾被公認是很成功的人工智慧軟體程式專家系統 MYCIN ,它被用來根據血液數據提供出診斷與治療建議。那時的電腦性能沒有那麼好,但可以容得下500條規則進行推論得出結果。這個應用典例,說明了專家系統由推理引擎及數據資料庫所形成,它是一種由專家整理出來的確定性人工智慧,由電腦執行的過程中,沒有模糊的(fuzzy)決策理念摻雜其間。它跟現今的熱門話題:運用類神經網路發展出來的人工智慧(AI)系統不同,差別就在設計系統時只依據專家總結出來的定論規劃程式。

運轉原子爐時,為了安全,必須講求運轉人員能迅速的確定爐心燃料棒的狀況,判斷狀況的依據則僅能根據各種儀錶的讀數。能運轉原子爐的工程師都是專家,都必須被訓練成能根據儀錶讀數解讀出燃料棒發生了什麼事情?而且判斷要快,才能立刻採取正確的處理措施,確保原子爐一定安全。

我曾運轉過一座 40MW(t) 的重水式原子爐許多年,爐心有大約 200 根以天然鈾製成的金屬燃料棒,由於它是專門供作研究用的巨型核輻射裝置,內部全面採用必須絕對安全的設計。例如:每單根燃料棒冷卻水的出口管路,都必須經過好幾套儀錶的監測,運轉時隨時提供重要數據,關鍵性的參數不正常時,還可能立即引發原子爐『急停』(trip),自動強制原子爐處於絕對安全的停爐狀態。

所用的監測儀錶有氣體分裂產物監測器(GFP)、冷卻水流量計(FT)、冷卻水溫度計(TE)、冷卻水壓力計(PIS).....等。由於壓力參數最敏感、響應最快速,一裝就三套,兩套接通到流量測量元件(FE)的上游,一套接通到下游,兩邊的壓差有 2 psi 的程度。冷卻水壓力出現問題時,壓力計的信號會直接驅動壓力控制器(PC),引發原子爐自動急停。

研究用原子爐的燃料棒比較容易出現異常狀況,因為爐心的運轉條件必須經常配合研究需要而調變。甚至於在全功率運轉狀況下,經常有添加的研究設施在爐心範圍內作動,也有只能短瞬間被照射的物質必須快速進出於爐心領域,而原子爐的動態性能研究本就是這種原子爐建造起來的目的。種種的研究需求都會令原子爐運轉功率變化,同時就令燃料棒的狀態跟著變化。

燃料棒出現問題時,出口冷卻水的監測參數會立刻顯現出來,根據參數判斷出問題是一門專家才能搞得很清楚的技術。判斷必須講求迅速,狀況又有許多種,把專家確定的知識設計成以電腦輔助運轉的專家系統就有價值。專家系統能快速的提供建議,告訴專家那些可能,例如:燃料棒內套管破了、外套管破了、管頂或管底的閥門漏水了、管內防止燃料棒斷掉的先斷式張力棒(tension member)斷掉了、管內冷卻水道變形或有雜物堵塞妨礙冷卻了.....等等現象,都需要能被快速的判斷出來,以便採取措施。這種專家技術討論起來有點複雜,我只把相關圖示貼在這裡供大家認識。請問:光憑上述資訊,能自己把儀錶參數與燃料棒狀況對應得上嗎?答案是不能,只能由學通過整個系統的專家來回答問題,這就是建立專家系統的好處。此外,我因較為資深,碰過例外情況,還能在例外狀況發生而專家系統上沒有列入程序的狀況下解釋問題,我做過這種貢獻,是比專家更專家的事情。
設計電腦的專家系統有許多例子可舉,我們可以舉一個很簡單之數學方面的專家程式為例,越簡單越好,主要目的只在說明專家系統的道理:

二元二次方程式的類型判別式,早就已經被整理得很完善了。從專門的數學手冊中,都可以找到這種規則分類表,使用者只須取出二元二次方程式的每一項係數,自行代入指定的幾個判別式,計算出結果,然後對照至規則分類表中的幾個條件,就能判別出方程式是屬於那一種幾何圖形?所根據的方法,在數學上稱為不變式論(Invarians)。

這樣的小型數學專家系統,於電腦的使用沒現在那麼方便前,至少還是要靠一點人工的計算,與人工設計的邏輯判斷來得到結果。但是,如果不能方便的設計程式,要解決這樣的問題,仍是不值得耗時、耗力去完成。 ABC Forth 系統改善了傳統 Forth 的這種情況,這一篇文章也係為了解決此類問題而寫。

在三位作者A. D. Aleksandrov(Editor ), A. N. Kolmogorov (Editor ), M. A. Lavrentiev(Editor ),所著之 Mathematics: Its Content, Methods, and Meaning (3 Volume Set).The MIT Press 於 March 15th 1969 出版的書中,Chapter 3 第十二節就刊載了整理得非常完善的規則分類表,我們就以這份表格來設計程式,設計出來的程式幾乎不用解說,任何人都可以很容易的明白與使用,程式中就得用到性能優越、用法平易近人的邏輯運算,才能表現得非常清楚。

由於我在設計 ciForth 的浮點運算系統時,把 『 E 或 e 』當作一個指令來處理出 10 的幾次方之表達方式,程式中不宜再用 E 或 e 來作為變數名稱。因此,這個範例程式中改採全用雙字元來宣告出變數,想用 E 或 e 時,改用 EE ,特此提示。


\ 二元二次方程式判別程式
\ 根據不變式論(Invarians)設計。
\ 作者:曾慶潭2011/4/16保有一切版權,知會作者,附加本宣告則允許引用。
\ Copyright 2011/4/16 Ching-Tang Tseng
\ Permission is granted by the author to use this software
\ for any application provided this copyright notice is preserved.
\ 2025/2/2重整內容並在Lina64之ABC Forth系統上執行,測試無誤。

10 Reals I1 I2 I3 K1 AA BB CC DD EE FF

: INPUT-COEFFICIENTS {{ AA = 9.0 E 0 }} {{ BB = 0.0 E 0 }} {{ CC = 1.6 E 1 }} {{ DD = 0.0 E 0 }} {{ EE = 0.0 E 0 }} {{ FF = 1.0 E 0 }} ; : DISCRIMINANTS BASIC 10 LET { BB = BB / 2.0 E 0 } 20 LET { DD = DD / 2.0 E 0 } 30 LET { EE = EE / 2.0 E 0 } 40 LET { I1 = AA + CC } 50 LET { I2 = AA * CC - BB * BB } 60 LET { I3 = AA * CC * FF + 2. E 0 * BB * DD * EE - AA * EE * EE - CC * DD * DD - FF * BB * BB } 70 LET { K1 = AA * FF - DD * DD + CC * FF - EE * EE } 80 END ; : DESCRIPTION BASIC 10 PRINT " 二元二次方程式:AX^2+BXY+CY^2+DX+EY+F=0 " 20 PRINT " 係數為: " 30 PRINT { " A = " ; AA ; " B = " ; BB ; " C = " ; CC } 40 PRINT { " D = " ; DD ; " E = " ; EE ; " F = " ; FF } 50 PRINT " 方程式為: " 60 END ; : MAIN BASIC 10 RUN INPUT-COEFFICIENTS 20 RUN DESCRIPTION 30 RUN DISCRIMINANTS 40 IF { ( I2 > f0.0E0 ) AND ( ( I1 * I3 ) < f0.0E0 ) } THEN 150 50 IF { ( I2 > f0.0E0 ) AND ( ( I1 * I3 ) > f0.0E0 ) } THEN 170 60 IF { ( I2 > f0.0E0 ) AND ( I3 = f0.0E0 ) } THEN 190 70 IF { ( I2 < f0.0E0 ) AND ( I3 <> f0.0E0 ) } THEN 210 80 IF { ( I2 < f0.0E0 ) AND ( I3 = f0.0E0 ) } THEN 230 90 IF { ( I2 = f0.0E0 ) AND ( I3 <> f0.0E0 ) } THEN 250 100 IF { ( I2 = f0.0E0 ) AND ( I3 = f0.0E0 ) AND ( K1 < f0.0E0 ) } THEN 270 110 IF { ( I2 = f0.0E0 ) AND ( I3 = f0.0E0 ) AND ( K1 > f0.0E0 ) } THEN 290 120 IF { ( I2 = f0.0E0 ) AND ( I3 = f0.0E0 ) AND ( K1 = f0.0E0 ) } THEN 310 130 PRINT " 已知條件不符合程式執行要求,未判別出結果。 " 140 GOTO 999 150 PRINT " 橢圓,典型方程式為:(X^2/a^2)+(X^2/b^2)=1 " 160 GOTO 999 170 PRINT " 虛橢圓,典型方程式為:(X^2/a^2)+(X^2/b^2)=-1 " 180 GOTO 999 190 PRINT " 點,典型方程式為:(X^2/a^2)+(X^2/b^2)=1 " 200 GOTO 999 210 PRINT " 雙曲線,典型方程式為:(X^2/a^2)-(X^2/b^2)=1 " 220 GOTO 999 230 PRINT " 一對相交的直線,典型方程式為:(X^2/a^2)-(Y^2/b^2)=0 " 240 GOTO 999 250 PRINT " 拋物線,典型方程式為:X^2=2pY,其中p=SQRT(-(I3/I1^3)) " 260 GOTO 999 270 PRINT " 一對平行線,典型方程式為:X^2=a^2 " 280 GOTO 999 290 PRINT " 一對虛平行線,典型方程式為:X^2=-a^2 " 300 GOTO 999 310 PRINT " 一對重合的直線,典型方程式為:X^2=0 " 999 END ; 載入程式後,執行MAIN指令,得到下列結果: MAIN 二元二次方程式:AX^2+BXY+CY^2+DX+EY+F=0 係數為: A = 9.000000000 B = 0.000000000E0 C = 16.00000000 D = 0.000000000E0 E = 0.000000000E0 F = 1.000000000 方程式為: 虛橢圓,典型方程式為:(X^2/a^2)+(X^2/b^2)=-1 ok


這樣的程式顯示出幾項特點:

(1) 並不是只有從頭到底都必須一直計算的程式,才叫數學計算程式。這個程式根本只進行很簡單的數學計算,最後能得到正確答案,主要還是依靠邏輯判斷的功能。

(2) 非結構化的程式性能,並不是不好的性能。這個程式簡直就是一個澈底非結構化的典型程式,但是!我在設計它時,就因為系統具有能寫非結構化程式的功能,如此設計出來的程式,簡直就是照規則表直接翻譯,一次完成。

大家現在就回頭讀一讀看 MAIN 指令的內容,您不可能會看不懂程式在做甚麼?嚴格的專家經驗,就需要這樣的程式功能來表達,可貴的經驗才不會被扭曲。
反之,您若使用現行任何一種號稱嚴格結構化的程式語言,設計這種程式,邏輯判斷三次,就足以將程式設計者搞混了,那怕您將程式依序一層一層的縮格,規劃得再漂亮,寫完程式後五分鐘,就無法正確的維護了。那麼,要結構化程式語言何用?不如就像 ABC Forth 系統一樣,能夠非結構化。

作者曾經是核子反應器廠(俗稱原子爐)的運轉專家,深知當年想以程式實現專家經驗時的關鍵問題所在,如果那時我就設計了具有邏輯功能的 ABC Forth 系統,想具體實現作者的專家經驗,並實際應用設計出來的程式,作為核子反應器廠運轉時的強力輔助工具,實現計劃就不會那麼困難了。

(3) 還有,最重要的一點,就是,如果系統不提供純粹中文式的邏輯運算功能,我就不覺得設計上述的程式,對中國人而言,會有任何意義了。因為邏輯條件講求嚴謹,輸出結果講求絕對正確,程式的日後維護講求易看、易懂、易修改,沒有中文功能,就不必白費力氣去設計日後難用、難維護的程式。

(4) 近代應用於解決數學問題的商售大型套裝軟體,由於電腦易於安裝廉價大量的記憶體,執行速度也不再是應用時主要的考量問題。系統的功能也開始提供非純粹計算式的解題功能。例如:執行求解數學式子的微積分問題時,根本不執行數值分析程式,改成設計對輸入數學式的文字或符號式剖析,再經歸納出來的數學分析規則,只進行簡單的判別式計算,就能輸出正確解答。這樣的程式功能,就得依靠本章中的『條件整合』式邏輯運算功能來處理問題,上述的程式提供了一點解決此類問題的思考依據。

(5) 電腦輸出決策絕對重要,如果最聰明的人類,能夠製作出最關鍵性的決策表格,截至目前為止,甚麼程式語言?才能提供人類最清楚的表達程式,令其與表格同步。甚麼樣的程式?放幾十年後,還能夠照樣清楚的反應出專家技術。這些問題,表示為電腦設計出簡單明確的邏輯運算功能非常重要。現行 ABC Forth 數學計算系統,具備這樣的特質。