技术领域
本发明属于数据结构与算法领域,具体涉及了一种由基础类型构成的联合类型的类型合并方法,云原生领域对联合类型拆分与合并后得到最简联合类型的技术。
背景技术
目前云原生领域的流行资源配置语言针对联合类型合并,有一些可选的方案,大致有传统的基于从右向左的覆盖更新原则和基于交集类型的联合类型合并算法。
第一种方案是由Wand提出的,它的实现方式是按照从右向左的顺序合并覆盖数据类型。该方案的优点是思路简单、易于实现,但是大多数情况都存在丢失部分原始数据的情况。下面是资源配置语言JSON的一个典型的数据合并例子,代码文件merge.js:
var arr1={name:["11"],code:["33"]};
var arr2={name:["22",3],code:[true]};
var arr=(JSON.stringify(arr1)+JSON.stringify(arr2)).replace(/}{/,',');
console.log(JSON.parse(arr));
这段代码中,通过JSON.stringify函数将变量arr1和arr2转换为JSON字符串,然后利用字符串拼接+和replace函数,实现联合类型的合并操作,下面是运行过程和结果:
$node merge.js
{name:['22',4],code:[true]}
第二种方案最流行的是带类型的数据描述语言CUE,它是通过引入归一操作(&)来实现联合类型的合并。两个类型a和b的归一表达式为a&b,它是a和b的最小上界,即a&b=glb(a,b)。该方案解决了第一种方案可能丢失部分原始数据类型的弊端,但是它也有几个问题,第一是它不支持两个不存在子类型关系的基本类型进行归一操作;第二是对于越来越复杂的业务场景,多团队协同开发中可能存在的类型冲突问题需要一种更有效的合并规范。下面是一些归一操作的案例,代码文件unify_val.cue:
那么,执行cue eval unify_val.cue将产生下面的结果:
[1,4,<5,{
a:1
}]
下面是一个包含归一错误的代码文件unify_err.cue:
1&2
1&string
它的运行将产生类型错误:
在上述例子中,“1&2”说明不同值合并失败,“1&string”说明值和值类型之外的类型进行合并,产生类型错误。由此可见,CUE中的归一操作&是基于交集类型,来实现联合类型的合并。
发明内容
本发明所要解决的技术问题是针对现有技术中存在的上述缺陷,提供一种由基础类型构成的联合类型的类型合并方法,避免了多团队协同开发中可能存在的数据类型冲突。
本发明的一种由基础类型构成的联合类型的类型合并方法,包括如下步骤:
步骤S1,获取资源配置的源代码文件,明确需要调用合并操作的由基础类型构成的联合类型集合;
步骤S2,根据解析器分析上述源代码文件,获得抽象语法树;
步骤S3,遍历访问抽象语法树上各个节点的信息,如果当前节点调用了联合类型合并函数,确定该目标节点对应的待合并转换规则;;
步骤S4,基于每个节点对应的待合并转换规则,调用相应的转换规则,生成最终的结果类型;
步骤S5,并将源对象的计算结果序列化为YAML配置文件。
可选地,所述根据每个目标节点对应的待合并转换规则,调用相应的转换规则,并得到最终的结果类型,包括:基本类型X和联合类型V
可选地,所述根据基本类型X和联合类型V
可选地,所述根据两个联合类型U
有益效果:本申请提供的由基础类型构成的联合类型的类型合并方法,可以应用于云原生中的微服务,首先获取资源配置信息;根据所述配置信息,确定进行类型合并的数据集合。之后,根据所述的联合类型合并转换规则,合并所述待合并的数据类型,并得到结果类型。最后,按照产生的配置结果,序列化为YAML配置文件。进而避免多个团队协同开发过程中在对数据进行个性化配置时产生类型冲突的可能,简化了用户的资源配置操作的流程。
附图说明
图1是本发明提供的由基础类型构成的联合类型的类型合并方法的流程示意图;
图2是本发明提供的由基础类型构成的联合类型的类型合并方法的规约转换规则库示意图之一;
图3是本发明提供的由基础类型构成的联合类型的类型合并方法的规约转换规则库示意图之二;
具体实施方式
为了使本发明的内容更加清晰易懂,下面结合具体实例和附图对本发明的内容进行详细描述。
在本发明中,利用静态类型规则系统,按照联合类型的类型合并转换规则,得到合并结果类型,使结果类型能够灵活应对不同业务操作数据的冲突,并且在定义变量时无需强制声明实际的类型。
如图1示意性地展示了根据本发明实施例的流程图。流程图示出了本发明的联合类型合并方法以及基于联合类型的类型合并方法的计算配置结果的具体实施例,主要包括下述步骤S1至步骤S4:
步骤S1:按照常规资源配置定义的方式,确定进行类型合并的数据集合;
步骤S2:通过解析器解析资源配置的源代码文件,生成抽象语法树AST;
步骤S3:分析并遍历上述抽象语法树,对抽象语法树进行类型检查,若事先已定义变量的类型,则据此分析变量之间是否存在不同类型的赋值情况,否则,执行类型推导产生静态类型信息;并对抽象语法树进行优化,比如确定每个目标节点对应的待合并转换规则,合并联合类型等,最终编译产生虚拟机可以执行的字节码文件;
步骤S4:执行上述字节码文件,计算对应的配置结果,并将该结果序列化为YAML配置。如图2所示,为由基础类型构成的联合类型的类型合并方法的规约转换规则库之一。举例说明,单类型列表(float)[]和元素类型为(int|string)的列表进行合并,其中,int是float的子类型,则应用规则R3后,得到合并转换后的结果(float|string)[]。
结合图2,遍历图3所示的合并转换规则:(1)检查待合并的联合类型U
举例来说:合并空表和元素类型为(float|bool)的列表,空表相当于U
举例说明,以元素类型为(bool|int)的列表和元素类型为(float|string)的列表作为合并操作数,其中,bool和float之间不存在子类型关系,应用规则M5后,得到的中间结果为bool与(float|string)的合并,继续应用两次规则R4后,得到转换结果(float|
string|bool),最后递归合并int和中间结果(float|string|bool),应用规则M3和M1后,最终获得本次递归的计算结果(float|string|bool)。
需要说明的是,本申请实施例中,上述两个方法附图所示的资源配置合并规则均是以结合本申请实施例中的一个具体示例进行说明的。具体实现时,上述两个方法附图所示的策略配置合并方法还可以结合上述实施例中示意的其他任意规则实现,此处不再赘述。
机译: 多种类型的基础材料构成了这种类型的分隔器,其中设备和经过处理的空盒带标识
机译: 扫描是一种基于标记类型的分类的方法和系统,该标记类型是文档图像中前景像素组的合并组
机译: 具有并入的无源电子构成元件的微加工类型构成元素和制造该微加工类型构成元素的方法