隨手扎
適合嵌入使用的程式語言 在Raspberry Pi上的編譯紀錄
幾乎所有應用都不可能只使用一個程式語言完成。
忘了是那看過的,現在想想,當時他所說的,或許不只是ABI、與C交互、或是組合語言,像是應用層面的HTML,或是通訊成面的HTTP等,應也可以視為程式語言裡的異語言。既然無可避免,那多少了解一些其他語言也是必須的(不過近期打算更進一步XD),不過我自己初衷很單純是「興趣」(原來是興趣使然的程式語言研究員阿)。
之前曾經找過適合作為嵌入式,嵌入到其他程式語言的腳本語言有哪些。
當然是受到最適合、也是以此為目標設計的Lua影響,但Lua及其簡單,就表達層面上,不適合作為複雜應用。
拿個簡單的例子來說,同為原形設計的物件導向程式語言–EMCAScript後來在ES6也有了class
的語法糖。
總之,Lua很簡單,執行效率也極高,這想點我想是相輔相成的,也沒比要為了語法糖提高其語言解析(parse)的難度。但同樣作為一個圖靈完全(Turing completeness)的程式語言,Lua必然也可以實現複雜應用。
但既然Lua已經幾乎達到其設計目標,那如果需要其他設計方法怎辦,作法之一是使用Python這類膠水語言(glue language,Lua也是),但不管是CPython、CRuby還是Node.js恐怕實現都有些過於「肥大」。繞個路的作法就是使用其他實現,接著帶大伙看看幾個我認為有潛力的語言實現。
嵌入式程式語言
Embeddable Common-Lisp
https://common-lisp.net/project/ecl/
最為最為靈活的程式語言(沒有之一)的Common Lisp,與C語言一樣是先有標準,才有實現。除了著名的開源實現版本SBCL、CCL、ABCL、CMU CL和商業的LispWork、Allegro CL、MOCL,還有一個以標準C寫的 Embeddable Common Lisp(ECL,以及其分之版本MKCL)。
與同樣與C寫成的Lua一樣,有著很強的與C交互的能力。其設計也小而易於值入於其他語言或嵌入式設備,在Raspberry Pi編譯完後,執行檔僅有24 KB,加上標頭檔、而外的自帶的擴展package也才34 MB。
Lua
毫無疑問,若無須DSL,應該是首選,且其本身也有點設計DSL的能力。更重要的是其包含了標頭檔才732KB。(儘管執行檔比ecl更大,來到204KB)
不過相對的,其語言標準函式庫的內容也是極簡。錯誤處理基本是交由宿主語言,當然網路等而外能力也是依賴宿主語言,不過仍可以在Lua Rocks找到其他擃展來使用。
Duktape
JS可能是當今最多人使用的程式語言了。最早出現在瀏覽器內部也算是嵌入式了🐱。伺服器類的實現,除了Node.js其實還不少,其中之一便是同樣目的作為嵌入而開發的Duktape
不過,目前只支援到ES5/ES5.1,和部份ES6之後的功能。而我個人對於ES6的設計比較喜歡,不完全支援(我嘗試class
就失敗)對我而言是些敗筆。此外,文檔不如Lua清晰,建置依賴Python2。(我嘗試使用Python3安裝Python-yml後仍然失敗,然後不想試Python2)。儘管執行檔也只有306 KB,但我沒將其標頭檔、函式庫算入。除非真的很有愛,願意參與開發(JS生態有多少這樣的人🐯),感覺還不如使用Node.js就好。
在Raspberry Pi上的編譯紀錄
其實我第一個想編譯使用的是SBCL,不過該需要使用Lisp編譯(自舉),不巧我的Pi上並沒有(後來是使用Roswell安裝SBCL)。這樣兩次想編譯SBCL的嘗試都算失敗了(忘了第一次想玩是編譯到哪個階段**。
注意!:編譯紀錄是編譯完成後幾天寫的,建議編譯前仍先閱讀readme文件
ecl
./configure --prefix=$HOME
make
make install
在編譯執行過程,也同樣可以看到一些lisp的身影。最後總大小為34 MB,包含thread、sockets、profile等等能力,不過應該還是可以剝離部份無需要的功能使用。
lua
make linux test
make local # or make install
最後大小為732 MB,真的很輕巧,也是編譯最快的一個。要使用自己編譯幾乎毫無負擔。
duktape
make -f Makefile.cmdline
python2 tools/configure.py --output build -DDUK_USE_FASTINT -UDUK_USE_ES6_PROXY #這步我沒有做
執行檔大小只有306 KB。不過由於我試完確定上不支援class
後,第二步驟的執行失敗就沒進一步處理。並不清楚要作為嵌入使用,其lib有多大。(我對參與ecl、lua開發比較有興趣XD)
Node.js
Rapsberry Pi自帶的Node.js有夠舊,不過可能因為我一次編譯太多程式,在編譯Node.js的時候出現記憶體不足。此外,可預估的Node.js體積應該會肥大,我的儲存空間恐怕以不足以負擔。故目前再編譯計畫作罷。(雖然蠻常以寫的…)
※ 以x86-64 linux環境下需要78 MB空間。(欸?這樣我Pi上的空間可能還夠)
整體簡單比較
語言 | 實現 | 執行檔大小 | 整體大小 |
---|---|---|---|
lua | lua | 204 KB | 732 KB |
lisp | ecl | 24 KB | 34 MB |
js | duktape | 306 KB | unknow |
js | node.js | unknow | unknow |
