2011年12月15日 星期四

一套會講中文的程式語言

(獻給全體中國視障同胞)

曾慶潭2011-12-16於紐西蘭
Ching-Tang Tseng
ilikeforth@gmail.com
http://forthfortnight.blogspot.com

我就拿文章的標題上網搜尋資料,確定截至目前為止,沒有人設計出這樣的程式語言系統。FORTH是天生能夠使用中文文字的程式語言,沒什麼好強調的。

兩年前,我令FORTH系統『會講英文』之後,雖然可令FORTH系統的性能,大為領先其他程式語言,也沒什麼好強調的,因為,那是講英文之世界裡的問題,與中國人無關。

今天,我令FORTH系統『會講中文』,則不同凡響。此前,電腦軟、硬體的性能,未發展到足夠配合的程度之前,也難以設計。現在,能否設計出這樣的系統?只是存乎一心而已,我只寫了不到半頁的程式,就以Win32Forth V6.14系統實現了這樣的設計。總共只設計了兩個指令,『發音』與『朗誦』,就足夠用來讓這個程式語言『講中文』。

八個精簡範例應用程式,列示如下:

: test1
龍 發音 飛 發音 鳳 發音 舞 發音 ;
: test2
s" 龍飛鳳舞,龍吟虎嘯。" 朗誦 ;
: test3
s" 勸君莫惜金縷衣,勸君惜取卲年時。" 朗誦
s" 花開堪折直須折,莫待無花空折枝。" 朗誦 ;
: test4
s" 這是宜套會講中文的程式語言。" 朗誦
s" 所有相關設計,敬獻給全體中國視障同胞,非份者,請勿取用。" 朗誦 ;
: test5
s" 爽兄,我已實現了能夠完全自動語音輸出中文的程式設計,從現在起。" 朗誦
s" 隨便打中文,系統就能自動輸出了,不再需要人工作業。" 朗誦
s" 辛苦的發展有了基本成果,也沒有辜負戚老的苦心。" 朗誦
s" 我將繼續發展把愛心獻給視障同胞的工作,我要讓視障同胞能用它來聽世界名住。" 朗誦
s" 用它來寫作。目前的成果僅送給您與戚老,是為了報答您的協助與戚老的貢獻。" 朗誦
s" 但拒絕把這個系統公開,或送給不是視障的人,我說過我要防止別人藉機斂財。" 朗誦
s" 系統的品質雖然不是最好,但面對一般中文而言,使用起來已無問題。" 朗誦
s" 以後有更好的發音辦法後,我就也能實現品質更好的設計。" 朗誦 ;
: test6
s" 花間亦壺酒,獨酌無相親,舉杯邀明月,對影成三人。" 朗誦
s" 月既不解飲,影徒隨我身,暫伴月將影,形樂需及春。" 朗誦
s" 我歌月徘徊,我舞影零亂,醒時同交歡,最後各分散。" 朗誦
s" 永結無情遊,相期邈雲漢。" 朗誦 ;
: test7
s" 生命的意義在創造宇宙繼起的生命" 朗誦
s" 生活的目地在增進人類全體的生活" 朗誦 ;
: test8
s" 實行三民主義統一中國" 朗誦 ;

執行從test1到test8的這幾個指令,就都能讓這個系統立即、自動、唸出程式內所安排的指定中文。

搞非FORTH程式語言的程式設計者,您見到這樣的表白方式,請不要嫉妒到想從上述的雞蛋裡挑骨頭,有幾個字不是您才能發現的錯誤,是故意的安排,是為視障同胞刻意的安排,不是為您而安排。而且,短期內我就能自行解決中文『破音字』的發音問題,不用您煩心,假設文中夾雜英文、見不到的格式碼、見得到的圖形資料,都不用您煩心,我有本領解決。該您煩心的事情,是您若還設計不出這樣的系統,應該趕緊跟進,羨慕有理,嫉妒無用。

有朋友介紹我去參觀能唸中文文字的個人網頁,我看過了,嗤之以鼻。因其語音輸出能力,也還停留在逐字輸出的水準上,它不是程式語言,只是一個簡陋的視窗應用軟體,您想用,就只能用它以單字方式唸出中文,不能做其他任何事情,您自己能唸出的中文,都比這種產品高明太多了,何須用它?還有,買到的這種東西,根本不給音源,您要另行發展中文語音輸出於其他應用時,依然是得自行設法,買的結果,就是白花了錢。

這篇網文就來仔細談一談『會講中文之程式語言』的發展。

一般而言,中華民國的國民,基礎中文教育,主要被安排在高中國文課程的教育之中,唸完高中,大學是專業分科教育,國文教育便不再是要求重點。但良好的高中國文基礎,足夠讓您自行繼續充實這方面的知識,可以讓您自己終身全面使用中文。我接受過中華民國政府提供過的完整基礎教育,能使用中文。

我從武陵中學高中畢業,從這個學校畢業的學生,程度如何?要由社會評鑑,我說了不算。但是,我知道那裡有很好的國文老師,當年,曾有老師教了幾年國文,竟然被聘為中國文化大學的講師,只好離職去教大學了。

我38歲就被國軍淘汰,只好從公職退休了,打算另謀高就時,曾經試著應徵台灣玻璃關係企業的子公司:固相公司的廠長職務,該公司老板澈底調查我是否真的從『武陵高中』畢業?經查屬實後,積極爭取我協助該公司完成從汐止搬遷到南崗工業區的工作。他與他的特別助理,對我的大學學歷及核子工程專長沒有興趣,卻問我高中時代的校長是誰?我立刻回答說是馮堯春先生與宋金印先生,兩人同時眼睛一亮,當時,我對這種反應,確實是不明就裡,現在則引以為榮。我離開公職後,曾為幾家私營企業公司服務過,自覺,為任何一種企業幹總經理,我都能幹,包括我自己開的公司,也能幹,我只幹過總經理,沒幹過不是總經理的工作。

我終身記得我的國文老師吳祥熊老師,教我如何讀古文,一輩子都記得『上文不懂看下文』、『音同則意通』的讀書技巧。他要求我們寫文章時,不要以濫用古文來自鳴得意,文章要寫得人人都能看懂、讀了通順才是好文。可用的中文好字這麼多,專寫怪字,並不代表高尚,寫正確了才重要。

他曾介紹我們英翻中講求信、達、雅技巧的重點,也稱讚過商務印書館出版的一本世界名著:『飄』(Gone with the wind)小說中,譯者將人名全譯成標準三個字的高明譯法,如白瑞德、郝思嘉,衛希禮……等。

他說詩、詞、賦都可以自己看書後學寫,但學來寫酸溜溜的東西就沒有意義,至少代表它沒有傳頌價值。寫文章要避免掺入武俠小說式的江湖氣,那會貶低自己,反不如不要為文。文章中講求道德,能夠代表為了自己,講求愛心,就能代表為了別人。

國文老師他不只講解國學常識、教我們讀書技巧,還教書中、文中的精神,經常要求我們多多理解紙底下的東西,以及作人處事的道理,我終身受益,感激不盡。

現在的國文老師,教不教這些教國文時應該附帶卻非常重要的東西?或者是只教如何去中國化?積極培養社會小忿青。碰到這種老師,您就可以終身嗤之以鼻,也代表了您真的非常不幸,國家跟著不幸。

上述這些國文教育資歷的簡介,能夠讓我進行中文語音輸出發展時,不會走得太離譜。我所發展完成的系統內容,澈底採用中華民國固有的正體中文資源,完全刻意排斥大陸的拼音或文字顯示格式。

我當然能協助大陸完成同樣的設計,但那絕不是我該做的事情,尤其是我根本不恥於使用英文字母來拼中國文字的音,我是道道地地的中國人,是一個比大陸同胞還要中國的中國人。

今年九月十七日,我們在中原大學開FORTH月會,在蔡育秀博士的號召下,來了不少人與會。我結束演講後,已從海洋大學退休許久的戚桐欣老前輩,親自走上前來,要求買一本我寫的『ABC FORTH數學計算系統使用說明』以示支持我的發展。

此前,我沒跟戚老講過話,只知他與朱邦復、丁陳漢蓀老師都熟,我立刻回答戚老:『您都八十幾歲了,別買我的書了,您要,我就送您一本,看不看都沒關係,留著晚輩的拙著當紀念。我賣的書都不能賺到錢,但不買的人,就難以使用我所設計的系統,或者是難以與我交流技術。』

戚老邀請我去基隆他家,準備將他長期搞出來的中文發展資料,全盤轉贈給我。不幸,半個月的重感冒,耗去了我能留台辦事的時間,離台前,因為多次的應酬,飲食失控,痛風發作,若再去找戚老,肯定必須再度大吃一場,那就完了。因此,我爽了約,只能電話答謝後離台返紐。

我知道戚老多年來的中文研究心血結晶,傳贈給過不少人,但不太有人理會,或繼續進行延伸性的發展。戚老過去也未見過我有什麼本事?能幹甚麼事情?這次聽我講過一場怪裡怪氣的演講,特來關心一下。

我在『獨特的語言經驗』文末說過,我想把MIDI硬體拿來當講人話的裝備使用,仁愛一下,為視障同胞發展一些東西。我試用了戚老的資源,感覺可以派得上用場,但要耗些時間與勞力修改後才能發揮作用。因此,發動了一次『FORTH活動』,試做『語音輸出百家姓與千字文』,希望能集眾人之力完成此事。

活動初期,對參與活動者是否真誠的參與?缺乏感覺,於是出了習題強迫參與者答覆,以便了解狀況,結果發現了嚴重問題。如果活動了一個多月,參與者只想白拿傳給他的技術資料,連拼幾個百家姓來找出對應音檔的簡單分擔工作都不肯貢獻,或者敷衍了事,甚至於連安裝起Win32ForthV6.14系統的最基本要求都不肯做,而成天去網頁上『打屁』抱怨,任何人都能明白這是一種什麼狀況?絕對代表了白搞了這樣的活動,那就應該毅然決然的中止活動,我這裡絕不提供白吃的午餐。

以後,我也搞清楚了,別再舉辦這種活動,後續發展只宜自己搞。大多數的參與活動者,都很合作的完成了百家姓的程式編寫工作,但對他們的日常生活,產生了不少影響。因此,千字文的程式設計,改由我個人獨自完成。

發展了兩個半月,遭遇過不知多少次的失敗,挖空了心思,想盡辦法解決問題,連我太太都加入了提供意見的行列,我們每天散步時,都討論為視障同胞設計中文語音輸出程式語言的問題。

大師兄陳爽成為這次活動的最後支撐者,有許多大型的苦工,都是由他親手完成的,與他連絡卻無法及時得到答覆時,我開始動家人的腦筋,請小女兒小真幫忙,用她寫論文時慣用的軟體工具,幫忙我編製那種一萬多筆資料的大型檔案。女婿得知了,乾脆來為我安裝適合解決這類問題的現代軟體,為了達到目的,幾乎是全家總動員,所有材料彙整交到我手裡時,難免還有一些問題,我就得進行零星測試後修改。我不是一個肯輕易低頭的人,晚上可以少睡一點,就是要把工作完成,正常的飲食與健康的生活,就交由我太太強制干涉來維持。

昨晚趕出了結果,讓程式只剩半頁,雛型立刻傳請陳爽幫忙驗證,代表以後靠網路傳輸後依然能用,在紐西蘭,我無法隨時說走就走,趕回台灣,只能靠網路傳送。後續當然還有許多發展工作得做,系統功能不是僅只這樣而已。

能講中文的程式語言有甚麼用?對大多數人而言,根本沒用。那麼,發展這種系統的過程中,就會令發展者經常感到相當痛苦。我是為視障同胞而發展,抱持著這種心態,才能安慰自己,忍受痛苦繼續發展。

發展數學計算系統時,我為自己找到發展的目標與理由,才能發展成功。同樣的,發展中文語音輸出程式語言時,我也需要健全且有意義的理由來驅動發展,那就是為視障同胞服務,我說過我想設計出『啟明FORTH』,提供給視障同胞使用,這就是理由。

學習語言的過程是聽、說、讀、寫,視障者不能讀,怎麼辦?我代勞。

我唸高中的時候,見到聯合報上刊登廣告,徵求義工,為視障小幼苗錄製朗誦世界名著的錄音帶,心中就深受感動,但那時,我連買張車票去當義工的錢都沒有,能幹什麼?因此,一輩子記得這件事情,希望有一天能夠為他們澈底解決讀、寫的問題。

我們的社會,大多數人都不理會視障同胞的事情,讓他們大都躲在暗處,靠色情按摩維生。我也不斷的聽說,管視障同胞事務的某些人,藉機向政府、社會要錢,是既得利益者,不容外人涉入其事、以免被斷了財源。其他的惡劣行徑,就別在這裡繼續寫下去了。

我只是個小人物,管不了這麼多骯髒的社會現象,但懂得一點FORTH,自知能設計得出視障同胞可以終身使用的工具來。昨晚,我完成的設計,就能用來發展自動朗誦世界名著的程式。

現在市面上已經有人販賣軟體,讓正常人操作電腦,黏貼一段中文短文,讓電腦讀出來,但除了讀出來,不能做其他任何事情。

我設計的是程式語言,它能叫出一本世界名著,自動朗誦出來,還能操控電腦,同時進行其他事情,包括設計程式,以便解決視障同胞才有需求的操控設計,這是一套中、英文都會講的程式語言。

視障同胞的電腦寫作工具,也能根據這樣的程式語言設計出來,自動發出中文語音,可以作為響應操作後的結果,既然是FORTH程式語言,當然能夠用它設計出編輯軟體,視障同胞就能用來寫作,寫出他們的心聲,當個偉大的作家,像海倫凱樂(Helen Keller)那樣,不必只靠按摩維生。

啟明學校裡的視障小幼苗,可以使用這樣的系統來學習與寫作業,解決讀、寫困難的問題。也能用來寫信與我聯繫,告訴我,還需要什麼操作功能?我能聽到小幼苗的心聲,也能傳達我的鼓勵。寂寞時,也能打幾句話來嘉勉自己。

我發展系統所採用的方法,是車庫軟體式的發展技術,所以品質還不太好,是戚老提供的免費資源,陳爽提供的編輯資料,沒有任何人提供經費。若公開設計內容,肯定會斷掉許多人的既得利益,或者是被拿去藉機斂財。這是一套會得罪人的設計,但不必強調要讓視障同胞知道此事,反而應該要讓既得利益者明確的知道此事。網文留在這裡,全世界每天都有人來觀賞,其意義是告訴大家,不要再利用視障同胞掘利,要重視能讓他們正常生活的基本人權問題。

只要取得更好的音源,我就有本事進行同樣的設計,這篇網文公佈這個第一套系統的基本功能,形同正式的宣告:一套『會講中文的程式語言』已經誕生。

文末,我講一個最近才親眼目睹,令人難過的故事。

紐西蘭是一個注重社會福利的國家,所有視障國民,可以獲得政府無條件的妥善照顧,包括終身可以獲得完成訓練的拉不拉多導盲犬,協助他們外出活動。大眾也都同情視障同胞,主動對他們表示友善,並給予應有的禮讓。所以,我們居住的區域,經常能夠見到一位瘦弱的視障女士,牽著導盲犬上街來購物,我們散步時,偶爾會碰面,也互相打招呼,我們會主動先行繞到不牽狗的這一邊行走。

有一天,我們散步時,又與這位視障女士碰面了,她笑臉回應我們的問候。突然,我們的身後發出了另外一隻狗的狂吠,是另外一位溜狗人士,帶著一隻大狗溜過此地,我毫不猶豫的以身體擋在兩隻狗間,避免發生事情,卻不敢向後挑釁那隻想要攻擊導盲犬的沒教養狗,緊張的觀察視障女士的表情,她面露恐怖之色,只能以兩手抓緊了狗的頸項鍊,強壓著導盲犬坐下。我太太則示意溜狗人走別處的路,趕快離開這裡。我也第一次看到紐西蘭人,因為憤怒而踢他自己養的那隻沒教養的狗,事後,大家都捏了一把冷汗。

若想檢討避免讓這種事件再度發生,那就是溜狗人士根本不該溜狗到此,或者是遠遠見到導盲犬時,溜狗者就該主動改道。那天,我沒被狗咬到,算我幸運。

回顧台灣,許多人都養狗,並且整天縱放於外,導盲犬能用嗎?

很多人發展與設計語音處理軟體,都想賺錢,視障同胞能用嗎?

2011年12月1日 星期四

人助自助者

曾慶潭2011-12-02於紐西蘭
Ching-Tang Tseng
ilikeforth@gmail.com
http://forthfortnight.blogspot.com

