自定義指令碼引擎開發紀實 -前序
阿新 • • 發佈:2019-01-09
前序
大家可能對JavaScript,VBScript,Python,Lua,Shell等指令碼語言並不陌生,有時候也對Swift語言的特性表現出很大的興趣。大家在樂此不彼的使用這些語言的時候,有沒有想過要自己實現一個指令碼引擎呢?(拜託,自己寫的能跟那些成熟的比嗎?!)話一點錯沒有,不過通過自己一步步實現一個引擎,從中可以學到不少的知識,也能對現在大家使用的編譯器有個旁觀的認識。
為了執行的效能,再加一個指令碼的“彙編器”;跨平臺,給自己的指令碼引擎寫一個虛擬機器,哈哈,也是一種樂趣。
飯呢,要一口一口的吃,事呢要一步一步的做,從簡單到複雜,Let’s go!
首先呢,先給要寫的指令碼引擎一個定位,我們要講的這個,先定義為嵌入式指令碼吧,新增的類庫越來越齊全的時候,“經驗值”就到了要升級的時刻了,那時,就不僅僅只做潛入式的活了。
要實現的指令碼引擎具有的特性
- 數值運算,邏輯運算,字串運算 ,這是基礎
- 弱型別
- 與宿主語言的互動:互相傳遞引數,互相呼叫函式,這也是基礎。
- 支援定義指令碼函式
- 變數作用域:支援全域性變數,區域性變數
- 支援不定引數(變參)
- 支援整數,浮點數,字串;
- 支援多引數,多返回值
- 支援if elseif else, for, foreach, while, switch,goto等指令
- 支援二進位制資料操作
- 支援object,key-value對
- 支援struct,與宿主語言處理結構體
- 支援呼叫framework提供的dll中的函式和第三方dll中提供的函式。備註:暫不支援呼叫類似com匯出介面的函式,因為指令碼不識別標頭檔案,但可以作為指標去獲取值,然後再呼叫c函式處理。
- 方便擴充套件,方便使用者增加自己的函式(比如:c/c++函式)給指令碼呼叫。
- 支援閉包的概念
- 支援對變數讀寫的監控(來自Swift的啟發)
虛擬碼:
func getter()
...
end
func setter(old_value, new_value)
...
end
script.observer("name", {"get"="getter", "set"="setter"})
name="xiaoming" //觸發getter,setter
緣由
需求千變萬化,客戶端發版費時費力,無可奈何,回憶下引擎實現的點滴過程,並作為系列文章,分享給大家。