在杭州站的 OSC 杭州站原創會上。首次給大家介紹的 DataQL,目前給大家曝光一些新的消息。
Hasor - DataQL,是一個新的服務查詢語言。它比 GraphQL 更強大更好用,更貼近開發者。本次曝光的内容是 DataQL的編譯機制。
新的 DataQL 抛棄了第一版中解釋執行,開始擁抱編譯執行。同時加入一些新特性,下面讓我們先看一下一個簡單的 QL 查詢被編譯成什麼樣的。
為了友善閱讀,首先放上。曝光版的 DataQL 指令集助記符:
NO // new Object
NA // new Array
LDC_D // 數字(例:INSN_D 1234)
LDC_B // 布爾(例:INSN_B true)
LDC_S // 字元串
LDC_N // Null(例:INSN_N)
LOAD // 從本地變量表加載(例:LOAD,1)
STORE // 存儲到本地變量表(例:STORE,2)
ASM // 結果作為對象(例:ASA,"type")
ASO // 結果作為原始對象(例:ASO)
ASA // 結果作為數組(例:ASA,"type")
ASE // 結果結束(例:ASA)
PUT // 加到對象結果集中(例:PUT,"xxxx")
PUSH // 加到 Array 結果集中(例:PUSH)
ROU // 尋值(例:ROU,"xxxxx")
UO // 一進制運算
DO // 二進制運算
CALL // 發起服務調用(例:CALL,"xxxxx",2)
LCALL // 執行函數指針調用(例:LCALL,2)
METHOD // 函數定義
M_REF // 函數引用
IF // if(條件判斷失敗,執行GOTO,否則執行下一條指令)
GOTO // 執行跳轉
END // 結束指令序列并傳回值
ERR // 結束指令序列并抛出異常
OPT // 環境配置
LINE // 行号
LABEL // 協助GOTO定位用,無實際作用
LOCAL // 用在 LAMBDA 指令後面,用來标明變量名稱。
假定有下面這個簡單的服務查詢。根據代碼,我們用 DataQL 自定義了一個 foo 函數,另外一個 abs 函數由使用者通過接口實作交給 DataQL 管理。執行這個查詢的含義是:
如果 1 > 2 那麼,整個查詢傳回 abs(123) + (arg1 + arg2) 的結果。否則傳回 abs(123) + (arg1 + arg3),根據代碼,我們知道 arg1 = 1 ,arg2 = 2。 arg3 沒有定義,沒喲定義的值将會由使用者以參數形式傳給查詢。
var a = true;
var a = false;
var foo = lambda : (arg1,arg2) -> {
if (arg1 > arg2)
return arg1 + arg3;
else
return arg2 + arg3;
end
};
return abs(123)~ + foo(1,2)~
對應這個查詢的 查詢指令序列為,其中[0]為入口函數,它類似我們的 main 方法,而 [1] 則是我們上面DataQL 中定義的 foo 函數。在 [0] 13行位置,通過 LCALL 指令調用了我們的 foo 函數。
[0]
#00 LDC_B true
#01 STORE 0
#02 LDC_B false
#03 STORE 0
#04 M_REF 1, 2
#05 STORE 1
#06 LDC_D 123
#07 CALL abs, 1
#08 ASO
#09 ASE
#10 LDC_D 1
#11 LDC_D 2
#12 LOAD 1
#13 LCALL 2
#14 ASO
#15 ASE
#16 DO +
#17 END
[1]
#00 METHOD 2
#01 LOCAL 0, arg1
#02 LOCAL 1, arg2
#03 LABEL 3
#04 LOAD 0
#05 LOAD 1
#06 DO >
#07 IF 13
#08 LOAD 0
#09 ROU arg3
#10 DO +
#11 END
#12 GOTO 19
#13 LABEL 13
#14 LOAD 1
#15 ROU arg3
#16 DO +
#17 END
#18 GOTO 19
#19 LABEL 19
更多曝光,敬請期待。
版權聲明:本文為CSDN部落客「weixin_34357887」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。
原文連結:https://blog.csdn.net/weixin_34357887/article/details/91859388