嚴格說來,這一個月我根本沒有時間打網文,每天也只有零星的時間上網或發展程式,休息時就感到肌肉酸痛,想解程式問題時,也只能產生斷斷續續的思考。
因為我要自己修車,拆換兩輛車子的避震器,屬於車底盤重型危險工作。另外還得互換兩輛車子駕駛座旁,車門的兩個活葉支撐配件,門很重,也不能全拆下來,工作不好做。
自用車子遇到這種問題,換成一般大眾,只好花錢請修車廠代勞了。我則有能力完全自行修理後,讓車子通過紐西蘭公定的車輛制式定期檢查(WOF, Warrant Of Fitness)。為什麼一次要做兩輛車子?因為我要憑本事節省到完全不用花錢的程度修好車子,取用崔保忠學長贈送的廢棄車子料件,轉用到自己的車子上,做完工作後,必須讓廢棄車子保持仍然堪用狀態。
打這篇文章時,已經完成了避震器的拆換,車門活葉稍後再做,紐西蘭的制度是驗車未能通過時,車主保有一個月的維修期,足夠寬鬆,因此,我能選擇晴天、不忙時才工作。
自己修車就跟現今自己搞許多新的FORTH系統一樣,沒書可讀,一切只能看著辦。您若只想花錢省事,那就不用談這些情況,如果不肯低頭、不肯認命,怎麼辦?確實難辦。不幸,現今整個世界,人生確實就得經常面對這些問題,由不得您。
但是,解決問題的辦法,並不是一切無跡可尋,要有耕耘才會有收穫,天助自助者,人也只助自助者。光是怨歎,不會有結果,現在就讀一讀這篇網文,也許能夠獲得一點啟示、一點助益,這篇文章就談一談這方面的事情。
現代公開的大型FORTH系統,確實都大到創作者也難以全面寫出整個系統的使用說明文件。有具體文件的系統當然很貴,使用者請自己選用,完全合情合理。那麼,這種情況是不是等同於宣告了FORTH推廣工作的死期?完全不是的,否則,我怎麼可能自己修車?兩者情況是相類似的。
記憶體容量很大、也不貴,所以現今的FORTH系統,完全透通的源程式,可以大方使用全名而不用縮寫字當指令名稱,這一點與古時候的FORTH系統資源澈底不同,系統無書可讀的問題幾乎降低了一半。
好系統中的源程式,指令說明也都寫得清清楚楚,另外為指令寫成的書,遠離了真實的程式,反而表達得更不清楚了。
好的創作者,通常伴隨系統附贈了精彩的範例應用程式,簡明扼要的表達了整個系統的使用方法,許多只能會意不可言傳的東西,文字書本都難以表達,不這樣做,還真不知道要如何傳承創作技術呢?
其實,上述的不正常現象,對推廣FORTH所產生的打擊並不嚴重,問題的嚴重性,起自於整個社會的學習心態。忠言都是逆耳的,這樣的網文看起來就令人心生不滿,因為本文在批評學習者的心態。
很多人不讀書卻說沒書可讀,不用FORTH卻說FORTH不好用,自己都不用的FORTH,卻介紹給大家使用。我講了實話,聽起來卻非常逆耳,是吧?
如果只想讀一本書就能搞通FORTH,有!這本書就是Forth, Inc出版發行,由薄利歐(Leo Brodie)先生所著的『Starting FORTH』。看不懂英文,也有台灣鄒靖寧老師翻譯,儒林圖書公司出版的『FORTH入門』可讀。中國大陸也有黃勝先生所譯,海潮出版社印行的另一本『FORTH入門』可讀。買不到書,設法去借,或乾脆網上下載全英文的資料,逐字逐句的啃到底,我就不相信您還搞不懂FORTH!怎麼會沒書,是您不肯讀書!這些書都是紙本實體書,不是雲端虛擬書,書中若有不合時宜的部份,略去無傷大雅,不影響澈底了解FORTH。
還有,其他書我就不覺得有建議給大家的絕對必要性了,包括薄利歐先生後來另寫的一本『THINKING FORTH』亦然。面對現今大家都只看那『幾把刀』的心態,我就迎合您們,簡單告訴您我的經驗,可以不必浪費時間去讀任何其他FORTH相關書籍了。如果嫌我講得太苛刻了,那麼,丁陳老師、金城老師的書也都還存在現今的世界上,為什麼不去找來讀通它們?怎麼沒書???
其他的書或網上的譯文,就寫得像普通的使用手冊,浪費時間去讀,就真的划不來。硬要搞一本手冊,莊哲維譯成的全套ANS FORTH,可以網上免費下載,是他的熱心貢獻,我都讀了,您為什麼不仔細的讀?任何人都不該再公開講沒有FORTH書可讀了!!!
為了避嫌,我自己寫過的書或文章,此處一本、一篇都不介紹,可以吧?想全盤了解系統或結構,eForth的源程式散佈得到處都是,找丁陳老師買一本小冊子仔細啃,啃完還搞不清楚FORTH基本精神,從此之後終身別再搞FORTH。
有經驗的老手,推介Win32Forth系統,作為台灣推廣標準,主要的老手,就是原先易符公司裡的成員,公佈為推廣標準當初,與我完全無關,我只從他們手中複製了初期的系統,但我尊敬老手的決定。此系統健全好用,兩本免費的書,由諾裘利(Julian V. Noble)先生與貝知默(J. L Bezemer)先生著作,幾乎做到了隨系統附贈的程度了。有人不讀、不學、不用,對群眾沒有影響,也就罷了。若來批評這個系統的不是!卻介紹一個連自己也不用的系統給大眾,那就心態可議了。已所不欲,快施與人,是『幾把刀』教您這樣做?那就讓大家看看,您將來還想往身上自插幾把刀?
老手未必是高手,但老手努力用過系統之後,提出來的嚴重問題,就是真正的嚴重問題,老手希望反對看法的人努力克服問題造福人群,但是直到今天為止,那些嚴重問題沒有人解決過。
您自己也無能解決,又不肯聽逆耳忠言,卻繼續誤導群眾,讓大家浪費時間陪您鬼混您想混的那個系統,我會跳出來講話。更有甚者,這幾天還看到認為自己也是FORTH老手者,只顧表現自己也設計了自己的FORTH系統,就來反對Win32Forth,請問您設計的系統對社會進行過多少貢獻?能比Win32Forth系統好?努力貢獻過再來介紹吧,不想貢獻也沒關係,您請自用,既然自認為是老手了,就更不應該對推廣標準進行破壞,否則,我直說,您是別有心機。
我的網文內早已說過那種系統不能用的原因,您不讀也不學,卻引用一大堆程式語言來狡辯,語言『懂』得多了代表甚麼?不代表甚麼,只顯得有點輕浮不穩,貢獻幾百個程式教育社會才有意義,列出幾百種程式語言的名稱沒有意義。我則絕不重寫寫過的東西,為此,我反不覺得您還是FORTH老手,卻認為您只愛現別種程式語言。
您自己或自願附和者享受自己的系統,我絕無異議,要不然您就耗費上萬個小時,寫它幾百個程式,證明您想介紹的系統不是老手講的那樣:『具有嚴重問題,將來會搞不下去』,我就慎重其事的跟你學。網頁上推廣自己設計的系統,推不下去者,都因吹噓所致,使用Win32Forth系統作為推廣標準,就沒有這些問題,多少年來,它恆只忍受大家的攻擊,包括現在台灣的不用之客。
有人不願合群共襄盛舉,卻老批評FORTH系統都只能獨搞,這樣的批評又誤導群眾了。Win32Forth系統的程式貢獻者何止幾十人?包括我們台灣的白日東醫師在內,總數可能超過百人,國家遍及全世界,年代超過十八年,截至目前為止,那一個系統能像它一樣?我用FORTH三十幾年,從未見過。就算發現後來的版本,越來越不像話,甚至於有好幾個版本,一直都存在著嚴重的問題,始終都不修改,根本不好用,最新推出的版本也全不可靠,要跳號選擇版本才能使用,系統已經演變得這麼糟糕了,我卻仍然忍受問題,繼續共襄盛舉。超過百人貢獻出來的系統,每個程式我都看得下去,能稱這個系統為獨搞嗎?我看批評者才真孤獨,來合群吧,合群才得歡心,孤獨當然鬱卒。
截至目前為止,無論什麼層次的人,從十歲到八十歲(我已試推廣過),無論什麼時候,只要您真心誠意的想學FORTH,就請直接開始接觸Win32Forth系統,它完全不要錢,資源多到您看不完,我曾使用它超過上萬小時,寫成過上百個程式,這個網頁內曾經刊載過的程式,幾乎都是為Win32Forth系統而寫。此前,任何其他FORTH系統,都不值得我這樣子下功夫無條件奉獻,那些基本作法上就出問題的殘障系統(Disable FORTH system),我終身都不想再碰。如果您公開談論批評FORTH幾個月,卻連Win32Forth系統都裝不起來,省省吧,免得到了後來,大家都發現您根本不貢獻,努力貢獻過的人,出一個小問題,要求展示您自己設計之系統的真程式,就能令您難堪。
任何程式語言都可以搞,但別說FORTH的不是。任何FORTH系統也都可以搞,但不要來破壞FORTH社群可以用來溝通的推廣標準,我能證明在64位元系統上跑Win32Forth系統還好用得很。有問題,我也都能自行修正,第一套裝上64位元W7作業系統的Win32Forth,完全是由我自己修改安裝而成,並立即公開由世人自行比對出修正之處,V6.14.00以後的版本就作了與我完全一樣的修正。新時代會自然產生適合用來溝通的新標準,值得使用的新標準還沒有出現,以後會有,現在倒是可以確定,不會是您設計的那種殘障系統,您想獨挑大樑自己推廣,那就很好,我們早就願意退休了,過去這幾年FORTH的沒落時期,您為什麼不做?要不然,我設計系統時,早就會從您想搞的系統開始,不會是Win32Forth系統。在我之前的人,辛苦推廣Win32Forth系統時,您躲在那裡?這是不是台灣目前普遍的心態?
習慣使用非FORTH程式語言的人,容易以它種語言的方式,誤解FORTH的基本觀念。我發動一次FORTH活動,從大家來往的過程中就能體會出來,活動主旨要介紹Win32Forth系統的使用方法,目標只唸百家姓,大部份人都沒興趣參與,因為百家姓有什麼好唸的?搞編譯式程式語言者,確實可以這樣想,搞FORTH程式語言尤其是Win32Forth就不能這樣想。
別種程式語言設計完唸百家姓的程式後,產品真的就只能唸百家姓,不作它想。FORTH系統作完了,唸百家姓的功能成為系統中的一個增用指令,後面可發揮的空間無限,彼此狀況完全不同。您不想參與,就失去與我交換使用FORTH系統經驗的機會,我也失去向您學習的機會。活動不容易舉辦,我則學到了不少東西,很值得。我帶頭活動後,參與者能得到什麼東西,那得捫心自問,人助自助者,人不助不自助者。
現代FORTH的使用方法,與傳統FORTH的使用方法也有很大的不同,參與活動者見過我提出來的一些新東西,也還有很多新東西沒被提出來,FORTH外界的所有資源,現代FORTH都能叫來使用,就算您不愛用Win32Forth系統,也別再幼稚到老愛提及『無法利用外界大量資源』的這一說詞,來批評FORTH的不是,老手您自己看得懂名家設計的核心程式,十幾年前『操控一下FORTH系統的UP就達到目的了』。若您自己喜歡設計系統,卻沒這種本領,您的FORTH觀念豈不是落伍了十幾年?沒關係,不會就該好好學一學。文章看到這裡,趕緊去追蹤一下我講的指令,全部只用五、六個組合語言指令,就能完成設計,學會了,就在心中為這個系統道歉,以後別再光靠批評Win32Forth系統的不是丑表自己。
我們使用FORTH都三十幾年了,想學FORTH的新手,無論您怎麼要求,絕不能要求老手老是只能跟您談基本指令,實體書早就擺在那裡,人只助自助者,人除了睡覺能增肥外,人間沒有可以不勞而獲的東西。如果您真想學通FORTH,到青海省、北大荒也能學得通,心意不誠,拜甚麼師也沒有用。

2011年11月15日 星期二

FORTH活動

曾慶潭2011-11-16於紐西蘭
Ching-Tang Tseng
ilikeforth@gmail.com
http://forthfortnight.blogspot.com


        這個月的月初開始,我透過中華民國FORTH語言協會的網站FigTaiwan,宣佈發起了一次FORTH活動。主旨是讓參與活動者,能夠增進使用Win32Forth系統的能力,活動目標簡化成『語音輸出百家姓、千字文』。
        訊息在上述網站刊出至今,我們已正式的活動了半個月,進展順利,我自己也從活動中獲得了許多益處。事實上,我們已令電腦中的Win32Forth系統將百家姓唸出來了。參與活動者能夠得到什麼東西?只能捫心自問,也可能只是垃圾一堆,該自己體會。
不幸,我抽空回頭檢視FigTaiwan網站固有訊息時,發現了宵小搞小動作的情況,許多過去曾經發佈過的FORTH實作程式,被刻意的刪除了。今天,會發生這種事情,是早就在預料中的問題,我們必須面對社會上永遠存在的無恥之徒,做好準備工作。
我自己的網頁,自己完全能夠控制,資料都存在從來不上網的電腦中,這種作法,就是用來面對破壞問題的。FigTaiwan已經破壞的訊息,我可以在這裡逐步恢復。這次事件恰好給我一個機會,重新整理一些想貼而不想拿掉的網文,第一篇,就是此次發起活動的公告,宵小刪除不掉,他是自取其辱。

        今後,我就以控存資料從1開始的編號,一路恢復下去,將我想貼而不想拿掉的網文,重新貼回我自己的這個網頁。

        *****************************************

舊文不得不貼!


這一段是2012年存檔的舊文,原本不想貼出,端賴於網上惡徒日後的行徑來決定該不該貼。網上惡徒若不惹我,我絕不會貼出這篇毫不客氣的貼文,敢來惹我,那麼,為甚麼不該網上讓這種人永遠丟臉?我貼文又不用花錢,比你花了錢才能貼文惹我的用網方式值得,請好好消受。

2013/12/31再度見到無恥之徒張燕南利用FigTaiwan網頁,指名道姓的胡扯我的事情,還敢硬傳給我。這個時候,不必客氣了,該向全世界講清楚就明白的講。很多FORTH高手早就跟我一樣,根本不對張燕南的任何網貼搭腔,確實一點都不值得搭腔。再度見到這名網上惡徒的惡劣行徑時,該給他侮辱,就不必客氣,否則,整個社群怎麼可能醒轉得過來?

2012年庫存舊文

經過了幾個月的靜候與觀察,我確定了搞小動作刪除我『發起FORTH活動公告』的宵小,就是FigTaiwan由陳爽安排的網管張燕南。張燕南之外,除了陳爽,沒有人有權力執行這個操作。陳爽,您會嗎?如果會,怎麼還來跟我活動?

我與國際友人仔細討論過網頁公司會否選擇性刪除資料的問題?大家一致回答,除非是違法資訊,那怕是妖佛圖或淫蕩照,公司必有行政規定,不能做這種事情,以免自毀信譽,甚至於租金未繳,網頁公司也絕不會選擇性刪文,懂吧?舉辦FORTH活動公告,絕不違法。那麼,執行刪除FigTaiwan網頁內容的惡劣行為者,就是張燕南,絕非其他人。我抖完實情後,你再拿任何藉口,解釋這是網頁公司的問題,絕對無人相信。

    2012年起,FigTaiwan是被一群喜歡散佈台獨謠言的惡徒所把持,陳爽是網頁的出資人,這一群人的作為令我作嘔。

我在經商期間,張燕南就不斷假藉FORTH協會資訊管道,傳送各種算命圖片與妖佛照片,侵犯我的通訊郵箱,影響經商急件作業,那個年代,圖像、照片最耗記憶體,形成嚴重的問題,信箱爆滿時,每次打電話委請租用公司代為清理,一次要扣15元美金,屢次警告張燕南,他根本不理,迫不得已,後來我才發函請陳爽出面制止,竟然有效!後來詢問陳爽,他自己告訴我,根本就是陳爽出錢,顧了張燕南這個亂民在FORTH社群裡為非作歹,我卻只能被莫名其妙的告知他們的亂民關係。

從此之後,我熟記此人的惡劣德性。此前,為了推廣FORTH,我按捺住,沒找張燕南理論,但陳爽明確的知道此事,擺明了支持他繼續亂搞。張燕南在我開始使用臉書網頁時,曾來要求連結,當時不疑有他,後來,家人與我共用網頁時,不耐煩他經常亂傳台獨謠言新聞,主動將其刪除,我因不知此事,而將他重新連上,又過幾天,家人告知,他一直如此,我也只好由家人教導,學會如何操作將這種宵小刪除連結的技術了,因不常做,最近又要做,仍得請家人幫忙,實在不勝其煩。

四年前,我剛開始想學國際知名網站comp.lang.forth裡的FORTH好手,也將有益的技術網文自行貼進FigTaiwan網頁,供大家永久參考時,試過許多次網貼操作,熟料難以如願,我曾在comp.lang.forth做過同樣事情,很容易完成。但兩相比較,完全不同,為何如此?

當時,這兩個網頁的操作功能完全相同,但FigTaiwan的貼網權力,是由張燕南把持著,我必須將全篇由WORD編版辛苦打成的底稿傳給張燕南,才能由他貼文,如此監管貼網權,我並不介意。但是,網文貼出後,竟然下標明示作者是張燕南,不介意也不行了,因為,大陸同胞看過我的個人網頁後,寫給我的來信中,強調那是張燕南已經貼過的著作,他們看過,我這個原作者反成了抄襲者,這種窩囊事情怎能用來教壞全體中國同胞?此事要在我後來貼文於自己的網頁,指明尊重創作權後許久,張燕南才自知無恥,而全面修改所有的舊版面。大家可以隨時回頭重新仔細閱讀張燕南在FigTaiwan曾經留下的網貼,他簡直就是一個連一句話都寫不清楚的網管,還敢竊佔我的創作,這是我的奇恥大辱。

今天,如果那一位熟手想到comp.lang.forth網頁上搜索90年代初期的任何舊資料,沒有找不到的可能。這一段我想導正社會風氣的不平之鳴,就順便教一教大家認識這種學習FORTH的現代技巧,我以教訓惡徒張燕南的方式告訴大家,我自己有許多可貴的技術,來自那裡。您要是不信,現在就離開我的網頁前去實作,就算您學我這麼調皮,硬打一個『胡扯FORTH(Babbling forth)來搜索,該網站都能提供您一大堆有價值的資訊。但是,請看一看FigTaiwan網頁,能無恥侵犯別人的創作,惡意標示成為己有,要明指他丟臉後,才全面刪改舊資料的行為,只有FigTaiwan的網管張燕南才做得出來。FigTaiwan網頁因此就難以存在有用的資訊,甚至於舊垃圾也都不見了,是那一群惡徒使然。

陳爽出資資助他幹這種窩囊事情,為我所不恥,講不聽,只好收手不去貼技術網文了。我想,這許多年來,台灣大約也有許多好手,領教過這麼惡劣的網頁與網管,但都為了顧及日後FORTH群體的發展與溝通,寧願忍氣吞聲,敢怒而不願言。難怪那裡不太容易見到有營養的內容。我個人有嫉惡如仇、擇善固執的壞脾氣,但並不鼓勵台灣的FORTH同好向我學習,能忍受這些無恥行為的人,不必學我。

我在FigTaiwan網上還見過其他更多的惡劣現象,但若與我無關,便不想多言,侵犯到我,絕不客氣。

最近,20128月初,諶其騮也利用FORTH管道,散佈台獨謠言新聞到我的臉書私人網頁領域,硬傳那種亂罵甚麼老蔣、小蔣的謠言新聞給我,我對亂罵任何人的訊息都沒有興趣,並表示這種訊息污染我的親朋好友視覺感受,於是網上當場制止,他還不理,一怒之下,想設法切除與他的連結,卻忘了該如何操作。搞了許久,竟然發現,不切他的連結時,瀏覽國際FORTH論壇的操作,突然必須經過大陸簡體字的畫面才能前往,切除成功後就恢復正常,來往三次,屢試不爽。改試切除自己家人的連結,則無此現象,於是,警覺到諶其騮也有問題。

隔日澈底查驗他曾稱是好意,於2011-6-12傳給我的一套所謂的FORTRAN科學程式庫資料夾,我收到下載後,仔細比對發現,資料夾的內容,實際上就是美國伊利諾州立大學網上公開供應的程式,那裡提供全套特殊函數的源程式,歡迎全球自由下載,好幾年前,我早就自己收集過了。諶其騮傳來的資料夾內,卻附帶了好幾個網頁自動執行檔,他未明說資料來源,只說是留學美國帶回來的,我深感困惑,為何要以這種方式解釋已經能夠自由遍佈全世界的資料?

我現在才因突然警覺而進行掃毒檢查,掃毒程式掃出了幾個病毒,殺光檔案,資料夾也清不掉。當初自己失查,曾將此資料夾複製到三台電腦內,這次,為了清理它,我花了一整天,心中難過無比。

    這幾位老兄在FORTH社群裡為非作歹,令我倒盡味口。諶其騮現仍從事於教書的工作,因此,我得請你特別注意自己的形象,萬勿在社會上自尋恥辱,讓自己在學生面前留下終身的難堪。如果你能乖乖的推廣FORTH,不要以謠言新聞侵犯我,對於你的任何FORTH打算與作為,就算我不想參與或支持,也絕對不會有任何異議。侵犯我,我就不客氣的回敬你。惡搞、散佈謠言新聞的人,怎能教出正常的學生?

堂堂一個中正理工學院軍校畢業的陳爽,出資資助台獨思想濃厚的亂民,在社會上為非作歹,他們在FigTaiwan論壇上,公開發言要刪我因反對共匪以簡體字侵犯FigTaiwan網頁首頁而作的反擊言論時,別人看不順眼而支持我,並明白表示反對刪除,只剩大陸匪徒狂吠,記錄全都還在,陳爽竟然還公然表態要向共匪靠攏,接受網頁淪陷匪區,由共匪的簡體字控制。這樣的同學,比叛逃美國的張憲義還要令我覺得可恥,是從台灣本土直接出賣中華民國給台獨與共匪,我不恥與這幾個人為伍,他們把推廣FORTH的組織搞成這個樣子,結果可想而知。

台灣的亂民越來越多,良民越來越少,亂民假藉民主而在社會上胡扯,高唱自由而到處亂來,不除掉他們,社會便永無寧日,國家將邁向滅亡。推廣FORTH,原本單純,有了這些亂民,一切變色。

從無理刪除我的發起FORTH活動公告,經我反應卻不處理,陳爽繼續放任這幾個亂民在社會上為非作歹之日起,我便下定決心,此後不再支持這批亂民任何事情。

