2018年12月13日 星期四

如何在Flash ROM上實現直譯語言2: 規劃及找材料

MCU上實現一個語言,在8位元時代就有,8051 Forth是我第一個看到的作品。
全部組合語言寫出來,以機器碼寫回。但有條件,RAM也是Code space,這個要在硬體上動手腳。
有興趣的人可以看一下CamelForth51,因為實用性不好,程式碼看了沒在用。

不過CamelForth的作者有另一個作品MSP430 Forth,它可以寫回Flash,無需佔用RAM做程式儲存。
可惜沒有用到大一點的MSP430,沒有機會用,也沒有機會看原始碼。但粗看和8051一樣用組合語言寫的。

二個Forth看完原始碼,皆打破我對Compile的觀念,原來字彙分析就可以集成語言。但它有一些基本模型在。
像是雙堆疊,有一個資料堆以及一個返迴堆。一般語言像C,只有一個堆疊,資料及返迴一起堆進Stack。
這個相當"硬體"的設計。
另外一個是直譯,沒有main函式。輸入字全部都可以執行。

再來是32位元時代,Forth仍用組合語言寫出來,這個完全沒有引起我的興趣。
因為這個時代,原廠都是給C函式庫,像USB如此複雜的裝置,要用別的語言再寫一次,那有時間?
要用,也用C寫的,但eLua有點大,它可以拆分將VM放入MCU內。用起來還是有點麻煩。

然後找到STM32Forth,看來可以了。且證明可以完全在Flash ROM上作業。不過它也有點問題。
加功能進去不是很容易,因為C的語法限制,不像組合語言一樣好寫,維護肯定不好用。先放著。

再來有一天找到LBForth,一看就是我要的。它有幾個特性:
  1. 它不使用機器碼,改用OP Code為基本單元。這個可以避免執行平台問題。
       2. 指令實現的C Source Code是集成的,不是分散的,這個易維護。但看來是動用到一些巨集技巧。

不過它在X86上執行,且為區域變數空間上。要在STM32上執行仍要改,順便修改時看看它是如何實作一個Forth。



沒有留言:

張貼留言