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