直譯器(Interpreter)在電腦語言上的應用已超過編譯器,但MCU工程師卻沒什麼在用。
主因在於RAM空間不足難以放入實際應用。
MCU大部分應用的RAM都是受限的。它是稀缺資源,而正統語言編譯都是用RAM很多的,二者互斥下,難有發展。
但就算是簡單直譯器,在MCU的應用中,都是很好用的方案,對於動態的事件及實務實驗有很大的幫助。
再來就是個人實務上所使用的及評估的。
終端命令直譯器
用xprintf函式很容易做。也可以轉成各式通信。再加上xmodem傳輸,可以將PC檔案直接對應到MCU內部可以管理的裝置上。
在MCU使用外部儲存上會很好用,不管是用SPI Flash或是SD卡,會很好驗證MCU的工作環境遇什麼。
有時還會看到客戶在操機器,有次從MCU讀回來的log檔中,看到客戶在做開機穩定性測試,它上電一分鐘後斷電,再一分鐘後再次上電,好在STM32有內建RTC,所以時間錄得一清二楚。問題是這種log不是一二筆,而是一整天,所以才會認為客戶在測試。
簡單語言實現
這個要用到的RAM就比較大,對於加工機器來說,常會遇到CNC指令或是其他簡單語言。大部分是用手寫程式做解析,但傳久了,往往也不符合時代(使用者會想要加自己的指令),此時就可以用到compiler-compiler,它可以吃語法解析,免去人工解析及維護的痛苦。
常用的就是flex, bison的組合,使用的RAM還可以控制。
編程於Flash?
前面都是工作做完就結束,沒有程序控制所以無需做編程。但要實現真的語言就有編程再調用,但編程後要存在那,MCU的RAM是有限的,比較沒有問題就是Flash,有無可能在執行後再加程式於flash ROM上,覺得有機會,但實在不想自造語言,光是找可以改的就找了很久。
Forth改造於Flash ROM編程
Forth語言的編程動作很像C巨集。C巨集主要是文字取代,就是找到指定的字,就進入巨集定義。若是遇到巨集定義字,就進行巨集取代。Forth有點不一樣的地方在巨集定義時以函式指標做編程,巨集取代則改成函式指標執行。
它沒有傳統的compile行為,且大部分是單次寫回,所以改成寫入flash是有機會的,因為flash ROM也可以一小筆一小筆寫回。
但要去改forth編程,將原先bit flag write以flash ROM寫回單位取代。不過有小部分功能也有問題,但是用在高階定義上,先不管,了不起變成子集語言。這樣修改後,可以成功,真的可以在未用的flash ROM上添加新的函式。但再來的問題就卡住,以致無法公開。
因為MCU界面受限,只能用串列通信來做,所以PC端一定有終端機,我在上面試用中文做為函式名,它以Big5為編碼(2 byte編碼),程式本體是函式指標這個沒有問題。但用手機終端機連上,發現它丟的是unicode(3 byte編碼),平台問題卡到,暫時先放著了。
MCU可用小型語言
RAM若是更大到1MB(STM32H7系列就有)那就可以放入一般用的小型語言。eLua是最早移入MCU的高階語言,所以lua早就鎖定很久了。但高階語言移入MCU不是沒有優勢,它可以實現從網路直接載入函式庫,就是網路函式庫可以直通MCU,這功能最早實現的就是microPython,也因為網路函式庫直通MCU,使得microPython大為流行。所以傳統MCU工程師一直看不起的直譯器,經由網路函式庫直接對應,改變的MCU直譯器的使用觀感。