本來想在年假期間再寫點什麼,結果搞到最後一天才送走最後一組來訪的親友...

下次來寫點跟 forth 的 inner interpreter 有關的東西好了

其實上次寫的那一串就有沾到邊了,雖然被我包裝成亂七八糟的樣子了...

話說回來,像 forth 這種應該在博物館或古籍中才有機會看到的東西,這年頭還用傳統工法來介紹也不曉得適不適合,網路上也沒有其他人寫的科普文可以作為方向上的參考... 說到底有多少人看到 forth 這個字會有反應的也很難說XD

目前在圈外流傳最廣的文章大概就是 jonesforth 了吧。如果有其他人看過,不曉得看完後的感想怎樣... 我個人來說是不太推薦一開始就去看那一篇

那種寫作方式對 forth 圈來說算是蠻新潮的,forth 圈內比較有系統性整理過的文件本來就不多,再加上大家自己都搞好幾套 forth,適合一起討論的系統不多,大概就是討論一些設計手法吧,拿到沒有文件的系統是常有的事

我當初找的資料大概也都是來自圖書館,forth dimensions 雜誌和新聞群組 (comp.lang.forth) 裡的討論。不小心神到的一些系統,想研究就是乖乖啃原始碼不然就通靈看看...

前幾天提到 jonesforth 後有點懷念,其實之前也只是隨便翻翻看看而已,想說找個時間再來看一下... 結果隨手一滑就看到一個實作問題XD

其實也不能說他錯,但基本上照著傳統做法來做的話,總是會期待要能滿足一些要求,例如要可以用某些 idiom 來寫程式之類的... 然後 jonesforth 的某部份實作好像會破壞相關的 idiom (沒有實測就是...)

我看到覺得有問題的是這一段

git.annexia.org/?p=jonesforth.

有興趣的人可以猜猜這種做法會導致什麼問題... 猜對沒有獎品但可以得到「老古懂」成就

要理解這個問題,或許至少要求用 forth 實作過稍微完整一點的程式,並實作過控制流程才會比較有感覺... 對,forth 的控制流程是可以自己實作出來的,就跟 lisp 一樣

從基本的分支流程結構 if else then、各種迴圈,甚至各種花式流程結構其實都是用 forth 本身實作出來的。實作內容會跟各家 forth 系統結構有關,沒有標準的實作方式,因此我說 jonesforth 的實作會導致一些限制,但也不能說他的做法是錯的。

而在 word set (可以想成基本積木) 的規劃上雖然也是沒有限制,多半還是會參考有在流通的標準,例如 forth-79/forth-83/ans,也就是我前面提到的「傳統做法」。

一般 forth 提供的控制結構,對於有其他語言經驗的人來說應該會不太習慣。例如基本的分支結構看起來像是:
<cond> if <true-part>
[ else <false-part> ]
then

最後的 then 在某些系統或許會改成 endif,但一般還是 then 比較常見。從程式語言語法設計的角度來理解或許會覺得很詭異,但容我再次強調:forth 不是一般意義的程式語言,也沒有像其他程式語言那樣的語法設計,想套用其他程式語言經驗只是找自己麻煩而已。

真的要從程式語言觀點來看的話,要說最接近的大概就是組合語言了 (不過一堆指令的組合算是程式語言嗎?)。實際上有組合語言經驗的人應該能很直覺理解為什麼 forth 的分支結構長這個樣子。先來看看組合語言版的寫法:
test r0
jz else
true-part
jmp then
else:
false-part
then:

對照著前面提到的 forth 分支結構可以很明顯看到兩種寫法幾乎可以直接轉換對應:(沒辦法畫 table 先將就著看)
;; asm forth
test r0
jz else ;; if
true-part
jmp then ;; else
else:
false-part
then: ;; then

以前有說過 forth 比較像是從組合語言中整理出來的某種 eDSL,大概就是這麼來的。

Follow

老實說... 我真的覺得 forth 是最簡單最單純的開發工具了... 但為什麼要解釋個小問題卻沒辦法幾句話講清楚XD

本來想直接解釋 while,但發現好像會牽涉到 branch,而且對 forth 系統設計不熟的話可能會抓不到重點,只好從基礎一點的轉換開始說明。

我已經開始在思考要先來打電動還是繼續把這串寫完...

Sign in to participate in the conversation
Pawoo

The social network of the future: No ads, no corporate surveillance, ethical design, and decentralization! Own your data with Mastodon!