强大好好用的查询语言 DataQL,首次曝光执行机制


声明:本文转载自https://my.oschina.net/u/1166271/blog/1329819,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

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

    更多曝光,敬请期待。

本文发表于2017年07月11日 12:37
(c)注:本文转载自https://my.oschina.net/u/1166271/blog/1329819,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 3110 讨论 0 喜欢 0

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

这世界真好,吃野东西也要留出这条命来看看

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1