今年開年會,為什麼只有那麼少的人參與?因為這個組織出了問題。陳爽為何要發信函通知我?年會議程中根本不安排我打算支持而提報的兩篇論文:『語音輸出百家姓、千字文』與『3D繪圖』,我也不知為何如此?欲成立那個組織之初,我最先提供身份證影本給陳爽,後來為什麼見不到我的支持?因為組織名稱根本不是中華民國之名,我不參加台灣推廣『什麼』的組織。當初我好心幫忙陳爽,打出一份籌款通知,準備邀請Charles H. Moore來台演講,結果騙了社會一筆款子,Charles H. Moore在他自己的網頁上先向全世界公告,最後卻沒來,製造了國際笑話,我竟成了幫凶,誰該善了?這些事情,我看在眼裡,痛在心裡,不是只有我才難過,那麼少人參與年會,反應了甚麼事實?正人君子根本不想陪著你們亂搞。

亂民必須搞清楚!這個世界,並不是只有你才有權力隨便侵犯別人,被侵犯的人,當然有權力把一切事實講清楚。我在網上為文的目的,不在揭發亂民的醜陋罪行,至少此前不肯這樣做。但對亂民的侵犯,則會毫不留情的反擊,這次就是。

不願與張憲義之流為伍者,就更不應與陳爽之流為伍。那怕他陳爽的FORTH技術有多高超,我經常恭維,但我此後絕不再與這個無恥之徒談任何FORTH技術,『萬事德為先,無德技為零』,這是我的堅持。以後,陳爽您可以專教台獨與共匪,希望您會因此而發達。張憲義賣國還得美金,您得甚麼?恐怕是不如刪網部隊裡的五毛,比刪一條網文得五毛的一半之價值都沒有吧?那是連兩毛五都值不上的可恥行為啊!

20128月起,大陸原有一個未經我個人同意便轉貼網文的網站,明白了我個人的堅持,主動撤除了原來轉貼之我的幾篇網文,這樣做是對的。

台灣則仍有不肯撤掉轉貼我網文的網頁,而且反將貼文管制,要加入該網主的組織,成為其會員,才能閱讀,這樣做,看來反不如大陸的認知了。

台灣也有大方言明引用我網文資料的網頁,這是最有道德的作法,我則謝謝他們,並歡迎引用。我為文引用別人之資料時,也盡力清楚強調來源,外國人看不懂中文,但我仍舊盡力寫清楚,網上自動翻譯器,能譯得清楚。

我只是一名微小的創作者,對別人的侵犯,沒有太多的時間與能力老做無聊的反擊工作。但對過份的侵犯,我會毫不留情的說明侵犯者的罪行。打這一段揭醜之文,也要花上不少時間,我應該花。

事實上,我停止更新網文的例行工作後,才是我個人享受自己創作的ABC FORTH系統的開始。以前,只是創作出產品,這一段時日,則從事於讓產品性能更為成熟的工作。我若為推廣計,必須耗費時間來為大家準備資料,那有時間自行使用與享受ABC FORTH?系統的性能便難以提升。這一陣子,我設計大型程式的速度加快了,也美化了系統內的許多地方,但都已不足再與外人道了。

這四年來的網文,文內到處都提出了我曾以程式實現的各種應用題目,隨便點一個,想學FORTH的新手,可能都得學上一年半載才能跟得上,大多數人則都不能輕而易舉的實現相同設計。因為,除了FORTH,我的應用題目,通常都另含技術,想學的人,仔細看清楚就能明白。

而且,請牢記住,我有能力為全世界任何FORTH系統加裝ABC FORTH,我已經做過,不要錯以為我只能為目前推廣標準的Win32Forth系統加裝此項功能而已,是為了推廣,我才暫時這樣做。更進一步強調,我也不是僅只會用Win32Forth系統而已,我可能比大多數人更能適應任何一種FORTH系統。還有,平日裡,我就同時在使用各種不同的FORTH系統,否則,何來論斷各種FORTH系統性能的能力?又怎能輕易講得出某些不良的FORTH系統,無法實現那些標準的基本功能?幾十年來,我早就筆記了許多幾列而已的精簡測試程式,就憑這樣的學習態度,適應FORTH系統的能力,當然比大多數人強。

我已在每篇網文的最上方,都硬貼了中華民國國旗,來訪的讀者,您高興也好,不高興也罷,如果想從這裡學真技術,那就乖乖的看著國旗學,並且牢記住!中華民國是強調道德為上的國家,不得忘本!(後來因網貼新文時,圖片的存在,令我操作不便,因而取消了國旗)

教道德課,可以『有教無類』,教技術課,絕對要『有教有類』,否則,將來毛澤東滿街跑,社會上要再冤枉死掉很多同胞,非任何人所願見。

2013/12/31補述:

我拒絕繼續貼出公益性技術網文將近兩年了,大家以為這兩年我在幹什麼?睡覺?當然不是,是學會了更多的可貴技術。

您的人生能有幾個兩年?全台灣、甚至於全世界,想學FORTH的上進者加總起來,又能有幾個兩年?惡徒在浪費大家可貴的人生!

幾位渴望進入FORTH領域的人來信聯絡,結果,大家最後都說了『欲哭無淚』。我個人本領寥寥無幾,可以忽略,但是,您沒感覺到許多比我更高明的好手也都拒絕網貼了嗎?良民若不想消滅網上的惡徒,那您為什麼不該因他而受害?我也不知道該如何幫您不必『欲哭無淚』,所謂『民族自覺』大概講的就是解決這方面問題的論題吧?您若堅持不想自覺也可以,您請走您的陽關道,我過我的獨木橋,你不斷受害時,我看戲。

您覺得實在需要請教高手時,陳爽就在那裡,他應該是什麼都會,連台獨、共匪他都教。張燕南是連一句話都寫不清楚的人,他的任何網貼都可以見名就刪,不必浪費人生讀那種無聊訊息,而且我知道,他是不讀技術良文的,還讀不到半句就會胡扯,甚至於胡扯我的文意,可能是他根本看不懂吧。

***********************************************


2014/4/23繼續網貼網上挑釁記錄

本人敢指名道姓痛斥無恥之徒張燕南,是他自己來挑釁所造成的!這一篇就是又一樁明證。

我說過,一群亡國奴似的無恥之徒,由陳爽出資,開了一個不要臉的網頁,顧用了張燕南這個宵小,多年來,長期在那裡作亂,為我所不恥。因此,我再也不會去那個垃圾堆裡鬼混,任何人想混,我則無權干涉,還想去胡扯的人,請便。

我貼示的上述罵文,是根本不用爭議的事實,張燕南耍賴慣了,必然狡辯,他的劣根性永遠不可能改變。因此,今天,他又再度無恥的轉貼我的網文,在陳爽花錢開設的無恥網頁上,繼續搞無恥的挑釁回應。

我要警告陳爽:請注意!我的罵文是有版權的!張燕南在你那裡盜貼了我的網文,竟然還敢傳到我的信箱,明擺著要繼續挑釁。

張燕南在國際上早已是惡名昭彰、經常盜版、四處亂貼別人技術的網上惡徒,最近,又在Win32Forth國際論壇網頁,盜貼那份能讓中文正常顯示的修正指令,根本不說明出處,但是,貼了幾天也沒有人回應,台灣人當然都知道這個指令的來龍去脈了,我也不必多說。想看他惡行的人,現在就可以去看,無恥!

張燕南的耍賴式狡辯,就如同他處於三個以上的人之間,就沒人能絕對證明到底是誰幹了惡事。明明就是他放了臭屁,卻因掌了網管大權,就有權硬是耍賴,硬說絕不是他放的屁一樣的無恥至極。今天,他故意盜版轉貼我的這篇罵文,繼續在那個無恥網頁上耍賴,跟在群眾中這樣放屁、這樣耍賴一樣的噁心透頂。

我向來言出必行,絕不可能再去那些亡國奴的那個垃圾堆式網頁打滾。我早就知道那裡貼不出有用的東西,除了少數幾個人還貼實務材料外,大部份均是垃圾。尤其是連一句話都寫不清楚的張燕南,他貼的東西,我看都不用看,包括他盜貼的這一份罵文也是,都是垃圾。不久前,有人虛心想學FORTH,張燕南這個無恥之徒老大的不得了,公開給予新訪客胡說八道的訊息,給予『要他先學FFT』的侮辱。快速傅利葉轉換是數學技術,未必一定要與FORTH程式語言相關。怎麼會有人無恥到只見都有F就胡扯,真亂!把新人都嚇跑了,網管可以這樣亂來嗎?陳爽應該縱容惡徒可以網上隨便亂侮辱人嗎?這些訊息都傳進我的信箱,看了怎不令我作嘔?

痛斥惡徒的同時,順便提醒想看的人,讓您看完罵文後,多少還能受點益處。一個不懂FORTH真義的無恥之徒張燕南,經常在網上胡說八道,亂介紹系統來誤導群眾。最近,他自以為先進,好像別人都不知道網上有人公佈版號更大的Win32Forth系統似的,天下只有他才最先知道,還亂貼號稱他已修改出最新的系統了,要大家跟進。您若有心,現在就請轉到Win32Forth的論壇,可以見到有人發難,明言最新版本有嚴重問題,您看到了吧?請問,張燕南不亂?誰亂?

我明確試過各個版本,知道問題所在,但為何要公佈?我絕不與無恥之徒談任何技術,願意知道我的測試結果者,只能直接與我連絡來知道答案。

同理,大家已經很久見不到我再貼公益網文了,為什麼?有這些無恥的宵小,您若不消滅他,那麼,您為什麼不應因他而受害?


我當然有權貼或不貼任何網文,這裡是一個我個人絕對能夠完全掌握的個人網頁。很奇怪,我並不期望有很多的讀者來訪,甚至於明寫過,絕不歡迎台獨、民進黨、日本走狗來學技術,但天天就是都有不少人來訪,令我欲罷也不能,我貼罵文無益於人,但只有害於惡徒,大家卻仍喜歡看這麼多篇的綜合文章,非我所能阻止。

***************************************************


2014/4/24罵文續貼

這些罵文形同FORTH發展中的醜陋歷史,我可以永留網上,讓網上惡徒遺臭萬年,讀者想不想看?就請自行斟酌,我不勉強。繼續惹我,我就決定這麼辦,我一向是說得到就做得到,不信就試試看,以後不要怪我。

這幾天,那個無恥之徒張燕南繼續挑釁,不停的傳垃圾訊息到我的信箱,陳爽縱容他的垃圾網頁網貼這種無恥訊息。真要形容這種惡劣行徑,惡劣行為簡直就如同台灣人所說的,是在『朗塞口』,是拿著沾了大便的褲子到處甩來甩去、朗來朗去的意思。這是台獨、民進黨慣常的惡行技倆,張燕南就會如此。讀者若看此罵文,能順便學幾句難得見到的台灣罵人術語,也能增長見聞。

FigTaiwan已成糞坑網頁,我怎麼可能再去沾那裡的臭氣?我已兩年不去瀏覽,真要去仔細掏糞,那裡絕對可以挖出無數的盜版網貼行為。別的不說,我從未同意過『FORTH期刊』的文章可以隨便網貼,鄧淵源來信問過我意見,我不便回答,他倒是非常遵守版權規矩,不做壞事沒有亂貼。陳爽與張燕南卻毫不尊重版權,讓別人亂貼『FORTH期刊』在那個糞坑網頁上,那裡成了朗塞口的臭床,如果我講了你才刪,難道我罵得還會錯嗎?

凡是『FORTH期刊』內單文的作者,如果自願公開,依理也得尊重我這個發行人的意見,您只佔有百分比的版權,仍不該亂貼。台灣的亂民長期亂慣了,FigTaiwan也是一樣惡劣,我則保留永久的追訴權。FigTaiwan網站,是陳爽出資建網,網管是張燕南,這一群人還真偽大。

像張燕南這種宵小,如果不透過FORTH管道,簡直是不可能跟我打得上交道的,原因無他,我就是絕對不與台獨、民進黨之流談任何技術。他來攀交,卻只顧不斷地散佈台獨媒體的謠言,竟然還好意思號稱要受害者自己隔離,這是那門子的胡扯亂行理論?跟現今台灣的台獨、民進黨流氓行徑完全一個樣子。

網上侵權是傷害並阻絕公益網文的主因,陳爽幹的就是如同本地DotCom網上惡霸自以為是的濫好人惡行。就算你顧的網管素質低劣,首從犯行的關係恆在,這樣的訊息,你陳爽必須知曉,我若不罵,你大概一輩子都將自詡於自己長期的濫好人惡行吧?壞透了。中正理工學院怎麼會出一個像你這樣的學長?你現在跟那個張憲義、賀立維一個樣子。賀立維一生佔盡所有出身單位栽培的好處,唸到電腦雜技的博士學位,現在卻倒過頭來胡說八道打擊自己的出身單位,是專為民進黨胡扯反核言論的另一惡徒,也跟陳爽鄰居過,言行都令人噁心,我能再尊重這幾個不像樣的學長嗎?


如果FigTaiwan那一幫惡徒覺得這些罵文很好看,我也能當日記般的逐條記述,大家繼續朗塞口。臭掉台灣FORTH環境,不正就是你們想要的結果嗎?幾年不談FORTH,談的都不是FORTH,教書的就只看自己採用的材料有沒有好處,每個打屁者就只想要別人讓自己亂搞的念頭受益,還指望我能免費印書送你?否則就稱我是『商業行為』,噁不噁心啊?有種,我公開過的程式都不要提,只會搞算命,也別提我的天干地支程式,否則,張燕南你豈不是盜過我的軟體?我該強調,我的用書購買名單內沒有你,知道嗎?你還希望別人能數落你多少的惡行?朗塞口自己都聞不到臭味啊?無恥!

********************************************************************

控存資料1

2011年10月27日,周四, ching <ilikefo...@gmail.com> 寫道:
發件人: ching <ilikefo...@gmail.com>
主题: [符式協會:2740] 發起FORTH活動!
收件人: "符式協會" <figtaiwan@googlegroups.com>
日期: 2011年10月27日,周四,下午3:08

Win32Forth雖為現行推廣標準系統,看來能順利使用的人還很有限,因此,想藉此活動讓大家培養一些使用能力。

不限制任何人參與活動,包括爽兄及任何一位前輩,時間暫定為自本意見發佈後,一期三個月。

使用的基礎系統:固定為推廣標準之Win32Forth V6.14版系統,電腦及作業系統的版本則不予限制,可以是XP也可以是W7,但為配合此次本人自定的主題,電腦必須具有語音輸出的基本功能。

本人此次返台,廣受許多會友的協助,深覺應該回饋一些我自己能辦到的貢獻給大家。戚桐欣老前輩,戚老饋贈了願意公開的中文語音輸出檔案,內容非常龐大,我不想辜負他的期望,故想令此貢獻進一步在我們的FORTH領域發揮作用。

我也見到小葉與錢大哥及爽兄努力於古文的發展,見到他們的成果。我覺得能夠透過舉辦一次小小的活動,讓這些可貴的中國文化,簡單的藉FORTH結合在一起,順便的教會大家一點點利用Win32Forth的皮毛技術。

目標很簡單:就是要電腦以受控方式,唸出『百家姓』與『千字文』。其他可能附加的功能,開始活動之後,再視情況增修改。

暫時就先公佈這樣的訊息,然後等待大家以真實姓名回應本人,總數達到十人,我就開辦。參與者可以私下接到我的領頭示範程式與說明文章,但參與者必須跟著實際使用程式,大家一同合作把成果建立起來,也增進自己對Win32Forth系統性能的一些認識。至於最後的成品是否公諸於世?以後由參與者表決決定。

活動的內容會有參與者彼此交換成果的要求,因此,也應該限制成參與者才可以互相享受的權力,活動期間,我會盡量協調其間的事務。大家都不是閒著沒事可幹的人,三個月應該足夠寬鬆了。

曾慶潭於紐西蘭

控存資料2

FORTH操作音效卡

曾慶潭2008-12-3於紐西蘭
Ching-Tang Tseng
ilikeforth@gmail.com
http://forthfortnight.blogspot.com

0. 前言之前

經過四個月的努力,我在6月29日與中華民國FORTH語言學會聯絡時提及的構想──想要設計一個地震早期警報系統,其軟體程式已接近完成。為了實現這個構想,伴隨著主導計劃,有不少可貴的Forth程式逐個被落定。程式設計實耗時間實際上不多,研究資料與整理成果以便寫成文章,所須時間則相當可觀。
當初挑選的Forth系統主要是以eForth32為主,很慶幸做了正確的選擇,它對解決此類問題較為適當,本文是其一例。
剛開始進入這個主題時,就想先利用電腦設計出一個慢速可調示波器的功能,首先遇到的問題是系統不會劃任意兩點間的一條直線,我挑選了一個近期內的美國專利,純用高階定義方式與單純整數系統,令其實現。
接著預估會有信號處理的工作想做,而Forth的數值分析處理能力不太好,於是耗費了三個月的時間,在四個Forth系統上完成了Tiny BASIC Compiler的程式設計,讓Forth能像BASIC一樣的執行程式,而且發現這樣做呈現了特異性能,並完成了一篇90頁的中文文章。
eForth32欠缺了不少傳統指令,例如:DO…LOOP指令群便付諸闕如,我堅信自eForth始,任何其他指令都能以高階定義方式完成,這是Forth基本精神,這個問題剛好做為對自己程式設計的考驗,於是博覽群書,終於全用高階定義技術,設計出了我要的東西。
有感於Forth不應自閉性的過日子,此類設計日後很可能需要與別的程式語言進行資料溝通,以形成共榮的系統。若能如此,則別的程式語言可能更會誇獎Forth的存在,於是,我在圖書館裡鑽研了一陣子,參考別的程式語言教學用書是如何介紹資料檔案的存取的?結果也完成了一份資料檔案標準存取格式的通用程式設計,可以毫無問題的與C或BASIC甚至於其他任何程式語言交換資料。近代的Forth系統中有READ-FILE、WRITE-FILE…等指令,但它們都還只是系統中的指令,要完完整整的做完資料檔案的存取工作,必須像我這樣的設計標準通用方法才行,而且要有根據,是參考專家寫的書籍得來的。
我已不再在職場上打轉,當然不可能像當年在台灣時闊綽的大買軟硬體來大肆發展自己的構想,軟體已進行到不得不碰硬體的時候,只好暫時打住,等待支援了。奉駿泉先生答應提供一套A/D轉換器助我發展,但要等到過舊曆年時才能帶來紐西蘭供我使用,我則未曾稍懈於此事,研究地震早期警報相關書籍及期刊論文,以及電容式水下麥克風與前置放大器、低通濾波器、甚至於音響信號接頭的標準接法,彙集資料,成果相當可觀。
紐西蘭是一個非常強調資源回收的國家,有許多的『機會商店』販賣仍可使用的回收物品,他們有私人開設的店面,也有救世軍、紅十字會、聖文森…等慈善單位所經營的商店,偶爾會有『機會』商品出售,售價大約是新品價格的十分之一以下,我須要材料維修物品時常去光顧。有一天我對舊的音效卡產生了一絲興趣,我非常痛恨微軟公司封閉資訊的作風,把世界上許多還很可以用的東西搞成是嚴重污染環境的來源,音效卡也是其中之一,我想我可以在這件事情上盡一點力,於是廉價收集了一些音效卡,著手設計程式,最後也完成了這個項目,值得為文一書,公開推介,在未有A/D卡之前,音效卡可以當作模擬硬體。
前述各個專題彙整後,總內容實在不小,將近是一本書的規模,而且我仍在整理積聚中,自覺值得留供自己永遠參考,至於是否要出版成書,以後再說。我已經不為獲利而寫文章了,更不可能印書當贈品,這個計劃若想真正全面實現,除了由政府支助外,不可能有人有興趣出錢幫忙完成,是個有利人類卻無利於個體的研究項目,根據我自己的經驗,書籍出版之後,如果沒有300本以上的基本銷售量,不可能收回印書的成本,因此,若無法達到可售出300本書的規模,我就不考慮發表而讓它自然廢棄,只留一套簡易硬體在我家後院長期試其性能,成為老來生活上的高級玩具,足矣。
當前Forth的推廣發展遭遇不少困難,其中一個主要因素,就是可供參考學習的材料相當缺乏。事實上Forth的推廣並不缺書,丁陳漢蓀老師,鄒靖寧老師,金城老師,奉駿泉先生…等Forth先進,都曾在台灣出版過相關中文教材書籍,幾個書局也曾印行幾本好的Forth英文原文書籍,如果有心向學,這些資源相當足夠了,我個人便永遠保留這些書本,這次能完成這些Forth程式,必須參考這些書籍。
我雖十幾年不寫FORTH程式了,但對台灣FORTH同好例行性活動的關心則不曾稍減,這是一個我曾努力貢獻過心力的特殊環境,我也相信它會恆久存在,因此在情況許可時,我仍願再寫些文章來引起共鳴。根據我個人的經驗,使用一般FORTH參考書籍進行推廣時,會有較缺乏應用實例的遺憾。這種情況對學習者而言,就好像學生考試時老是面對著『解釋名詞』,卻顧不了『應用問題』,而通常都是『應用問題』所佔的分數比較高,不是嗎?可是許多應用實例常具有時效性,通常只宜利用期刊發表,期刊的維持發行卻更為不易,連最有參考價值的『FORTH DIMENSIONS』都停刊了,可見一般。現在網路暫時霸佔了傳播媒體的最重份量,我不排斥它,有感於它可以頂替部份期刊的角色,現在又可以造福到全體中國人,我也只好很不情願的隨波逐流,自架了一個簡易純文字的個人Blog網頁:

