标签为“EMCAScript”的页面如下
適合嵌入使用的程式語言 在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恐怕實現都有些過於「肥大」。繞個路的作法就是使用其他實現,接著帶大伙看看幾個我認為有潛力的語言實現。
嵌入式程式語言
什麼是IIFE(Immediately Invoked Function Expression)
前言
這原本我是在Facebok一篇貼文的回應,因為覺得還蠻清楚的,所以修改過來這裡紀錄一下。(當然也可能我有理解錯誤就是)
什麼是IIFE
根據MDN是這樣寫的:
It is a “design pattern” which is also known as a Self-Executing Anonymous Function
(他又稱為 Self-Executing Anonymous Function,也是一種常見的"設計模式”)
注意 設計模式(design pattern)
這不是特指某一種技術、特性。而是思想、設計。竟然是想法,實現有差異、認知有差異可以理解的。
所以按照中文定義( 定義完馬上就執行 ),淺層廣義的來看:
function f(){};
f();
確實也是定義後執行
撰寫風格上OK,只是益處不大。
(f = function(){})() // execute first
f() // execute second
也是一樣。(這再js是合法的,之後還可以在執行f()
)
但就語法上就更精簡許多
從狹義、技術來看,是看是不是有附值(函式命名也是),然後才執行。 如此剛題的兩個,都是命名後才執行,狹義不算是IIFE 不過這終究只是一種設計模式,實現方式沒有一定。
function f(){};
f();
如果上面的形式,編譯器可以做優化,而直接忽略f
,那他也可能是狹義的定義。
(另外這裡廣義、狹義只是我片面的解讀)
此外,在維基百科這麼寫到:
“立即呼叫函式表達式” 最早稱為「自執行(匿名)函式」 但是立即執行的函式不一定是匿名的。 ECMAScript 5的 strict mode 禁止arguments.callee 因此,這個術語不夠準確。
這或許也側面證明我的想法。
【微更】你可能沒看過得Python - Callable(續)
【微更】Callable的實現
之前我實現了Callable Class,當時對於CallableWrapper
的實現如下:
class CallableWrapper:
def __init__(self, wrap):
self.wrap = wrap
def __call__(self, f=None, *args):
if f == None:
return self.wrap
return CallableWrapper(f(self.wrap, *args))
這個實現有一些缺憾,CallableWrapper
的__call__
回傳值,也是CallableWrapper
。而CallableWrapper
本身預期被呼叫,這導致結果不能直接使用,需要多給一次空呼叫(result()
)。舉例來說:
arr = CallableWrapper([1,2,3,4,5,6,])
arr # => <__main__.CallableWrapper object at 0x7f2102f00668>
# arr(sum) + 10 # You can't do this, because CallableWrapper can't add integer
arr(sum)() + 10
上例中,並不能直接寫arr(sum) + 10
,要寫arr(sum)() + 10
。這感覺有點脫褲子放屁阿…
基於此想法,我改寫成: