天天看点

强大好好用的查询语言 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