1. 程式人生 > >自定義指令碼引擎開發紀實 -前序

自定義指令碼引擎開發紀實 -前序

前序

大家可能對JavaScript,VBScript,Python,Lua,Shell等指令碼語言並不陌生,有時候也對Swift語言的特性表現出很大的興趣。大家在樂此不彼的使用這些語言的時候,有沒有想過要自己實現一個指令碼引擎呢?(拜託,自己寫的能跟那些成熟的比嗎?!)話一點錯沒有,不過通過自己一步步實現一個引擎,從中可以學到不少的知識,也能對現在大家使用的編譯器有個旁觀的認識。
為了執行的效能,再加一個指令碼的“彙編器”;跨平臺,給自己的指令碼引擎寫一個虛擬機器,哈哈,也是一種樂趣。

飯呢,要一口一口的吃,事呢要一步一步的做,從簡單到複雜,Let’s go!

首先呢,先給要寫的指令碼引擎一個定位,我們要講的這個,先定義為嵌入式指令碼吧,新增的類庫越來越齊全的時候,“經驗值”就到了要升級的時刻了,那時,就不僅僅只做潛入式的活了。

要實現的指令碼引擎具有的特性

  1. 數值運算,邏輯運算,字串運算 ,這是基礎
  2. 弱型別
  3. 與宿主語言的互動:互相傳遞引數,互相呼叫函式,這也是基礎。
  4. 支援定義指令碼函式
  5. 變數作用域:支援全域性變數,區域性變數
  6. 支援不定引數(變參
  7. 支援整數,浮點數,字串
  8. 支援多引數,多返回值
  9. 支援if elseif else, for, foreach, while, switchgoto等指令
  10. 支援二進位制資料操作
  11. 支援object,key-value對
  12. 支援struct,與宿主語言處理結構體
  13. 支援呼叫framework提供的dll中的函式和第三方dll中提供的函式。備註:暫不支援呼叫類似com匯出介面的函式,因為指令碼不識別標頭檔案,但可以作為指標去獲取值,然後再呼叫c函式處理。
  14. 方便擴充套件,方便使用者增加自己的函式(比如:c/c++函式)給指令碼呼叫。
  15. 支援閉包的概念
  16. 支援對變數讀寫的監控(來自Swift的啟發)
    虛擬碼:
func getter()
...
end
func setter(old_value, new_value)
...
end
script.observer("name", {"get"="getter", "set"="setter"})
name="xiaoming" //觸發getter,setter

緣由

需求千變萬化,客戶端發版費時費力,無可奈何,回憶下引擎實現的點滴過程,並作為系列文章,分享給大家。