http://forthfortnight.blogspot.com/

暫定有空時每兩個星期更新一次『慶的世界』網站上的文章,有興趣就來訪參觀吧,可是我得事先聲明,可能沒空回答問題,它暫時只是一個單向式的個人網站,我也沒空將其搞得花俏美觀,那不是目的所在。

1. 前言

一般而言,聲音信號在我們有興趣的各種物理量度訊號中算是快速類的了,舉凡工程上常強調的壓力、流量、溫度、速度、重量…等信號,其變化頻率都不太高,大約每秒量度一次也就夠了,普通聲音頻率要求,大約要高到每秒兩萬次,為防止取訊失真,取訊的頻率就應高過最高頻率的兩倍以上,因此,音效卡的設計,以能夠用44.2 kHz的速率取得訊號為基本要求,所以屬快速訊號。當我們想將物理變化的訊號傳入電腦時,單只考慮取訊速度條件,若能處理聲訊,其他訊號也將不成問題,音效卡如能應用在這一方面,可具有不錯的潛在功能。
在訊號的解析度方面,我所用的音效卡雖只有8位元,A/D轉換器最高1/256的分辨能力,工程應用上也很足夠了,具有百分之一以內精確度的儀錶是非常好的錶,所以在不苛求的情況下,音效卡應該很容易滿足一般要求。
如果能用音效卡做點事情,它潛在的最大好處是因被批量生產而價格低廉。而最大的潛在問題,則是為了防止仿冒而封閉了一切相關資訊,甚至於被製成晶片組,讓使用者想利用它來做點份外事,或想進一步了解其軟硬體特性時,均不得其門而入。
由此看來,音效卡在上市的第一天,我們就應該可以用Forth寫程式搞出一大堆像樣的產品來了,有許多因素使我們以前就未能及時做到此事,殊為可惜,但今天才做,其實也不嫌晚,它確實還能做些事情。也許生產銷售音效卡的廠商,應該看一看我們如何令其另有用途,而及早公開它的相關資訊,銷路也許更廣,獲利更多。
按我初始計劃的目標,只想取得20Hz以下低頻聲訊,信號抓取速率最高每秒40次也就可以大約不失真了,至於信號強度的配合,則純粹是硬體設計的問題,軟體只在配合,因此我對使用Forth操控音效卡深具信心,軟體方面只要選對系統,就可以完成。本文重點不擬強調聲訊知識,大約的討論就到此為止。

2. 軟硬體安排

熟悉Forth的人一定知道我為什麼一開始就不用Win32Froth?根本原因就是它在Intel、IBM與Microsoft三家公司聯合搞出的現行暢銷個人電腦,已經不准你執行硬體輸出或輸入指令了,在CPU硬體方面有所謂的保護模式( Protection mode ),在後來的作業系統內有所謂的特權等級( Privilege level ),封死了程式語言執行輸出 / 輸入指令的功能,你硬要做,系統就恆給你一個『異常』( Exception )警告訊息,耗在那裡。詳細的細節不是本文論述的重點,以後有機會再另文探討,但我相信在接近這套電腦系統快要變成廢物以前,就會公布解決辦法,那些只想賺不道德錢的公司,一向都是如此待客的。寄生在這些作業系統下的Forth系統很無奈的被使用著,失去了P@與 P!類指令的Forth,套句台灣人的話形容它,就好像是『去給人家斷了腳筋』似的苟延殘喘,大半輩子有好多事情都不能作了,不是嗎?
要能執行硬體輸出 / 輸入的Forth系統依然不少,只要還能寄生在Windows’98以下的環境執行的Forth都可以列入此計劃的選擇考慮,甚至於包括曾經做為台灣推廣標準的F83及F-PC Forth兩個系統也都可以,我又為何硬要選eForth32呢?一方面是選擇前試用了它的一些性能,夠我所須,沒有版權問題,另一方面是我對eForth後續發展的一點好奇感,就如同前述提及的『解釋名詞』與『應用問題』區別,我個人很想找題目試其真正的性能,是否真的可以一貫到底?現在我相信它了,以eForth的方式這樣子搞Forth,一定可以搞出名堂,無庸置疑。
Rick VanNorman把系統改得很快了,也提供了Forth Assembler,及與作業系統之間的現成指令,還有不少範例程式,我在接觸它的第一天就先執行一次標準的meta-compiler程式,又快又好,是真正的用Forth造Forth,它進行的過程相當完整,有些人誤把meta-compiler當一般compiler使用,那會使得一個能讓毛毛虫『蛻變』成美麗花蝴蝶的meta-compiler退化成『劣變』工具了。他也不甘寂寞的轉置此系統到Os2保護模式下執行,在XP作業環境中也工作得很好,是一個純用eForth方式發展出來的成功範例,很值得用它。
讀者很難想像,我竟然是用DOS3.3的陽春系統完成所有設計的,我的電腦安裝了硬碟抽取盒,可以在新電腦上快速更換舊系統所須的硬碟,電腦硬體本身背負了歷史的包袱,能執行XP作業系統的電腦依然可以執行DOS,功能沒有減少,要試這個程式,只須另備一個簡易麥克風,及舊的音效卡。
在硬體方面的安排,此計劃原則上應以標準的A/D卡來發展才是正途,因為資料才有可能透通齊全,像標準Forth一樣,使用者可以完全沒有疑問的工作,採用音效卡是一時權宜之計,不適用於所有狀況,除非生產廠願意供給資料,我們才有可能順便為其創造新利潤。
舊的音效卡快要變成廢物了,資料也缺乏保密價值,有一些善心人士就公開了它的用法,我從網路上搜索了三天幾百個網頁後,取得唯一可茲參考的資料,獲得一篇很好的關鍵程式── “ Real time Signal Processing Code ”,將其改寫成Forth程式後,試用成功,試出了原程式的功能,也試出了我想要的一份音效卡,為尊重原創人的貢獻,理應說明出處:

作者:Ethan Brodsky
連絡信箱:ericbrodsky@psl.wisc.edu


3. 依據程式

/* sbsample C */
void writedsp( unsigned char value ) ;
unsigned char readdsp( void ) ;
int resetdsp( void ) ;
void turnspeakeron( void ) ;
void turnspeakeroff( void ) ;
unsigned char getsample( void ) ;
void outsample( unsigned char sample ) ;

#defined TRUE 1
#defined FALSE 0

/* -------------------- */
#include < conio.h>
#defined RESETPORT 0x226
#defined READPORT 0x22A
#defined WRITEPORT 0x22C
#defined POLLPORT 0x22E

void writedsp( unsigned char value )
{
while( inp(WRITEPORT) & 0x80 ) ;
outp( WRITEPORT, value ) ;
}

unsigned char readdsp( void ) ;
{
while( ! ( inp( POLLPORT ) & 0x80 ) ) ;
return( inp( READPORT ) ) ;
}

int resetdsp( void )
{
int i ;
outp( RESETPORT, 1 ) ;
outp( RESETPORT, 0 ) ;
i = 100 ;
while( ! &&( readdsp( ) = 0xAA ) ) i++ ;
return( i ) ;
}

void turnspeakeron ( )
{
writedsp( 0xD1 ) ;
}

void turnspeakeroff ( )
{
writedsp( 0xD3 ) ;
}

unsigned char getsample( void )
{
writedsp( 0x20 ) ;
return( readdsp( ) ) ;
}

void outputsample( unsigned char sample )
{
writedsp( 0x10) ;
writedsp( sample ) ;
}

4. Forth 對應程式

根據這個程式,幾乎已經獲得了幾個最重要的訊息,其中有重要的輸出入位址,以及幾個相關的控制碼,足供我們設計Forth程式時使用,改寫完成的Forth程式如下:

\ Sound Blaster card testing Forth words
\ eForth32 version
\ Author: Ching-Tang Tseng at Hamilton, New Zealand 2008-12-04
VARIABLE #DELAY 1 #DELAY !
: MS ( n - - ) FOR 300 FOR NEXT NEXT ;
HEX
0220 CONSTANT PORTBASE
PORTBASE 6 + CONSTANT RESETPORT
PORTBASE A + CONSTANT READPORT
PORTBASE C + CONSTANT WRITEPORT
PORTBASE E + CONSTANE POLLPORT
: RESETDSP ( - - )
1 RESETPORT PC!
0 RESETPORT PC!
100 FOR NEXT ;
: SB? ( - - )
RESETDSP
POLLPORT PC@ 80 AND
IF READPORT PC@ AA =
IF .” There it is! ” CR .” Sound Blaster Board detected.”
ELSE .” Nothing! System without Sound Blaster Board. ”
THEN
ELSE .” There is no response! ”
THEN ;
: WRITEDSP ( b - - )
WRITEPORT PC@ 80 AND 0=
IF WRITEPORT PC!
ELSE ABORT” Unable to write! ”
THEN ;
: READDSP ( - - b )
POLLPORT PC@ 80 AND
IF READPORT PC@
ELSE ABORT” Unable to read! ”
THEN ;
: GETSAMP ( - - b )
20 WRITEDSP
READDSP ;
: OUTSAMP ( b - - )
10 WRITEDSP
WRITEDSP ;
: .SB ( - - )
RESETDSP
PAGE
BEGIN
40 1 AT GETSAMP 10 U.R
#DELAY @ MS KEY?
UNTIL ;
: TURNSPON ( - - )
D1 WRITEDSP ;
: TURNSPOFF ( - - )
D3 WRITEDSP ;
DECIMAL

5. 測試結果與分析

上列Forth程式大部份是翻譯的結果,沒有甚麼好解釋的。唯一可以推介的一個指令則是『.SB』,從我在個人電腦上使用Forth以來,如此的設計方式屢試不爽地被加以應用,它可以在螢幕右上角固定位置,動態的顯示一個記憶體之內容,速度可調,非常適合用來觀察硬體的內容狀況有無變化?例如:另一個位址046C,它是電腦計時用的最根本位址,計數內容不斷地快速變化往上增加,無論新舊,那一台電腦都一樣,不信你自己舉一反三的試試看。
這樣的執行Forth程式,才能顯現所謂的Real time control效果,它是Forth應該具有的最基本精神,失去了這個功能,憑良心講,就不能成其為Forth了。現在,請問讀者,能不能體會出我為什麼不用Win32Forth來發展這個計劃的道理了?
實際應用這個程式時,有一些結果可以提供讀者參考。有一些音效卡執行RESETDSP及SB?指令時都無問題,可以通過測試,並被顯示系統中有音效卡存在,但隨後卻不能讀寫資料,無論我調整讀寫資料的速度如何?就是沒有結果,換句話說不具音效卡的功能,因我用的全是舊卡,只能透過三用電錶,測出麥克風輸入處,仍恆保有5伏的高電位狀況,但就是不工作,是卡壞了?或另有控制碼須執行?我也不得而知,這也是資料不透通所帶來的痛苦。幸好我仍試得了一片板子可供利用,因為它好,所以也不必在乎是否免費為這家廠商做廣告了,如此便可以鼓勵將來廠商盡量與我們合作,因此,故意要留下記錄如下:

『勁駒微電子股份有限公司銷售的ESS ES1868勁聲卡』

程式中端口基準位址PORTBASE暫設為0220,隨著音效卡的硬體選址設定,此值亦可配合調變,根據一般音效卡隨卡附屬的說明手冊顯示,位址的範圍大約為:十六進制的220、230、240、250。卡上一般還有電玩搖桿( Joy stick )、中斷( IRQ )、記憶體直接存取( DMA )、喇叭輸出、光碟機介面…等設定可供操作,本文不打算涉及太多,因為資料不夠完整,有興趣的讀者,請向原創人索取。
上列程式基本上可供測試系統中有無音效卡了,如果功能仍正常,進行用卡前歸原設定、取訊與播放亦可執行,其他的應用程式便能據此來設計,這些功能也暫時能滿足我個人所須,隨後發展的一些應用程式中,包含了一個模擬示波器的設計,它工作得很好,因程式事涉專利,不宜發佈於此,但若你有現成的可畫線指令,下列程式便可依樣設計出來:

\ Digital Oscilloscope Simulator
\ LOAD (1) STD.4 (2) SB.4 (3) FLD.4 then this program
\ Author: Ching-Tang Tseng at Hamilton, New Zealand 2008-12-04
: INITX0
RESETDSP PAGE
GMODE
0 X1 ! 300 Y1 ! AFTCAL COLOUR @ 0 0 EGA! ;
: ONEPAGE
640 0
DO I 300 GETSAMP - DRAW
#DELAY @ MS
LOOP ;
: SCOPE
INITX0
BEGIN
EGA ONEPAGE KEY?
UNTIL ;


6. 展望與結論

為了要實現我的目標,還有不少事情要做,回顧已經完成的工作,每當我階段性的完成一些程式後,似乎都感覺到這些程式都還有不少其他功能可以發揮,這就是設計應用程式比純討論系統或指令性能來得好的原因,因為它比較務實。
事實上,應用程式看起來都不太艱深,當作學習教材最為適當,它將Forth連接到我們生活的環境中去,應用程式發揮功能時,設計人更容易產生成就感、快感與滿足感,要讓Forth能延續發展,多創作各個領域的應用程式是很重要的,否則在系統創作者辛勤設計發佈產品後,無論產品有多好,在無人接續的情況,很快的都將壽終正寢,因為電腦科技進展的速度是很快的。
應用程式本質上也有弱點,大部份都屬於有時效性的問題,時過境遷或事過境遷後就不太有參考價值。另外,既然是應用程式,就應該是很值得直接應用了,通常也因此而事涉創作人的版權問題,這也是讀者不容易見到此類作品的主要原因,我個人則非常尊敬肯公開應用程式的作者,能發表這篇文章首先應該感謝的人就是Ethan Brodsky,想引用的人不必謝我,請直接去信鼓勵原創人便可。
設計應用程式時免不了可能得碰硬體,設計人就得有些機電方面的概念,通常此類人才不多,這大概也是可公開應用程式寥寥無幾的一個主要原因。本人是略有所知,可以常觸此事,例如:我用一個旋軸式可變電阻及定電壓直流電源,配上運算放大器設計了簡單電路,接通到音效卡的輸入端,如此便模擬了所有物理感測器的信號源,廢棄的音效卡就相當於可以用來設計信號擷取系統,由於沒有像麥克風輸入時的背景噪音,讀得的信號還更為穩定。
想搞語音分析者,上面的資料也很能協助提供分析所須的音源樣品來源了,取得信號後存成任何一種資料檔案的格式,對我們而言是毫無問題的,如果使用了其他裝置系統,遭遇到資料檔與後續應用或分析系統無法連上的情況時,本文提供的透通資料就深具價值。
Forth是擅長執行即時性自動控制的程式語言,應用在這方面更為恰當,舉例而言:如果有海測船想用聲納測度海底狀況,用Forth設計邊開船邊測量,立即就取得結果的系統,比用其他任何方法要容易也更快速,當然也價廉,本文已經提供了這個答案。另提一個不吉利的建議,要發展找沉船的系統也一定比別人快,問題只在主事者願不願意接受Forth?
文末,我想請我女兒協助,拍一張數位照,顯示本文提及的示波器功能,我在照片中,也向所有讀者問好,螢幕上被停格畫面錄得的聲音花樣是:『大家好』。
(照片存於另一單獨檔案)

控存資料3

有朋自遠方來

曾慶潭2009-03-20於紐西蘭
Ching-Tang Tseng
ilikeforth@gmail.com
http://forthfortnight.blogsopt.com

有朋自臺灣來,帶來了雙倍的承諾,以及更多的硬體支援,最樂之事卻是有機會再度與同道暢談Forth。人逢知己精神爽,彼此由衷的心得交換,不僅鼓舞了繼續努力實現夢想的胸懷,而且強烈的感受到,瞬間大增了在此領域的技術功力,並且獲得對現行發展Forth時,可供配套之軟、硬體應有的最新認識。真所謂,德不孤,必有鄰,原本在海外隻身奮鬥於Forth的處境,產生了幾近道不行,乘桴浮於海的念頭,有此一朋友的來到,完全改觀了!焉有不受激勵之理?
『Forth操作音效卡』一文刊出之後,得到了不少迴響,文中曾經提及老友奉駿泉先生承諾提供A/D轉換器一事,熟料奉兄有感於單片A/D卡供作『地震早期監測系統』發展所須稍嫌單薄,特別新購了兩套A/D裝置帶來紐西蘭,實現了雙倍的承諾。另外,又覺不必勉強硬要使用舊系統,亦可同時在現行電腦硬體與作業系統下進行此事,特別相贈了一個他自己公司發展出來的產品,是使用USB接頭為界面,一個小巧玲瓏的裝置,內附Silab’s 8051F320晶片,是一套也具有A/D功能的好東西,價格千元台幣左右。有此利器,實現夢想就不太遠了,更何況奉兄還指導了關鍵的應用方式,直接解決界面問題,接妥的系統,不單純是只能做目前計劃中的工作,幾乎擁有可供實驗室中直接執行抓取訊號的應用了。
我們在推廣Forth的同時,若有廠商協助及贈與,對於彼此的發展必然是相得益彰,奉兄是知己,遠勝於廠商,出錢出力支持Forth的發展已不知有幾次了,這一次除了感激外,更應以禮相待,君子以文會友,以友輔仁,特以行將付梓、不便外傳的兩篇文章:『美麗的詩篇』、『實現劃線Forth程式』,印妥成實體後相贈,知己才更珍惜這種技術產品,當天奉兄便開始展卷閱讀,他告訴我Charles Moore的習慣,就是公開了艱深、精彩設計後,從來就不寫相關文章的。
『實現劃線Forth程式』涉及別人專利,且此二文均因圖文並用,而不利於個人網頁的素文字刊出,網頁的初衷就不想浪費時間去搞花俏,有相當份量的文章也只宜以書出版,故均不外傳。
『美麗的詩篇』雖然僅只是述而不作,信而好古的產出,但以特殊方式詳述、剖析Forth程式語言發明人Charles Moore當初所設計的Tiny BASIC compiler,完整解說一個漂亮系統的設計技術。完成該文以後,便開始闡揚其特出方法,身體力行,以其中精華做為依據,將Forth改善成可以用中算符方式設計程式的系統。截至目前為止,已有許多具體的成果,新近的作品是一篇『Forth計算程式的新外貌』,昨天的突破則是將浮點亂數函數適當的加入了系統,短程的目標是在Win32Forth系統上完成具有浮點數字功能的中算符系統而後暫止,先供推廣之用,待其落定之後,長程目標則改在可以用Forth全面發展數值分析程式,供作學術教學或實際應用之須,到時就會有無限的發展空間。立定了志向,假以時日,必然能有所成。
如此發展出來的系統,具有如同BASIC程式語言一般的程式寫作方式,易寫、易用、易讀、易懂,幾近可以直接引用前人精彩的程式設計,配合Forth原有的完整功能,能作許多事情了,尤其是數值分析應用方面,更加方便可行。下列就節錄『Forth計算程式的新外貌』文章中的一段應用實例,可以看出此一系統的端倪。

