天天看點

強大好好用的查詢語言 DataQL,首次曝光執行機制

    在杭州站的 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