在杭州站的 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
更多曝光,敬请期待。