--------------------------------------------
2. 應用實例

數值分析程式實際上並不複雜,它期望系統能提供的性能,主要是在計算式子的表示方式上,要接近數學表示式的方式為最好。至於資料的輸出、輸入、程式執行迴路、或者是邏輯判斷後的條件分支能力…等問題,則都不是強調重點,能行就行。因此,我們要舉的實例,暫不考慮數學方面的複雜理論,避免類似需要疊代(iteration)計算的問題,也不需要舉許多分支情況的例子搞混了主題。
曲線調適(Curve fitting)問題,在數值分析技術中算得上是一個很有用的主題,如果Forth計算程式能將此一問題處理得很好,使程式的外貌易讀易懂,就可謂性能大大的改善了。
所謂曲線調適,是應用在將實驗數據妥善的匹配至理論數學式子的一種數值分析技術。有許多場合,一個自然現象可以用一個標準簡單的數學式子來表示,形同y=f(x)的數學函數,也就是y隨x變化的狀況由y=f(x)來決定。從事研究工作的人經常會對一個已經確定了y=f(x)關係的研究問題進行實驗,取得這種y與x間關係的許多組實驗值,接下來要做的工作就是曲線調適了。由於y=f(x)數學函數表示式通常僅表示一個現象的趨勢關係,函數式中每一項的前引係數均未定,必須靠實際的實驗來決定這些係數之值,曲線調適技術便發展出許多方法來處理實驗數據,以求得函數式子的所有係數。最後獲得的完整數學式子不只是將問題確定而已,這樣的數學式子,通常也代表了此後可以合理的運用,因為實驗時只做了有限個點的關係實驗,應用時則代表了可以用在指定範圍內的無窮多個點之情況,所以曲線調適也就成為實驗結束後非作不可的工作了。
要想仔細研究曲線調適的各種方法,很可以寫出一部洋洋大觀的專門書籍來,本文的目的不在這裡,相反的,此處完全不予探討,還得請讀者自行去參考相關書籍,任何數值分析的書籍都有這個主題,我們僅借用其中一個最簡單的研究結果作為代表,當作程式設計時的範例。
以最小平方差原理(Least-Squares Approximation)來達到曲線調適的目的,是此處想引用的例子,為了說明方便,我們也僅舉一個一階多項式的函數關係為例,以標準數學式表示如下:

y = a + b x

其中,a 與b均為未定係數,有待以最小平方差曲線調適後決定。原則上兩個未知數,只要兩組關係值就足供確定了。然而,實際的環境並非如此,為了減少各方面可能產生的誤差,我們必須進行更多的實驗,取得更多組的數據,然後以最小平方差原理,根據統計分析的技術結論,將誤差減至最小,如此決定的係數才有學術根據,才能研究與討論。
假設已經完成了N次的實驗,得到了N組y與x之間的關係數值,那麼,最小平方差分析後的結論,兩個係數a與b及標準誤差D可以寫成下列恆等式:


a = ( Σ x․Σ x y – Σ x² ․Σ y ) / ( ( Σ x )² – N ․Σ x² )


b = ( Σ x ․Σ y – N ․Σ x y ) / ( ( Σ x )² – N ․Σ x² )


D = SQRT ( ( Σ ( y(i) - a - b x(i) ) ^ 2 ) / ( N - 2 ) )


這三個式子是本文借來規劃程式設計的重要依據,因為從式子中可以看出要大量的使用運算符號,符號Σ是代表總合(Summation)的意思,因此如果作了十次實驗,得到十組y與x的相關數據,單只考慮求得a與b時,我們就得分別先求出十個x、y、x乘y、與x的平方總合後的結果,然後才能代入上列式子,進行乘法、減法、與除法計算,最後才能得到a與b的答案。這麼多的計算,如果要用傳統Forth來寫後算符式的程式,大多數人寧可放棄不做了,就算勉強做了還很容易出錯或搞得一團混亂,這就是Forth不適合用來發展數值分析程式設計的原因。
以『美麗的詩篇』文中解決中算符問題的方法為藍本,可以制定一些Forth設計計算程式時的新規矩,解決它不適合發展數值分析程式的問題。為了避免後續還得重新列印程式來配合說明,此處直接一次便將整個完整的曲線調適程式列印如程式二,先假設它可以執行,我們便根據這個程式來制定一些新規矩,再以這些新規矩當作程式設計規格,實現整個構想。請先從上到下瀏覽一遍這個程式,你很容易發現程式在數值分析方面的可讀性,幾乎與BASIC程式語言相等,它是Forth計算程式的新外貌!

\ First-order least squares curve fitting demonstration program
\ by Ching-Tang Tseng 2009-2-24
\ ilikeforth@gmail.com http://forthfortnight.blogspot.com

LOAD CHING.4 \ 即程式三

20 FIXARRAY XX 20 FIXARRAY YY
FIXVAR A FIXVAR B FIXVAR D FIXVAR D1
FIXVAR A1 FIXVAR A2 FIXVAR B0 FIXVAR B1

: RESET-ALL
21 0
DO
{{ XX ( I ) = 0 }} {{ YY ( I ) = 0 }}
LOOP
{{ A = 0 }} {{ B = 0 }} {{ D = 0 }} {{ D1 = 0 }}
{{ A1 = 0 }} {{ A2 = 0 }} {{ B0 = 0 }} {{ B1 = 0 }}
;
: INPUT-DATA
{{ XX ( 1 ) = 0 }} {{ YY ( 1 ) = 0 }}
{{ XX ( 2 ) = 0.157 }} {{ YY ( 2 ) = 0.156 }}
{{ XX ( 3 ) = 0.314 }} {{ YY ( 3 ) = 0.308 }}
{{ XX ( 4 ) = 0.471 }} {{ YY ( 4 ) = 0.454 }}
{{ XX ( 5 ) = 0.628 }} {{ YY ( 5 ) = 0.587 }}
{{ XX ( 6 ) = 0.785 }} {{ YY ( 6 ) = 0.706 }}
{{ XX ( 7 ) = 0.942 }} {{ YY ( 7 ) = 0.808 }}
{{ XX ( 8 ) = 1.099 }} {{ YY ( 8 ) = 0.891 }}
{{ XX ( 9 ) = 1.256 }} {{ YY ( 9 ) = 0.950 }}
{{ XX ( 10 ) = 1.413 }} {{ YY ( 10 ) = 0.987 }}
{{ XX ( 11 ) = 1.550 }} {{ YY ( 11 ) = 0.999 }}
;
: RUN-COEFFICIENT
12 1
DO
{{ A1 = A1 + XX ( I ) }}
{{ A2 = A2 + ( XX ( I ) * XX ( I ) ) }}
{{ B0 = B0 + YY ( I ) }}
{{ B1 = B1 + ( YY ( I ) * XX ( I ) ) }}
LOOP
{{ D = ( A1 * A1 ) - ( 11 * A2 ) }}
{{ A = ( A1 * B1 ) - ( A2 * B0 ) }}
{{ A = A / D }}
{{ B = ( A1 * B0 ) - ( 11 * B1 ) }}
{{ B = B / D }}
;
: RUN-STANDARD-DEVIATION
{{ D = 0 }}
12 1
DO
{{ D1 = YY ( I ) - A - ( B * XX ( I ) ) }}
{{ D = D + ( D1 * D1 ) }}
LOOP
{{ D = SQRT ( D / ( 11 - 2 ) ) }}
;
: OUTPUT-DATA
CR ." Fitted equation is :"
CR ." y = " A FN. SPACE
B DUP 0<
IF FN. ." x"
ELSE ." + " FN. ." x"
THEN
CR ." Standard deviation of fit is : " D FN.
CR ." Finished. " CR
;
: CV \ Least squares Curve Fitting routing
RESET-ALL
INPUT-DATA
RUN-COEFFICIENT
RUN-STANDARD-DEVIATION
OUTPUT-DATA
;
程式二、一階最小平方差曲線調適Forth範例程式(CVFIT.4)


執行縮寫指令CV可以快速的得到曲線調適後的答案,列印如下:

Fitted equation is :
y = 0.104 + 0.661 x
Standard deviation of fit is : 0.070
Finished.

2011年11月1日 星期二

忙著搞生產

曾慶潭2011-11-02於紐西蘭
Ching-Tang Tseng
ilikeforth@gmail.com
http://forthfortnight.blogspot.com

陪著九十幾歲的老前輩聊天,是很難得的事情。
我姑且就尊稱他是張老吧,張老只說他的一生平淡無奇,退休養老到現在,生活毫無困難,年輕時還幫過別人,別人成功發達了,回過頭來照顧他的晚年。現在,他也是移民,也都還能長途搭飛機,台灣、紐西蘭兩頭跑,兒女的生活都還算不錯,沒有人會來煩他。
張老從土地銀行退休很多年了,一直都有退休金可領,衣食無缺,四處走走,旅費需要開銷,都還花不完自己的錢。他自知沒人愛聽老人言,所以早就養成了別人不問他就絕不多說的習慣,最近幾年行動確實是較慢了點,過馬路時,常見到路人不耐煩他的行動遲緩,因此,只走不過馬路的路。
我對張老年輕時的事業有興趣,銀行業我卻外行,連個能啟口的金融術語都講不出來,乾脆就直接請教他,在銀行上班時,都做那一方面的事情?他的回答非常乾脆,沒本領就沒專門的事,都只當個小科員,一直到退休,長官要他這樣子養老,他也沒違背長官的好意。我更好奇了,能夠這樣子過一生,其中必有玄機,於是追問到底,就想知道其中的懸奇。
我們雙方保持高度的耐心談了很久,都避免強調將特別題材當作談話的內容,後來,我聽出了其中的關鍵。
民國38年,國內到處兵荒馬亂,張老剛進土地銀行不久,卻隨著國民政府敗退來台,對自己的前途一片茫然。有一天,有人找他,希望他能再回大陸一趟,去帶幾位當時土地銀行的重要人物來台,他就去了,所以做過一點比較危險的事情。我知道這就是關鍵,於是追問他,那麼危險還回得去啊?從那裡回去?
他平淡無奇的說,就從香港進去,邊境已經被共匪控制了,排了很長的隊,等著給入境申請單蓋個通行許可章,他見到前頭許多人又哭又求的,請邊防領導給蓋個章子,不管你說家中有甚麼高堂老母需要照顧,或是一大堆妻小嗷嗷待哺,回答都是簡單的三個字:『拉出去』。
輪到張老了,那時他還很年輕,卻心知肚明,當然得低頭,領導發問了:『你回來幹甚麼?』張老眼皮也不敢抬,只說:『回家搞生產』。就這樣,張老順利回到了老家,帶了幾個老長官來到台灣,他們都做了大事,也做了大官,後來,在土地銀行裡,聯合起來照顧他,直到退休,至於銀行裡面的工作,他沒有甚麼本事,當個小科員沒有問題,如此而已。

我剛從台灣回到紐西蘭,過去的這一個月,確確實實的是在『搞生產』。已經84歲的Norman老先生教過我,每年過了勞工節(Labour Day),也就是每年十月的第四個星期一,今年是十月二十四日,氣溫就不會再低於10度C,我們的菜圃就可以開始種進東西了。我們一家人,包括小真,根據經驗,整好了菜地,買了番茄苗,玉米、小黃瓜的種子,昨天種好了菜圃,隨文附上相關照片兩張,一張是漂亮的菜圃。
照片一

另一張是『搞生產』新種的蘋果樹,原稱品種是太平洋玫瑰(Pacific Rose)。這一棵樹苗是老友紀敏兄,接枝完成,已經渡過栽培期的紐西蘭特有蘋果,他從北邊的奧克蘭市,開了一百多公里的車子,特地送來給我,這幾天我們這裡才最適合搞這樣的生產,蘋果樹苗上開滿了蘋果花。種在這裡,將來可以生產出蘋果,看它掉到地上時,就有可能發現其它種『萬有引力定律』。
照片二

這一個月,我從紐西蘭發起了向全中國進行搞生產的活動,教大家使用Win32Forth系統語音輸出,唸『百家姓』、『千字文』,為期三個月。我絕對有把握搞出生產,大陸同胞也能自由參與,這一次,我是真心的在搞生產,不是為了平安過境才講這樣的話,否則,再問一句:『搞啥子生產啊?』,我若支支吾吾答不上來,也會是另外一句:『拉出去』。要注意!搞的生產若說是最先進晶片,就是騙人了,還是那句話:『拉出去』,我只搞小老百姓可用的東西。

平時,我也收集了一些特別喜好的小東西。另附照片三張,展示這些特別的小玩意兒。第一張是我這次回台,爽兄特別為我搞出來的生產,是一隻白色的大螞蟻,這樣的產品,將來想要義賣籌款時,可以派得上用場。
我把爽兄生產出來的贈品,框在一個漂亮的玻璃小屋內,如照片三所示。
照片三

照片四是我很喜歡的一份全廢物利用藝術傑作照片,全用廢螺絲、廢墊圈、廢鐵絲焊製而成。一個出了車禍差一點就成廢物的傷患,接受由廢物生產出來的醫生診斷,那個醫生說:『不好好搞生產,就會真的變成廢物!』
照片四

照片五是我喜歡才花錢買來的:『準備跳芭蕾舞的小女孩』,她還不到需要搞生產的年齡,卻是完美無缺。
照片五

健全的知識、堅強的技術才能有好的生產,請回頭看看照片一,照片內容都看懂了嗎?番茄支撐鐵柱子上,為什麼都綁了塑膠袋?那是用來妨礙麻雀飛行用的,因此也能妨礙牠吃我的幼苗,麻雀咬掉了芽尖,生長就得延後一星期。移植完一星期內,怕強烈日照,那會照壞了我的幼苗,所以綁住的塑膠袋,可以調整高度而遮陽。
鐵柱頂怎麼都掛了空玻璃瓶?因為將鐵柱子打進菜圃後,柱頂的可敲打處,容易生銹,是用來防止雨淋溼後,銹壞了柱頂,我要用它們一輩子的,所以預掛空玻璃瓶。這樣的浮掛空瓶,鳥站不住,風吹了還會有點聲音,大小鳥見識過後,全都怕死了。
柱子要在植入番茄苗前先排隊打好,這個先後程序的重要意義為何?您該自己想,要不然,下次再回答:『搞生產』時,會露出馬腳。

我忙了三年搞出來的新書,不知何故?到現在還沒有生產出來,我也在等。

2011年10月24日 星期一

向上發展FORTH技術

曾慶潭2011-10-25於紐西蘭
Ching-Tang Tseng
ilikeforth@gmail.com
http://forthfortnight.blogspot.com

本文特別為了慶祝台灣光復節而寫

我在今年九月份中華民國FORTH語言協會的月會中,發表了一篇『行星齒輪組動態模擬程式』的現場展示與演講,公開的程式是贈送給與會者的禮物。
由於題目太大,當時,無法在短時間內講完這個程式所有的含意,月會現場,只能大致說明程式的基本精神。對於不熟悉機械工程的聽眾,現場觀賞完畢動態展示後,可能仍難以體會程式執行時,顯示的表面機械意義。
現在重談這個主題,有一點勉強。因為,已經贈送出去的禮物,似乎也不該一送再送,否則豈不成了二手禮物?但是,我在離台返紐前,親眼目睹中華民國台灣現今FORTH界的最高高手──陳爽大師兄,一連耗費幾個晚上,專程為我精進修改這個一年多前寫出來的程式,能不感動?現在,不想在網上公開這個程式都不行,那會太辜負了爽兄的好意。
因此,特別挑選台灣光復節,仔細交代這個程式的全盤精神,並為其留下永久的文字記錄,本文可以為台灣帶來向上發展FORTH技術的一條小路,它才是我當初設計這個程式時的初衷。文末的討論,會涉及未來的多CPU系統之平行處理觀念性想法,是有希望在近期內發展出來的理論性探討,這樣的討論,沒實現前都是空談,讀者若不想看,我絕不勉強。
我不是在寫論文,所以文章的內容可以不按牌理出牌,而以方便講解為主。刊出網文也沒有浪費紙張的問題,所以可以不管刊出的圖示是否會太佔空間的問題。全文只考慮以各方面適當的專業術語,清楚、通順的表達我個人的想法。

1. 執行『行星齒輪組動態模擬程式』後的範例停格顯示圖


圖1

如圖1所示,這是一個會按照機械運動原理旋轉起來的動態顯示圖,程式使用了兩個視窗,上圖用掉一個視窗。運轉的同時,FORTH主系統的視窗照常運作。當使用者操作滑鼠於上圖中的三個不同齒輪組區域,點選一下之後,主視窗會顯示經過運算才得到的轉速比,上圖中的實際相對轉速與轉向,也會立即配合操作而馬上動態顯示合理的結果。在齒輪區域外點選,則令轉動立即反向。運轉時壓下鍵盤上的任何鍵,就能得到瞬間停格圖。這裡面有好幾套可以同時運作的現象,但沒有用到FORTH自身的多工。
歡迎熟悉機械運動原理的專家,從我的創作中找問題,或來信討論,但請勿吹毛求疵到非要我把齒輪的齒畫出來不可。等到有一天,FORTH多CPU的系統能夠方便的使用之後,我自然就會再度實現這種創作。那些應該顯示卻不見了的齒,就當它是我在發展程式期間,不小心轉錯方向而被打掉磨平了的結果,如果您不好好學會這種機械運動的原理,亂組合這種齒輪,那些齒是真的會被打掉的。
公開的程式必須在我所設計的ABC FORTH數學計算系統中才能執行,我試過了,從XP的V4.2,到XP的V6.14,再到W7的V6.14,三套ABC FORTH系統都能順利的執行,請記住!已經幾年不改的程式,擁有還能再跑好幾年的特性,直到64位元的電腦被淘汰前,都能不必修改而執行。這個題材,用來教育我們的下一代,再好不過。現任教師,請不要以此物無利可圖而抗拒採用,下一代不是別人的下一代,他們就是您與我的下一代,我則何必曰利?

2. 我所設計的原始程式

\ Planetary Gear set
\ 行星齒輪組動態旋轉模擬程式
\ 作者:曾慶潭 於紐西蘭
\ 版權所有,標示版權,便歡迎使用。
\ Copyright 2010-08-08 Ching-Tang Tseng, Hamilton, NZ
\ Permission is granted by the author to use this software for any application
\ provided this copyright notice is preserved.

120 VALUE SUNR \ (1)太陽齒輪半徑或齒數
40 VALUE PLANETR \ (2)行星齒輪半徑或齒數
40 VALUE DELAY \ (3)畫完停頓時間,以毫秒計

SUNR PLANETR 2 * + VALUE RINGIR \ 環形齒輪內半徑或齒數
RINGIR 40 + VALUE RINGOR \ 環形齒輪外半徑

4 3 MATRIX XF
4 3 MATRIX YF
4 ARRAY R
4 ARRAY W \ 用來暫存轉動之角度位置
4 ARRAY DW \ 每次寸動旋轉步進之角度變量
3 ARRAY BIAS \ 三組旋轉標示點固定之偏差角度
REAL FPI/180
REAL RATIO
INTEGER I
INTEGER J
INTEGER AA

\ 藉助於FORTH標準指令VALUE之使用方式,可以比較方便的將參數傳遞給繪圖系統。
\ 注意:硬用ABC FORTH系統中宣告而成之整數變數,將使程式原理複雜。
0 VALUE A1X 0 VALUE A2X 0 VALUE A3X
0 VALUE A1Y 0 VALUE A2Y 0 VALUE A3Y
0 VALUE B1X 0 VALUE B2X 0 VALUE B3X
0 VALUE B1Y 0 VALUE B2Y 0 VALUE B3Y
0 VALUE C1X 0 VALUE C2X 0 VALUE C3X
0 VALUE C1Y 0 VALUE C2Y 0 VALUE C3Y
0 VALUE D1X 0 VALUE D2X 0 VALUE D3X
0 VALUE D1Y 0 VALUE D2Y 0 VALUE D3Y

\ 固定參數
: INIT1
{{ FPI/180 = FPI / 180 }}
{{ BIAS ( 1 ) = 0 }} {{ BIAS ( 2 ) = 120 }} {{ BIAS ( 3 ) = -120 }}
{{ W ( 1 ) = 0 }} {{ W ( 2 ) = 0 }} {{ W ( 3 ) = 0 }} {{ W ( 4 ) = W ( 3 ) }}
{{ R ( 1 ) = I>R ( SUNR ) }}
{{ R ( 2 ) = I>R ( SUNR ) + I>R ( PLANETR ) }}
{{ R ( 3 ) = I>R ( RINGIR ) }}
{{ R ( 4 ) = I>R ( RINGIR ) + 40 }}
;

\ (4)與齒輪轉速及轉向相關之變數,由設定DW之值來達到目的。
\ 轉向由正負號決定,負值(-)逆時鐘方向旋轉(CCW),正值(+)順時鐘方向旋轉(CW)。
\ 轉速由數值之大小來決定,0值不旋轉,值越大,旋轉得越快。
\ 此處預設為練習計算相對旋轉速度之用,亂設定就亂旋轉。
\ 此範例表示沒有固定齒輪,太陽齒輪為主動,其他齒輪為被動,三組均可自由轉動。
: INIT2
{{ DW ( 1 ) = 5 }}
{{ DW ( 2 ) = R ( 1 ) / ( R ( 1 ) + R ( 3 ) ) }}
{{ DW ( 3 ) = NEGATE ( R ( 1 ) ) / R ( 3 ) }}
{{ DW ( 4 ) = DW ( 3 ) }}
;

: INIT INIT1 INIT2 ;

: INCH-ALONG BASIC
10 FOR I = 1 TO 4
15 LET { W ( I ) = W ( I ) + DW ( I ) }
20 IF { W ( I ) > 360 } THEN 40
30 GOTO 60
40 LET { W ( I ) = W ( I ) - 360 }
50 GOTO 90
60 IF { W ( I ) < 0 } THEN 80
70 GOTO 90
80 LET { W ( I ) = W ( I ) + 360 }
90 NEXT I
100 END
;

: (XYF) BASIC
10 FOR I = 1 TO 4
20 FOR J = 1 TO 3
30 LET { XF ( I J ) = 250 + R ( I ) * COS ( ( W ( I ) + BIAS ( J ) ) * FPI/180 ) }
40 LET { YF ( I J ) = 250 + R ( I ) * SIN ( ( W ( I ) + BIAS ( J ) ) * FPI/180 ) }
50 NEXT J
60 NEXT I
70 END
;

: [XYI]
[[ AA = INT ( XF ( 1 1 ) ) ]] AA TO A1X
[[ AA = INT ( XF ( 1 2 ) ) ]] AA TO A2X
[[ AA = INT ( XF ( 1 3 ) ) ]] AA TO A3X
[[ AA = INT ( YF ( 1 1 ) ) ]] AA TO A1Y
[[ AA = INT ( YF ( 1 2 ) ) ]] AA TO A2Y
[[ AA = INT ( YF ( 1 3 ) ) ]] AA TO A3Y

[[ AA = INT ( XF ( 2 1 ) ) ]] AA TO B1X
[[ AA = INT ( XF ( 2 2 ) ) ]] AA TO B2X
[[ AA = INT ( XF ( 2 3 ) ) ]] AA TO B3X
[[ AA = INT ( YF ( 2 1 ) ) ]] AA TO B1Y
[[ AA = INT ( YF ( 2 2 ) ) ]] AA TO B2Y
[[ AA = INT ( YF ( 2 3 ) ) ]] AA TO B3Y

[[ AA = INT ( XF ( 3 1 ) ) ]] AA TO C1X
[[ AA = INT ( XF ( 3 2 ) ) ]] AA TO C2X
[[ AA = INT ( XF ( 3 3 ) ) ]] AA TO C3X
[[ AA = INT ( YF ( 3 1 ) ) ]] AA TO C1Y
[[ AA = INT ( YF ( 3 2 ) ) ]] AA TO C2Y
[[ AA = INT ( YF ( 3 3 ) ) ]] AA TO C3Y

[[ AA = INT ( XF ( 4 1 ) ) ]] AA TO D1X
[[ AA = INT ( XF ( 4 2 ) ) ]] AA TO D2X
[[ AA = INT ( XF ( 4 3 ) ) ]] AA TO D3X
[[ AA = INT ( YF ( 4 1 ) ) ]] AA TO D1Y
[[ AA = INT ( YF ( 4 2 ) ) ]] AA TO D2Y
[[ AA = INT ( YF ( 4 3 ) ) ]] AA TO D3Y
;

: [XY] BASIC
10 RUN (XYF)
20 RUN [XYI]
30 RUN INCH-ALONG
40 END
;

0 VALUE XM \ 儲存Mouse的座標位置
0 VALUE YM

:OBJECT SPR-GEARS
<SUPER WINDOW
:M ON_INIT: ON_INIT: SUPER ;M
:M STARTPOS: 500 100 ;M
:M STARTSIZE: 500 500 ;M
:M WINDOWTITLE: Z" 行星齒輪組動態展示圖 作者:曾慶潭2010-08-08於紐西蘭" ;M
:M ON_DONE: ON_DONE: SUPER ;M
\ :M WINDOWTITLE: Z" Planetary Gear set Author: Chint-Tang Tseng" ;M

\ 這個指令用到視窗航舵(Handle of the WiNDow),故必須放在這裡。
: SAVEMOUSE
HWND GET-MOUSE-XY TO YM TO XM ;

:M ON_PAINT:

INIT

BEGIN

SAVEMOUSE
[XY]

BLACK LINECOLOR: DC

A1X A1Y MOVETO: DC
250 250 LINETO: DC
A2X A2Y LINETO: DC
250 250 MOVETO: DC
A3X A3Y LINETO: DC

B1X B1Y MOVETO: DC
B2X B2Y LINETO: DC
B3X B3Y LINETO: DC
B1X B1Y LINETO: DC
B1X B1Y PLANETR CIRCLE: DC
B2X B2Y PLANETR CIRCLE: DC
B3X B3Y PLANETR CIRCLE: DC

C1X C1Y MOVETO: DC
D1X D1Y LINETO: DC
C2X C2Y MOVETO: DC
D2X D2Y LINETO: DC
C3X C3Y MOVETO: DC
D3X D3Y LINETO: DC

250 250 SUNR CIRCLE: DC \ 重繪三組被破壞之圓圈
250 250 RINGIR CIRCLE: DC
250 250 RINGOR CIRCLE: DC

DELAY MS
KEY? 0=

WHILE

WHITE LINECOLOR: DC

A1X A1Y MOVETO: DC
250 250 LINETO: DC
A2X A2Y LINETO: DC
250 250 MOVETO: DC
A3X A3Y LINETO: DC

B1X B1Y MOVETO: DC
B2X B2Y LINETO: DC
B3X B3Y LINETO: DC
B1X B1Y LINETO: DC
B1X B1Y PLANETR CIRCLE: DC
B2X B2Y PLANETR CIRCLE: DC
B3X B3Y PLANETR CIRCLE: DC

C1X C1Y MOVETO: DC
D1X D1Y LINETO: DC
C2X C2Y MOVETO: DC
D2X D2Y LINETO: DC
C3X C3Y MOVETO: DC
D3X D3Y LINETO: DC

REPEAT

;M

;OBJECT

\ 操作滑鼠控制出各種方式之旋轉

REAL XR
REAL YR
REAL XYR \ 儲存Mouse座標的半徑值

: SUN-GEAR-FIXED
{{ DW ( 1 ) = 0 }} {{ DW ( 2 ) = 1 }}
{{ DW ( 3 ) = ( R ( 1 ) + R ( 3 ) ) / R ( 3 ) }}
{{ DW ( 4 ) = DW ( 3 ) }}
CR ." 行星齒輪架為主動輸入,環形齒輪為被動輸出時,轉速比為: "
CR ." 1 : " {{ RATIO = ( R ( 1 ) + R ( 3 ) ) / R ( 3 ) }} RATIO F.
CR ." 環形齒輪為主動輸入,行星齒輪架為被動輸出時,轉速比為: "
CR ." 1 : " {{ RATIO = R ( 3 ) / ( R ( 1 ) + R ( 3 ) ) }} RATIO F. ;
: PLANETARY-GEARSET-FIXED
{{ DW ( 1 ) = 5 }} {{ DW ( 2 ) = 0 }}
{{ DW ( 3 ) = NEGATE ( R ( 1 ) / R ( 3 ) ) }}
{{ DW ( 4 ) = DW ( 3 ) }}
CR ." 太陽齒輪為主動輸入,環形齒輪為被動輸出時,轉速比為: "
CR ." 1 : " {{ RATIO = NEGATE ( R ( 1 ) / R ( 3 ) ) }} RATIO F.
CR ." 環形齒輪為主動輸入,太陽齒輪為被動輸出時,轉速比為: "
CR ." 1 : " {{ RATIO = NEGATE ( R ( 3 ) / R ( 1 ) ) }} RATIO F. ;
: RING-GEAR-FIXED
{{ DW ( 1 ) = 5 }}
{{ DW ( 2 ) = R ( 1 ) / ( R ( 1 ) + R ( 3 ) ) }}
{{ DW ( 3 ) = 0 }} {{ DW ( 4 ) = DW ( 3 ) }}
CR ." 太陽齒輪為主動輸入,行星齒輪架為被動輸出時,轉速比為: "
CR ." 1 : " {{ RATIO = R ( 1 ) / ( R ( 1 ) + R ( 3 ) ) }} RATIO F.
CR ." 行星齒輪架為主動輸入,太陽齒輪為被動輸出時,轉速比為: "
CR ." 1 : " {{ RATIO = ( R ( 1 ) + R ( 3 ) ) / R ( 1 ) }} RATIO F. ;

:NONAME BASIC
10 LET { XR = I>R ( XM ) - 250 }
20 LET { YR = I>R ( YM ) - 250 }
30 LET { XYR = SQRT ( ( XR * XR ) + ( YR * YR ) ) }
40 IF { XYR <= R ( 1 ) } THEN 90
50 IF { ( XYR > R ( 1 ) ) AND ( XYR < R ( 3 ) ) } THEN 110
60 IF { ( XYR >= R ( 3 ) ) AND ( XYR <= R ( 4 ) ) } THEN 130
70 IF { XYR > R ( 4 ) } THEN 150
80 GOTO 180
90 RUN SUN-GEAR-FIXED
100 GOTO 180
110 RUN PLANETARY-GEARSET-FIXED
120 GOTO 180
130 RUN RING-GEAR-FIXED
140 GOTO 180
150 FOR I = 1 TO 4
160 LET { DW ( I ) = NEGATE ( DW ( I ) ) }
170 NEXT I
180 END
; SETCLICKFUNC: SPR-GEARS

: MAIN
CR ." 太陽齒輪半徑為: " SUNR . ." ,行星齒輪半徑為: " PLANETR .
CR ." 因此,環形齒輪的半徑為: " RINGIR .
." ,而行星齒輪架的等效半徑為: " RINGIR SUNR + .
START: SPR-GEARS ;

MAIN

3. 陳爽精進修改後的程式

anew 行星齒輪組.F

\ Planetary Gear set
\ 行星齒輪組動態旋轉模擬程式
\ 作者:曾慶潭 於紐西蘭
\ 版權所有,標示版權,便歡迎使用。
\ Copyright 2010-08-08 Ching-Tang Tseng, Hamilton, NZ
\ Permission is granted by the author to use this software for any application
\ provided this copyright notice is preserved.

needs timer-window \ 動畫改用 timer 驅動 ** 陳爽 2011/9/22

120 VALUE SUNR \ (1)太陽齒輪半徑或齒數
40 VALUE PLANETR \ (2)行星齒輪半徑或齒數
40 VALUE DELAY \ (3)畫完停頓時間,以毫秒計

SUNR PLANETR 2 * + VALUE RINGIR \ 環形齒輪內半徑或齒數
RINGIR 40 + VALUE RINGOR \ 環形齒輪外半徑

4 3 (MATRIX) XI \ 將原 XF 實數陣列 改用 XI 整數陣列 ** 陳爽 2011/9/22
4 3 (MATRIX) YI \ 將原 YF 實數陣列 改用 YI 整數陣列 ** 陳爽 2011/9/22
4 ARRAY R
4 ARRAY W \ 用來暫存轉動之角度位置
4 ARRAY DW \ 每次寸動旋轉步進之角度變量
3 ARRAY BIAS \ 三組旋轉標示點固定之偏差角度
REAL FPI/180
REAL RATIO
REAL FF
INTEGER I
INTEGER J

\ 固定參數
: INIT1
{{ FPI/180 = FPI / 180 }}
{{ BIAS ( 1 ) = 0 }} {{ BIAS ( 2 ) = 120 }} {{ BIAS ( 3 ) = -120 }}
{{ W ( 1 ) = 0 }} {{ W ( 2 ) = 0 }} {{ W ( 3 ) = 0 }} {{ W ( 4 ) = 0 }}
{{ R ( 1 ) = I>R ( SUNR ) }}
{{ R ( 2 ) = I>R ( SUNR ) + I>R ( PLANETR ) }}
{{ R ( 3 ) = I>R ( RINGIR ) }}
{{ R ( 4 ) = I>R ( RINGOR ) }}
;

\ (4)與齒輪轉速及轉向相關之變數,由設定DW之值來達到目的。
\ 轉向由正負號決定,負值(-)逆時鐘方向旋轉(CCW),正值(+)順時鐘方向旋轉(CW)。
\ 轉速由數值之大小來決定,0值不旋轉,值越大,旋轉得越快。
\ 此處預設為練習計算相對旋轉速度之用,亂設定就亂旋轉。
\ 此範例表示沒有固定齒輪,太陽齒輪為主動,其他齒輪為被動,三組均可自由轉動。
: INIT2
{{ DW ( 1 ) = 5 }}
{{ DW ( 2 ) = R ( 1 ) / ( R ( 1 ) + R ( 3 ) ) }}
{{ DW ( 3 ) = NEGATE ( R ( 1 ) ) / R ( 3 ) }}
{{ DW ( 4 ) = DW ( 3 ) }}
;
: INIT INIT1 INIT2 ;

: INCH-ALONG BASIC
10 FOR I = 1 TO 4
20 LET { W ( I ) = W ( I ) + DW ( I ) }
30 IF { W ( I ) > 360 } THEN 60
40 IF { W ( I ) < 0 } THEN 80
50 GOTO 90
60 LET { W ( I ) = W ( I ) - 360 }
70 GOTO 90
80 LET { W ( I ) = W ( I ) + 360 }
90 NEXT I
95 END
;

: <XYF> BASIC
10 FOR I = 1 TO 4
20 FOR J = 1 TO 3
30 LET { FF = 250 + R ( I ) * COS ( ( W ( I ) + BIAS ( J ) ) * FPI/180 ) }
35 LET XI ( I J ) = INT ( FF ) \ 原實數陣列 XF 改為整數陣列 XI ** 陳爽 2011/9/22
40 LET { FF = 250 + R ( I ) * SIN ( ( W ( I ) + BIAS ( J ) ) * FPI/180 ) }
45 LET YI ( I J ) = INT ( FF ) \ 原實數陣列 YF 改為整數陣列 YI ** 陳爽 2011/9/22
50 NEXT J
60 NEXT I
70 END
;

: [XY] BASIC
10 RUN <xyf>
30 RUN INCH-ALONG
40 END
;

0 VALUE XM 0 VALUE YM \ 儲存 Mouse 的座標位置
:OBJECT SPR-GEARS <super timer-window \ 原 window 改為 timer-window ** 陳爽 2011/9/22

:M ON_INIT: ON_INIT: SUPER INIT ;M
:M STARTPOS: 500 100 ;M
:M STARTSIZE: 500 500 ;M
:M WINDOWTITLE: Z" 行星齒輪組動態展示圖 作者:曾慶潭2010-08-08於紐西蘭" ;M
:M ON_DONE: ON_DONE: SUPER ;M
\ :M WINDOWTITLE: Z" Planetary Gear set Author: Chint-Tang Tseng" ;M

: SAVEMOUSE HWND GET-MOUSE-XY TO YM TO XM ;

:M On_Timer: \ 設定 timer 自動更新計算繪圖 ** 陳爽 2011/9/22
[XY] SAVEMOUSE Paint: self ;M

:M ON_PAINT: \ 簡化原重覆計算迴路, 只繪圖 ** 陳爽 2011/9/22

BLACK LINECOLOR: DC
[[ XI ( 1 1 ) ]] @ [[ YI ( 1 1 ) ]] @ MOVETO: DC
250 250 LINETO: DC
[[ XI ( 1 2 ) ]] @ [[ YI ( 1 2 ) ]] @ LINETO: DC
250 250 MOVETO: DC
[[ XI ( 1 3 ) ]] @ [[ YI ( 1 3 ) ]] @ LINETO: DC

[[ XI ( 2 1 ) ]] @ [[ YI ( 2 1 ) ]] @ MOVETO: DC
[[ XI ( 2 2 ) ]] @ [[ YI ( 2 2 ) ]] @ LINETO: DC
[[ XI ( 2 3 ) ]] @ [[ YI ( 2 3 ) ]] @ LINETO: DC
[[ XI ( 2 1 ) ]] @ [[ YI ( 2 1 ) ]] @ LINETO: DC
[[ XI ( 2 1 ) ]] @ [[ YI ( 2 1 ) ]] @ PLANETR CIRCLE: DC
[[ XI ( 2 2 ) ]] @ [[ YI ( 2 2 ) ]] @ PLANETR CIRCLE: DC
[[ XI ( 2 3 ) ]] @ [[ YI ( 2 3 ) ]] @ PLANETR CIRCLE: DC

[[ XI ( 3 1 ) ]] @ [[ YI ( 3 1 ) ]] @ MOVETO: DC
[[ XI ( 4 1 ) ]] @ [[ YI ( 4 1 ) ]] @ LINETO: DC
[[ XI ( 3 2 ) ]] @ [[ YI ( 3 2 ) ]] @ MOVETO: DC
[[ XI ( 4 2 ) ]] @ [[ YI ( 4 2 ) ]] @ LINETO: DC
[[ XI ( 3 3 ) ]] @ [[ YI ( 3 3 ) ]] @ MOVETO: DC
[[ XI ( 4 3 ) ]] @ [[ YI ( 4 3 ) ]] @ LINETO: DC

250 250 SUNR CIRCLE: DC \ 重繪三組被破壞之圓圈
250 250 RINGIR CIRCLE: DC
250 250 RINGOR CIRCLE: DC

[ classes ] \ 暫時可如此過關, 因前述 BASIC 語法未將原 order 還原 ** 陳爽 2011/9/22

;M

;OBJECT

cr .( SPR-GEARS )
START: SPR-GEARS
130 createTimer: SPR-GEARS
: g 130 createTimer: SPR-GEARS ; \ 啟動 timer (設定間隔 130 ms) ** 陳爽 2011/9/22
: h killTimer: SPR-GEARS ; \ 停止 timer ** 陳爽 2011/9/22

\ 操作滑鼠控制出各種方式之旋轉

REAL XR
REAL YR
REAL XYR \ 儲存 Mouse 座標的半徑值

: SUN-GEAR-FIXED
{{ DW ( 1 ) = 0 }} {{ DW ( 2 ) = 1 }}
{{ DW ( 3 ) = ( R ( 1 ) + R ( 3 ) ) / R ( 3 ) }}
{{ DW ( 4 ) = DW ( 3 ) }}
CR ." 行星齒輪架為主動輸入,環形齒輪為被動輸出時,轉速比為: "
CR ." 1 : " {{ RATIO = ( R ( 1 ) + R ( 3 ) ) / R ( 3 ) }} RATIO F.
CR ." 環形齒輪為主動輸入,行星齒輪架為被動輸出時,轉速比為: "
CR ." 1 : " {{ RATIO = R ( 3 ) / ( R ( 1 ) + R ( 3 ) ) }} RATIO F. ;
: PLANETARY-GEARSET-FIXED
{{ DW ( 1 ) = 5 }} {{ DW ( 2 ) = 0 }}
{{ DW ( 3 ) = NEGATE ( R ( 1 ) / R ( 3 ) ) }}
{{ DW ( 4 ) = DW ( 3 ) }}
CR ." 太陽齒輪為主動輸入,環形齒輪為被動輸出時,轉速比為: "
CR ." 1 : " {{ RATIO = NEGATE ( R ( 1 ) / R ( 3 ) ) }} RATIO F.
CR ." 環形齒輪為主動輸入,太陽齒輪為被動輸出時,轉速比為: "
CR ." 1 : " {{ RATIO = NEGATE ( R ( 3 ) / R ( 1 ) ) }} RATIO F. ;
: RING-GEAR-FIXED
{{ DW ( 1 ) = 5 }}
{{ DW ( 2 ) = R ( 1 ) / ( R ( 1 ) + R ( 3 ) ) }}
{{ DW ( 3 ) = 0 }} {{ DW ( 4 ) = DW ( 3 ) }}
CR ." 太陽齒輪為主動輸入,行星齒輪架為被動輸出時,轉速比為: "
CR ." 1 : " {{ RATIO = R ( 1 ) / ( R ( 1 ) + R ( 3 ) ) }} RATIO F.
CR ." 行星齒輪架為主動輸入,太陽齒輪為被動輸出時,轉速比為: "
CR ." 1 : " {{ RATIO = ( R ( 1 ) + R ( 3 ) ) / R ( 1 ) }} RATIO F. ;

:NONAME BASIC
10 LET { XR = I>R ( XM ) - 250 }
20 LET { YR = I>R ( YM ) - 250 }
30 LET { XYR = SQRT ( ( XR * XR ) + ( YR * YR ) ) }
40 IF { XYR <= R ( 1 ) } THEN 90
50 IF { ( XYR > R ( 1 ) ) AND ( XYR < R ( 3 ) ) } THEN 110
60 IF { ( XYR >= R ( 3 ) ) AND ( XYR <= R ( 4 ) ) } THEN 130
70 IF { XYR > R ( 4 ) } THEN 150
80 GOTO 180
90 RUN SUN-GEAR-FIXED
100 GOTO 180
110 RUN PLANETARY-GEARSET-FIXED
120 GOTO 180
130 RUN RING-GEAR-FIXED
140 GOTO 180
150 FOR I = 1 TO 4
160 LET { DW ( I ) = NEGATE ( DW ( I ) ) }
170 NEXT I
180 END
; SETCLICKFUNC: SPR-GEARS

: MAIN
CR ." 太陽齒輪半徑為: " SUNR . ." ,行星齒輪半徑為: " PLANETR .
CR ." 因此,環形齒輪的半徑為: " RINGIR .
." ,而行星齒輪架的等效半徑為: " RINGIR SUNR + .
START: SPR-GEARS g ;

MAIN

4. 原理

許多機械工業的產品,用到行星齒輪組作為設備元件,例如:汽車的自動變速箱。從網路Google搜索引擎來探尋,鍵入『Planetary gear set』則可以得到幾千幾百篇相關資料。我們很容易從網文中找到它的各種實體齒輪照片,能動態展示運轉現象的影像則不多。而且,我今天還見過網頁上刊載亂畫、亂轉的動態影像,只是會動,轉速與轉向則完全不合理。
行星齒輪組具有廣泛的功能,雖然在機械傳動的應用上,主要是用於動力轉向輪軸上,做為差速器使用,及用來圓滑改變機械傳動的轉速與變換傳輸扭力。但若考慮到將其應用於最近興起的特殊節能車與油電混合車設計時,它就另有功效,具有結合不同輸入或輸出動力於單一結構的特殊功效。
基本的行星齒輪組結構,由位於中央的太陽齒輪、居間的行星齒輪配上固定的支架、及位於最外圍的環形齒輪三者所構成。正式的運轉,是三者中固定其中單一種齒輪,而讓另外的兩種齒輪自由運轉,來達到變速與改變扭力的目的。一般而言,通常都以數套行星齒輪組,依次配合在一起,設計進單一個齒輪箱內,以達到範圍更為廣泛的變化目的。
就算是機械專家,通常對這種機械運轉起來時的轉速與轉向,不能很直接且正確的進行描述,因此,就產生了不少幫助記憶的圖表或口訣,用來描述這種機械的運動方式。我在初次接觸這種機械時,也很難正確的想像其運轉方式,設計程式時,依然必須藉助於書本的幫助,才能確定程式設計無誤。
相關文獻上都不提行星齒輪是由誰?何時?發明的,甚至於有書本記載,中國古時候黃帝軒轅氏(西元前2689年至西元前2597年,距今約4600年了),打敗蚩尤所使用的指南車,就是使用行星齒輪的運轉原理設計而成。我對這些說法不表意見,但是經由我自己設計的萬用程式,很快就能了解,行星齒輪的運轉原理,可以從軸端安裝了彈子盤(Bearing,學名為軸承)的結構推演出來。
只要古人有機會以肉眼觀察軸端安裝了小滾桿彈子盤的轉軸在運轉,為了保持小滾桿轉動時不會散掉,必須加裝滾桿保持器(Retainer),觀察保持器與轉軸之間的旋轉關係,就會顯現出相當於這種行星齒輪的運轉狀況,於是,行星齒輪就能夠很自然的被發現出來。因此,我們不需要特別去研究,行星齒輪到底是誰發明的?
基本上,我所設計的程式,只須更改太陽齒輪與行星齒輪的半徑,就能立即獲得新的顯示結果。行星齒輪的半徑被設定成相對的很小時,就能見到這種軸承效果,如圖2所示。而且,您還能見到無齒的圖形描述方式,更像實際的軸端彈子盤。
反過來的描述圖,也能立即獲得,都是只須改變兩個數字,就能從我的程式輕易獲得,如圖3所示。因此,這一套動態模擬系統是萬用的,適用於各種情況。

圖2

圖3

圖2與圖3能夠如此輕易的產生,係我對此一系統進行過仔細分析後,才得到的結果。我效法FORTH程式語言發明人莫查理(Charles H. Moore)先生發明FORTH CPU的同樣方法,仔細分析問題後,將因子簡化到最精簡程度,才設計程式。因此,得到了只須根據兩個數字,就能設計出整個系統的結論。
設計程式前,我手繪分析此問題的圖形,得知欲繪出展示圖時,只須根據12個關鍵點,然後採用兩點間繪出一直線的指令,與根據一個點及半徑繪出一個圓的指令,就能快速繪出全圖。問題被精簡到最簡程度時,電腦所需執行的程式,就不會太多或太耗時。因此,能讓我們有機會產製像演電影一般的動態展示圖。
讓展示圖形具有動態感的技巧也很簡單,宣告使用黑線讓電腦繪完一次全圖後,停一小段時間,讓觀者能產生視覺暫留的效果。然後,再讓電腦使用見不到的白線宣告,就在原處重繪一遍,原圖就消失了。緊接著,根據電腦快速計算,得到下一步寸動(Inch-along)之後的新位置,也就是該有之新的12個關鍵點,重覆執行上述程序,就可完成動態展示圖。
這12個關鍵點,以及繪圖時僅需使用的兩個繪圖指令,可以從圖4的紅圈標示點顯現出來。讀者請自行觀察後體會。

圖4

我也仔細分析過計算這個系統中的轉速比時,根本可以不必去考慮行星齒輪的個別轉速,反倒是行星齒輪架的轉速,才會是繪製動態展示圖時該有的關鍵數據。分析各組齒輪的轉速比時,必須把行星齒輪架,考慮成具有一個等效的旋轉半徑,這個半徑就等於太陽齒輪半徑與環形齒輪內徑之和。因此,再度把問題簡化到計算轉速比時,只須顧慮太陽齒輪的半徑,與環形齒輪的內徑,兩者,便可算出各種轉速變化關係,程式更形簡化了。
如果讀者對於程式中計算轉速比的算法有疑問,請自行上網參考別的專家之論述。此處則是我自己歸納分析後,所得到的最精簡結果,您也可以根據程式執行後印出來的數字,驗證於您自己遭遇到問題後,根據書本中提供的其它公式,計算得到之結果,來核對我設計的程式,對或者是不對?
事實上,探討這種裝置的應用時,行星齒輪架的轉速,確實比行星齒輪本身的轉速要有意義,因為,行星齒輪是恆被架子框住來運轉的。
裝置中用來固定三組齒輪所需要的煞車帶,是不需要繪出圖來表示的。我藉助於設計出電腦滑鼠點選功能的操作,來固定指定的齒輪,就能達到完全一樣的效果。

5. 程式特殊狀況說明

繪圖程式的設計方法非常簡單,近期內即將出版之我的新書中,詳細講解了最基本的設計方法,我鼓勵全世界的中國人去買這本書,書中以非常奇特的方式,描述了許多電腦界所罕見的觀念。
只用兩組繪圖指令就能繪完全圖。換句話說,程式的執行,耗用了大部份的時間,去計算出12個關鍵點的座標。計算時,要用到浮點數及幾何函數,因此,如果不用ABC FORTH數學計算系統來協助設計,只用傳統的FORTH程式語言來設計,必會遭遇很大的困難。上述程式中以浮點計算式算出座標,再經過變換成對應整數的相關程式,都是直接列示的數學式子,懂得幾何就懂得這些程式。
一年多前,我在將計算結果傳送進繪圖程式時,遭遇到了困難,因為繪圖程式的原始創作者是麥安卓(Andrew McKewan)先生,他以物件導向(Object oriented)的觀念,創作了新的繪圖程式寫法。而我所設計的ABC FORTH數學計算程式寫法,與這種設計不相容,嚴格說來是二者互不相容。彼此都由基礎FORTH系統發展而成,於是,最後,我只好採取一個基礎FORTH系統中,大家都可以共同使用的變常數VALUE宣告的格式,來解決數據傳遞的問題,結果就設計出了上述的原始程式。
陳爽在仔細研究過我的程式後,發現了上述狀況,深覺這樣的程式安排很不恰當,於是我們兩人討論後進行改寫,就改出了以類似 [[ XI ( 2 2 ) ]] @ 的方式取得ABC FORTH整數變數內容的方式,來取消原來大量使用 VALUE的原始程式設計方法。另外,在這種使用方式結束後,要增用一列立即執行式的宣告

[ CLASSES ]

以便讓系統在編譯此程式時,能因正確的字彙搜尋路徑,找得到隨後就要編納進系統的 『;M 』指令,達到了我們期望中的目的。
這一段發展過程,展示了陳爽熟悉FORTH系統的功力,是一段很好的技術研究方式,值得記錄下來供大家參考。
陳爽對利用軟體定時器(Timer)控制動態顯示圖的技巧熟悉,於是又加上了以定時器設計程式的新格式。它的功效等同於宣告將軟體定時器使用於這個繪圖程式之後,繪圖程式便會依照設定的時間間隔,每次均重新繪出一個寸動變換位置後的新視窗,程式能啟、能停,指令的使用方法,就如程式所示。
程式的其它部份,也有幾個值得參考的設計範例,尤其是滑鼠的應用方式,程序完整,從取得滑鼠座標位置的方法,到讓點選位置產生指定功效的設計,均已明確的顯示在程式之中。

精進修改程式之後,我們都並未滿足於這樣的研究結果,我回到紐西蘭,便再度研究試驗出將ABC FORTH程式格式,融進物件導向程式格式的正式方法,順便透過此文公諸於大眾,大家以後就能依樣使用。
我只須公布一個最簡實例,看完程式,大家立刻就能明白,程式格式的互相融入方法。

\ 視窗繪圖01
\ 作者:曾慶潭 於紐西蘭,版權所有,標示版權,便歡迎使用。
\ Copyright 2011-06-01 Ching-Tang Tseng, Hamilton, NZ
\ Permission is granted by the author to use this software for any application
\ provided this copyright notice is preserved.

INTEGER A
INTEGER B
INTEGER C
INTEGER D

: INIT
[[ A = 0 ]] [[ B = 250 ]] [[ C = 500 ]] [[ D = 250 ]] ;

:OBJECT GRAPH01

<super WINDOW

:M STARTPOS: 100 100 ;M
:M STARTSIZE: 500 500 ;M
:M WINDOWTITLE: Z" 星(Star) 作者:曾慶潭2010-06-01於紐西蘭 " ;M

:M ON_PAINT:

INIT
BLACK LINECOLOR: DC

BASIC

10 RUN A 250 MOVETO: DC
20 RUN 250 B LINETO: DC
30 RUN C 250 LINETO: DC
40 RUN 250 D LINETO: DC
50 RUN A 250 LINETO: DC
60 LET A = A + 10
70 LET B = B + 5
80 LET C = C - 10
90 LET D = D - 5
100 IF C >= 0 THEN -10
110 END

[ CLASSES ]

;M

;OBJECT

: MAIN START: GRAPH01 ;

MAIN

執行結果,可得到圖5。


圖5

這是一個新改寫完成的程式,當初,我在設計這個繪圖程式時,根本不知道我的ABC FORTH程式能夠這樣使用,但此性能原本即已存在,這樣用,雖然是回到紐西蘭後才產生的新發現,事實上,沒有陳爽的那一列傳統FORTH程式技巧

[ CLASSES ]

新發現就不容易被發現得出來,大家還是感謝陳爽的協助吧。
我在陳爽家中共同研究了幾個晚上的FORTH,見到他仔細研讀過我的『ABC FORTH數學計算系統使用說明』,並以彩色筆從頭到尾畫完了重點,深受感動,於是告訴他,可以免費再致贈一本新書給他。您知道他如何回答嗎?他說:『那我畫過的重點豈不全都不見了?』天啊!他是目前全台灣FORTH界最高的高手啊!
上列這個新公佈的小程式,應該是回敬給陳爽大師兄最好的禮物,他最能看懂我的設計,『行星齒輪組動態模擬程式』也因此還能再進一步精進改寫,但我不做了,我想改談當初我設計這個程式時的原始初衷。

6. 討論

我為什麼要發展『行星齒輪組動態模擬程式』?
不是為了想表演技術,是為了替可能很快就會出現的多CPU FORTH系統找試驗性題目。
我曾在叛逃美國的張憲義手下工作過一段時日,那時,他領導的工作小組中,有發展電腦軟體模擬系統的研究工作,因此,見識過一些模擬系統的研發問題,那是30幾年前的往事。
當時,電腦的軟硬體都沒那麼進步,模擬系統的研究,幾乎只能算是停留在基本的理論性研究階段而已。我最記得的模擬軟體要求,就是設法將所有多項式的數學計算式子,都編寫成一連串 ( a * X + b ) 格式的程式,然後,就能交給平行處理的電腦,進行連貫性的計算,以便快速得到一系列平行輸出的計算結果。
模擬系統最需要快速得到大量的計算結果,這是模擬系統的基本要求。
回頭看看我所設計的『行星齒輪組動態模擬程式』,主要的程式內容,就是不斷的進行一序列的數學計算,它適合用來考驗能夠平行處理的多CPU FORTH系統,這就是我設計這個程式時的真正初衷,讓我自己可以見到耗用了許多時間在數學計算上的實際程式。
也許讀者立刻會感到我的想法非常幼稚,支湯姆(Tom Zimmer)先生創作的Win32Forth系統,原本就是一個根本跑得不夠快的系統,拿它當基礎,當然得不到理想的輸出結果。沒錯,它是跑得非常慢,上述的程式幾乎只能讓我得到每分鐘僅有一轉的動態展示結果,真正汽車上的引擎轉速,在慢車運轉時,都還得有每分鐘800轉的轉速,我到底想模擬出甚麼東西呢?這一節討論,就論述這方面的問題。

三年前也是回台參加FORTH月會時,見識過鄒鳴峰小老弟,展示他使用CUDA跑平行處理程式,使用了四個CPU。程式給我的感覺,是系統以迴路方式,執行一個畫面的影像處理時,只將平行處理安排成處理互不相干的四個區域影像,來達到平行處理的快速效果,沒有其它特出的系統性意義。

我先行建立起一個自己設計、可以執行無誤而獲得結果的動態模擬程式,然後經常回顧這個程式的內容,用它來思考程式應該如何被編譯?才能成為最好的平行處理程式碼。至於程式設計的漂不漂亮?能不能獲得甚麼好處?不是考慮的重點,甚至於根本就沒打算將它寫進新書中當教材。因為它遠離了一般群眾學習上的基本需求。

我也經常從網上閱讀一些多CPU的最新發展訊息,知道上個月底,綠色陣列(GreenArrays)公司,已經推出了莫查理先生設計的陣列式144個CPU評估板(Evaluation board),此版為一種原型發展測試用實體裝置。他們推出產品之後,也苦於新人的難以進入使用狀況,必須像我寫新書那樣,趕著寫出新資料,教大家如何憑少到只用3個鍵片(3-key pad)的操作方式來編寫程式,與如何將程式編譯載入系統。
綠色陣列公司的創舉很可貴,我們應該給予高度的肯定。但是,這一個月,我也看到了非FORTH領域,多CPU的技術發展報導訊息,據說IBM公司已經與3M公司合作,取得了一種特殊的膠水技術,能將多CPU的結構黏製成100層摩天大樓的樣子,而且可能在2013年推出這種結構的多CPU裝置,並正式應用在行動手機上。這些訊息告訴了我,多CPU的硬體實體發展,還有後續的進展,不是到此為止。
如果將莫查理先生於綠色陣列公司發展出來的144個陣列式CPU,配上IBM公司的膠水技術,將陣列式結構也黏製成摩天大樓,情況就會不一樣了,它將被稱為『144大樓』。摩天大樓的3維式結構,能提供多條CPU間的高速資料通道,陣列式安排的多CPU結構只有一條,兩者相比,就好像是一片平房與一座摩天大樓的對應關係,性能差異,可以立見。這些硬體科技的實現,事實上離我們都不遠,在我們有生之年,絕對可以見得到。
我沒有蓋摩天大樓式多CPU的技術,甚至於硬要在我家後院蓋一間小木屋的經濟付出,都會造成我們家庭生活上的緊張。但是,我可以先於別人,先行自我培養出經營一座摩天大樓,讓其發揮效果的能力。

思考多CPU的程式碼應有之編譯問題時,我經常回顧我自己設計的破(Poor)程式,如果根據144大樓的結構,我好像應該設計一個名為中階指令專用的程式計數器,仿照FORTH系統中原有的專業術語,它就叫作MP(Middle word Pointer)。傳統FORTH中的幾個重要系統變數,它們原始的意義,是這樣的:

W控管低階定義而成指令的執行。
IP控管高階定義而成指令的執行。
UP控管多工定義而成程式的執行。

它們的實質功能,全都像實際CPU內的程式計數器PC(Program Counter),專門用來指出程式被執行到了那一個點,而且必須按規矩自動增量。

我想要的MP之所以被稱為中階,是因為系統若將程式中的指令,拆放給144大樓中的部份CPU執行之後,需要一個中階小主管,暫時可以想像成它就是一名二房東。例如:上述程式中的 (XYF) 指令,本身需要一個MP來控管12個點的各自計算,它代表需要借用144大樓中的13層樓,因為 (XYF) 指令自己當個二房東,也需要一層樓。於是,要快速執行出 (XYF) 指令時,系統就去爭取13層樓的使用權,MP因此而僅在這13層樓間打轉,二房東沒事就去逐樓收房租、發通告,又因為只是二房東,收到的房租,除了自己控管的部份之外,是要上繳大房東的。
這樣的中階程式計數器概念,就能讓我在設計多CPU系統編譯程式時,在指令結構中,多增用一欄記憶單元,用來儲存這個指令可以用到多少個CPU?此欄暫時就稱它為編制欄吧,它儲存的內容代表執行這個指令時,可由編制出多少個CPU,同時執行平行處理而得到結果。
同樣的道理,處理 [XYI] 也需要13層樓的使用權,也是一個二房東。兩個二房東要聽命於大房東 [XY] 安排它們串行處理,大房東 [XY] 還有第三個名叫山本寸動(Inch-along)的日本人二房東,它專門經營轉滿一圈360 度後就會自動歸0的旋轉門,從旋轉門企業經營的內容來看,一次要租5層樓。如此一來,將大房東也要租住一層樓而納入考慮,144大樓一下子就租出去13 + 13 + 5 + 1 = 32層樓了,144大樓生意真好,它最歡迎上述幾個房東型式的顧客來租樓使用了。
多CPU的編譯器(Compiler),在編譯指令時,需要一些規則,例如:遇到矩陣內各個單元的計算程式時,就鑑別計算是否互不相干?鑑別方法也很簡單,就根據矩陣指標作為識別單元的依據,然後鑑別等號右邊被編譯的內容,有無用到其它同一陣列內的單元?若全無,則表全不相干,於是就根據矩陣指標的總量,上例中是3 * 4 = 12,再加上自己本身1個,總共是13,編進編制欄內。
編譯的規矩當然不僅只是上述這麼簡單,還有其他鑑別出一個指令可以放什麼數值進編制欄的規矩,例如上述程式中專供滑鼠操作用的『:NONAME』指令,它的執行內容都是一些格式相當,彼此也互不相干的程式,也能被分配到幾個CPU去分工,卻未必一定要平行而處理。144大樓式的CPU,由於莫查理先生設計得足夠精簡,佔用空間很少,同一層樓的CPU旁,就還能安放出許多的自用記憶體。未必一定要平行處理的互不相干、同格式、小型程式,因此也能交給144大樓各樓去執行。
可以想像,如果碰上了前後高度相依的串行程式,編譯系統也得將這些逐步執行的每一列程式,安排成一串樓上、樓下依序相通的租樓方式來執行了。有幾列就得租幾樓,該填進編制欄內的數字是多少?只要清算這一模組程式參數欄的內容,有幾個獨立單元?就能獲得。
FORTH傳統程式已經高度模組化,ABC FORTH程式的寫法,也鼓勵大家盡量使用超短型的模組化格式來寫程式。模組與模組之間可以確定是絕對不相干的程式,因此,那種一時看不出內容,能不能被編譯成高度平行處理的程式?其編制欄的內容就填1,碰上了,只好僅租用144大樓的單一樓層來解決問題。

除此之外,必然還有許多多CPU程式編譯方法需要考慮的問題可以探討。能被易於編譯成平行處理的程式,也應該有一些基本的程式書寫語法要求。這些規矩,都很值得在144大樓尚未建成上市之前,就開始著手研究,但是,就是需要先準備好類似本文所用的動態模擬程式,才有可以研究的對象。
上述研究方法,是基於一個大前題,才得以如此進行。144大樓的每一層樓,都得具有基本FORTH的核心程式才行。此前我們用來執行FORTH程式的核心(Kernel)程式,是經由普通CPU設計出FORTH虛擬機(Virtual Machine)而成,如果144大樓還用一般CPU來建造,那麼,每一層樓都還得有各自的一套FORTH虛擬機器才行,這樣的發展當然不切實際。
144大樓裡面,已經不再需要傳統FORTH系統內的低階指令程式計數器W了,它直接使用FORTH原生碼(Native code)的程式計數器PC。因此,思考平行處理的程式編譯問題時,必須從(非『重』)新思考,想法才能不受約束。總而言之,144大樓必須採用綠色陣列公司的創作,上述的討論才有意義,因為這是一種天生全硬體FORTH核心式的CPU。
大師兄協助我精進的程式中,採用的一個軟體定時器設計,不是採用FORTH程式語言完成的設計,它不能上144大樓,只好請他在樓下訪客貴賓室內休息了,遇到這種狀況,我們只好另換以FORTH設計的軟體定時器。
這個月中旬,十月十七日,莫查理先生在他的個人部落格網文中記述,他已開始為這種系統,設計專用的編輯器(Editor)及編譯器(Compiler)。請注意!他設計出來的編譯器,將會是一個標標準準的平行處理程式編譯器,當然與我在本節中討論的觀念完全無關,我們拭目以待。
莫查理先生是設計所有FORTH相關物品的『真高手』,我是『曾低手』,但是『曾低手』經常會向『真高手』仔細學習。仔細搞通『真高手』30幾年前設計的『Tiny BASIC compiler』,『曾低手』就能設計出現在的『ABC FORTH』。

台灣要不要向上發展這種FORTH技術?隨便您。

目前,一分鐘才轉一轉的動態模擬結果,經過144大樓的處理,可能可以處理出每分鐘十萬轉的轉速。
也許您又會問了,轉那麼快要幹什麼?
我則對於回答這種問題,有點不耐煩了。
我告訴您,每分鐘十萬轉,是氣體離心分離機,能夠輕易分離出造原子彈的材料──U235濃縮原料之基本要求轉速。

****************************************************
\ 無言的發展,演進說明都在程式內,有興趣就請自行參考。(2013/11/8)
\ 2013-12-29 加註指令堆疊變化說明,都不用堆疊也應標示。

\ Planetary Gearset
\ 行星齒輪組動態旋轉模擬程式
\ 作者:曾慶潭 於紐西蘭
\ 版權所有,標示版權,便歡迎使用。
\ Copyright 2010-08-08 Ching-Tang Tseng, Hamilton, NZ
\ Permission is granted by the author to use this software for any application
\ provided this copyright notice is preserved.
\ 適用於ABC FORTH V648以後之版本(2013-11-8)

120 VALUE SunR                                   \ (1)太陽齒輪半徑或齒數
  40 VALUE PlanetR                                \ (2)行星齒輪半徑或齒數
  40 VALUE Delay                                   \ (3)畫完停頓時間,以毫秒計

SunR PlanetR 2 * + VALUE RingIR         \ 環形齒輪內半徑或齒數
           RingIR 40 + VALUE RingOR        \ 環形齒輪外半徑

4 3 (MATRIX) XI
4 3 (MATRIX) YI

4 ARRAY R
4 ARRAY W                                             \ 用來暫存轉動之角度位置
4 ARRAY DW                                          \ 每次寸動旋轉步進之角度變量
3 ARRAY Bias                                          \ 三組旋轉標示點固定之偏差角度

\ 簡化同性質多個變數的宣告方式
5 REALS Fpi/180 Ratio XFF YFF PFF

2 INTEGERS I J

\ 固定參數
: Init1 ( -- )
  {{ Fpi/180 = FPI / 180 }}
  {{ Bias ( 1 ) = 0 }} {{ Bias ( 2 ) = 120 }} {{ Bias ( 3 ) = -120 }}
  {{ W ( 1 ) = 0 }} {{ W ( 2 ) = 0 }} {{ W ( 3 ) = 0 }} {{ W ( 4 ) = W ( 3 ) }}
  {{ R ( 1 ) = I>R ( SunR ) }}
  {{ R ( 2 ) = I>R ( SunR ) + I>R ( PlanetR ) }}
  {{ R ( 3 ) = I>R ( RingIR ) }}
  {{ R ( 4 ) = I>R ( RingIR ) + 40 }} ;

\ (4)與齒輪轉速及轉向相關之變數,由設定DW之值來達到目的。
\ 轉向由正負號決定,負值(-)逆時鐘方向旋轉(CCW),正值(+)順時鐘方向旋轉(CW)
\ 轉速由數值之大小來決定,0值不旋轉,值越大,旋轉得越快。
\ 此處預設為練習計算相對旋轉速度之用,亂設定就亂旋轉。
\ 此範例表示沒有固定齒輪,太陽齒輪為主動,其他齒輪為被動,三組均可自由轉動。
: Init2 ( -- )
  {{ DW ( 1 ) = 5  }}
  {{ DW ( 2 ) = R ( 1 ) / ( R ( 1 ) + R ( 3 ) )  }}
  {{ DW ( 3 ) = NEGATE ( R ( 1 ) ) / R ( 3 )  }}
  {{ DW ( 4 ) = DW ( 3 ) }} ;

: Init  ( -- )
  Init1 Init2 ;

: Inch-Along ( -- ) 
BASIC
10 FOR I = 1 TO 4
20 LET { W ( I ) = W ( I ) + DW ( I ) }
30 IF { W ( I ) > 360 } THEN 40
40 GOTO 70
50 LET { W ( I ) = W ( I ) - 360 }
60 GOTO 100
70 IF { W ( I ) < 0 } THEN 80
80 GOTO 100
90 LET { W ( I ) = W ( I ) + 360 }
100 NEXT I
110 END ;

\ ::取代必須連續多次使用之標號與LET,亦即:( :: ) = ( <n> LET )
: XYF>XYI  ( -- )
BASIC
10 FOR I = 1 TO 4
20 FOR J = 1 TO 3
30 LET { PFF = ( W ( I ) + Bias ( J ) ) * Fpi/180 }
    :: { XFF = 250 + R ( I ) * COS ( PFF ) }
    :: XI ( I J ) = INT ( XFF )
    :: { YFF = 250 + R ( I ) * SIN ( PFF ) }
    :: YI ( I J ) = INT ( YFF )
40 NEXT J
50 NEXT I
60 END ;

12 INTEGERS   A1X A2X A3X A1Y A2Y A3Y   B1X B2X B3X B1Y B2Y B3Y
12 INTEGERS   C1X C2X C3X C1Y C2Y C3Y   D1X D2X D3X D1Y D2Y D3Y

: XYI>ABCD[XY] ( -- )
  [[ A1X = XI ( 1 1 ) ]]
  [[ A2X = XI ( 1 2 ) ]]
  [[ A3X = XI ( 1 3 ) ]]
  [[ A1Y = YI ( 1 1 ) ]]
  [[ A2Y = YI ( 1 2 ) ]]
  [[ A3Y = YI ( 1 3 ) ]]

  [[ B1X = XI ( 2 1 ) ]]
  [[ B2X = XI ( 2 2 ) ]]
  [[ B3X = XI ( 2 3 ) ]]
  [[ B1Y = YI ( 2 1 ) ]]
  [[ B2Y = YI ( 2 2 ) ]]
  [[ B3Y = YI ( 2 3 ) ]]

  [[ C1X = XI ( 3 1 ) ]]
  [[ C2X = XI ( 3 2 ) ]]
  [[ C3X = XI ( 3 3 ) ]]
  [[ C1Y = YI ( 3 1 ) ]]
  [[ C2Y = YI ( 3 2 ) ]]
  [[ C3Y = YI ( 3 3 ) ]]

  [[ D1X = XI ( 4 1 ) ]]
  [[ D2X = XI ( 4 2 ) ]]
  [[ D3X = XI ( 4 3 ) ]]
  [[ D1Y = YI ( 4 1 ) ]]
  [[ D2Y = YI ( 4 2 ) ]]
  [[ D3Y = YI ( 4 3 ) ]] ;

\ =>取代必須連續多次使用之標號與RUN,亦即:( => ) = ( <n> RUN )
: ABCD[XY] ( -- )
BASIC
10 RUN Inch-Along
    => XYF>XYI
    => XYI>ABCD[XY]
20 END ;

\ 儲存Mouse的座標位置
2 VALUES XM YM

\ 物件規格式程式起始點,注意!說明敘述不可以直接放在:OBJECT後面。
:OBJECT     SPR-Gears
 <SUPER WINDOW

\ 新開視窗物件之框架宣告程式
:M ON_INIT: ON_INIT: SUPER ;M
:M STARTPOS:  500 100 ;M
:M STARTSIZE: 500 500 ;M
:M WINDOWTITLE: Z" 行星齒輪組動態展示圖 作者:曾慶潭2010-08-08於紐西蘭" ;M
\ :M WINDOWTITLE: Z" Planetary Gearset Author:Chint-Tang Tseng" ;M
:M ON_DONE: ON_DONE: SUPER ;M

   \ 下列程式,等同於是被設計在此一SPR-Gears物件之內的專門類別性(class)指令。
   \ 這種指令只在此物件所屬程式範圍內有效,物件以外的程式不能叫用。

   \ 這個指令用到視窗航舵(Handle of the WiNDow),故必須放在這裡。
   : SaveMouse ( -- )
     HWND GET-MOUSE-XY TO YM TO XM ;

   : 繪出全圖 ( -- )
     A1X A1Y MOVETO: DC
     250 250 LINETO: DC
     A2X A2Y LINETO: DC
     250 250 MOVETO: DC
     A3X A3Y LINETO: DC

     B1X B1Y MOVETO: DC
     B2X B2Y LINETO: DC
     B3X B3Y LINETO: DC
     B1X B1Y LINETO: DC
     B1X B1Y PlanetR CIRCLE: DC
     B2X B2Y PlanetR CIRCLE: DC
     B3X B3Y PlanetR CIRCLE: DC

     C1X C1Y MOVETO: DC
     D1X D1Y LINETO: DC
     C2X C2Y MOVETO: DC
     D2X D2Y LINETO: DC
     C3X C3Y MOVETO: DC
     D3X D3Y LINETO: DC ;

   : 以黑線繪圖 ( -- )
     Black LINECOLOR: DC
     繪出全圖 ;

   : 以白線繪圖 ( -- )
     White LINECOLOR: DC
     繪出全圖 ;

   : 重繪三組被破壞之圓 ( -- )
     250 250 SunR   CIRCLE: DC
     250 250 RingIR CIRCLE: DC
     250 250 RingOR CIRCLE: DC ;

 \ 此一區段內的程式,才是主要執行繪圖的實際程式。
:M ON_PAINT:
   Init
   BEGIN
       \ SaveMouse指令無法以BASIC格式的RUN指令來叫用!!!
       SaveMouse
       ABCD[XY]
       以黑線繪圖
       重繪三組被破壞之圓
       Delay MS
   \ 碰觸鍵盤為正常結束,以滑鼠強行關閉視窗為不正常結束。
   KEY? 0=   
   WHILE
       以白線繪圖
   REPEAT

;M

;OBJECT  \ 物件規格式程式結束點

\ 以下程式供作用來操作滑鼠控制出各種方式之旋轉時使用。
\ 儲存Mouse座標的半徑值
3 REALS XR YR XYR

: Sun-Gear-Fixed ( -- )
  {{ DW ( 1 ) = 0 }} {{ DW ( 2 ) = 1 }}
  {{ DW ( 3 ) = ( R ( 1 ) + R ( 3 ) ) / R ( 3 ) }}
  {{ DW ( 4 ) = DW ( 3 ) }}
  CR ." 行星齒輪架為主動輸入,環形齒輪為被動輸出時,轉速比為: "
  CR ." 1 : " {{ Ratio = ( R ( 1 ) + R ( 3 ) ) / R ( 3 ) }} Ratio F.
  CR ." 環形齒輪為主動輸入,行星齒輪架為被動輸出時,轉速比為: "
  CR ." 1 : " {{ Ratio = R ( 3 ) / ( R ( 1 ) + R ( 3 ) ) }} Ratio F. ;

: Planetary-GearSet-Fixed ( -- )
  {{ DW ( 1 ) = 5 }} {{ DW ( 2 ) = 0 }}
  {{ DW ( 3 ) = NEGATE ( R ( 1 ) / R ( 3 ) ) }}
  {{ DW ( 4 ) = DW ( 3 ) }}
  CR ." 太陽齒輪為主動輸入,環形齒輪為被動輸出時,轉速比為: "
  CR ." 1 : " {{ Ratio = NEGATE ( R ( 1 ) / R ( 3 ) ) }} Ratio F.
  CR ." 環形齒輪為主動輸入,太陽齒輪為被動輸出時,轉速比為: "
  CR ." 1 : " {{ Ratio = NEGATE ( R ( 3 ) / R ( 1 ) ) }} Ratio F. ;

: Ring-Gear-Fixed ( -- )
  {{ DW ( 1 ) = 5 }}
  {{ DW ( 2 ) = R ( 1 ) / ( R ( 1 ) + R ( 3 ) ) }}
  {{ DW ( 3 ) = 0 }} {{ DW ( 4 ) = DW ( 3 ) }}
  CR ." 太陽齒輪為主動輸入,行星齒輪架為被動輸出時,轉速比為: "
  CR ." 1 : " {{ Ratio =  R ( 1 ) / ( R ( 1 ) + R ( 3 ) ) }} Ratio F.
  CR ." 行星齒輪架為主動輸入,太陽齒輪為被動輸出時,轉速比為: "
  CR ." 1 : " {{ Ratio = ( R ( 1 ) +  R ( 3 ) ) / R ( 1 ) }} Ratio F. ;

:NONAME  ( -- )
BASIC
10 LET { XR = I>R ( XM ) - 250  }
    :: { YR = I>R ( YM ) - 250  }
    :: { XYR = SQRT ( ( XR * XR ) + ( YR * YR ) ) }
40 IF { XYR <= R ( 1 ) } THEN 90
50 IF { ( XYR >  R ( 1 ) ) AND ( XYR <  R ( 3 ) ) } THEN 110
60 IF { ( XYR >= R ( 3 ) ) AND ( XYR <= R ( 4 ) ) } THEN 130
70 IF { XYR >  R ( 4 ) } THEN 150
80 GOTO 180
90 RUN Sun-Gear-Fixed
100 GOTO 180
110 RUN Planetary-GearSet-Fixed
120 GOTO 180
130 RUN  Ring-Gear-Fixed
140 GOTO 180
150 FOR I =  1 TO 4
160 LET { DW ( I ) = NEGATE ( DW ( I ) ) }
170 NEXT I
180 END
; SetClickFunc: SPR-Gears

: MAIN ( -- )
  CR ." 太陽齒輪半徑為: " SunR . ." ,行星齒輪半徑為: " PlanetR .
  CR ." 因此,環形齒輪的內半徑為: " RingIR .
     ." ,而行星齒輪架的等效半徑為: "  RingIR SunR + .
  CR START: SPR-Gears  ;

MAIN

\S

\ 執行MAIN,再以滑鼠點選三個齒輪區域後的輸出範例:

太陽齒輪半徑為: 120 ,行星齒輪半徑為: 40
因此,環形齒輪的內半徑為: 200 ,而行星齒輪架的等效半徑為: 320

太陽齒輪為主動輸入,行星齒輪架為被動輸出時,轉速比為:
1 : .375000000000
行星齒輪架為主動輸入,太陽齒輪為被動輸出時,轉速比為:
1 : 2.66666666667
太陽齒輪為主動輸入,環形齒輪為被動輸出時,轉速比為:
1 : -.600000000000
環形齒輪為主動輸入,太陽齒輪為被動輸出時,轉速比為:
1 : -1.66666666667
行星齒輪架為主動輸入,環形齒輪為被動輸出時,轉速比為:
1 : 1.60000000000
環形齒輪為主動輸入,行星齒輪架為被動輸出時,轉速比為:
1 : .625000000000