一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

操作信息生成方法、装置、电子设备及存储介质与流程

2022-02-20 00:50:24 来源:中国专利 TAG:


1.本公开涉及互联网技术领域,尤其涉及一种操作信息生成方法、装置、电子设备及存储介质。


背景技术:

2.自动引用计数(automatic reference counting,arc)是编程语言中自动管理内存的一种技术,核心思想是编译器通过给每个堆对象关联一个引用计数,当堆对象被引用的时候,引用计数自动加1,当堆对象被解除引用的时候,引用计数自动减1。但如果引用计数频繁更新,会对程序的整体性能造成影响。
3.相关技术中采用延迟引用技术的方案,即忽略栈上指针的引用计数操作,只有当指针写入到堆中对象的时候才调整其引用对象的引用计数,减少栈上指针引用的频繁变化,从而减少频繁的arc操作,优化程序的性能。但延迟引用计数的操作,使得对象的引用计数不准确,导致垃圾内存不能得到及时的回收,系统资源消耗较大;此外,为了正确回收垃圾内存,相关技术还需要对栈上指针进行扫描,导致程序最大暂停时间延长,进而降低程序的吞吐量。


技术实现要素:

4.本公开提供一种操作信息生成方法、装置、电子设备及存储介质,以至少解决相关技术中在减少栈上指针频繁变化而导致的arc操作的过程中,系统资源消耗较大,程序吞吐量较低的问题。本公开的技术方案如下:
5.根据本公开实施例的第一方面,提供一种操作信息生成方法,包括:
6.获取源程序以及所述源程序中存在赋值关系的多个目标栈指针变量;
7.获取所述多个目标栈指针变量的属性信息;
8.在所述多个目标栈指针变量的属性信息为借用属性的情况下,拒绝生成引用计数操作信息;所述借用属性用于指示在所述多个目标栈指针变量相互赋值过程中,拒绝更新所述多个目标栈指针变量所引用的堆对象的引用计数。
9.在一示例性的实施方式中,所述方法还包括:
10.在所述多个目标栈指针变量的属性信息为普通属性的情况下,生成所述引用计数操作信息;所述普通属性用于指示在所述赋值过程中,更新所述引用计数。
11.在一示例性的实施方式中,所述方法还包括标注所述借用属性和所述普通属性,所述标注所述借用属性和所述普通属性包括:
12.获取所述源程序中的待处理函数,所述待处理函数包括多个指针变量;
13.根据所述多个指针变量,以及所述多个指针变量之间的赋值关系,构建所述待处理函数对应的第一有向图;所述第一有向图的顶点表征所述指针变量,所述第一有向图的边表征任意两个指针变量之间的赋值关系;
14.标注所述多个指针变量中的栈指针变量的属性信息为所述普通属性;
15.根据所述多个指针变量中的栈指针变量所对应的顶点,在所述第一有向图中的位置,以及所述栈指针变量的作用域,从所述栈指针变量中确定出候选栈指针变量,所述候选栈指针变量包括所述多个目标栈指针变量;
16.将所述候选栈指针变量的属性信息由所述普通属性更新为所述借用属性。
17.在一示例性的实施方式中,所述根据所述多个指针变量,以及所述多个指针变量之间的赋值关系,构建所述待处理函数对应的第一有向图,包括:
18.生成每个指针变量对应的顶点;
19.根据任意两个指针变量之间的赋值关系,确定所述任意两个指针变量中的赋值变量和被赋值变量,所述被赋值变量用于接受所述赋值变量所赋予的值;
20.创建由所述被赋值变量对应的顶点指向所述赋值变量对应的顶点的有向边;
21.根据所述顶点和所述有向边,生成所述第一有向图。
22.在一示例性的实施方式中,所述顶点存储所述顶点所表征的指针变量的变量类型和作用域等级,所述根据所述多个指针变量中的栈指针变量所对应的顶点,在所述第一有向图中的位置,以及所述栈指针变量的作用域,从所述栈指针变量中确定出候选栈指针变量,包括:
23.根据所述多个指针变量各自对应的顶点所存储的变量类型,从多个指针变量中获取变量类型为栈上指针类型的预设数量个栈指针变量;
24.依次遍历每一栈指针变量,并在遍历每一栈指针变量时,执行以下操作;
25.在所述第一有向图中的第一路径上不存在第一目标顶点,且所述第一有向图中不存在第二路径的情况下,确定每一栈指针变量为所述候选栈指针变量;
26.其中,所述第一路径为所述第一有向图中,从每一栈指针变量对应的顶点出发所能够到达的路径,所述第二路径为所述第一有向图中,从第二目标顶点出发到达每一指针变量对应的顶点的路径,所述第一目标顶点表征作用域等级小于每一栈指针变量的作用域等级的指针变量所对应的顶点,所述第二目标顶点表征作用域等级大于每一指针变量的作用域等级的指针变量所对应的顶点。
27.在一示例性的实施方式中,所述待处理函数的数量为多个,所述方法还包括:
28.基于多个待处理函数之间的调用关系,生成所述多个待处理函数对应的第二有向图;所述第二有向图中的顶点表征所述待处理函数,所述第二有向图中的边表征任意两个待处理函数之间的调用关系;
29.基于预设深度优先搜索算法对所述第二有向图进行深度优先遍历,基于遍历结果从所述多个待处理函数中确定出预设数量个目标函数,所述预设数量个目标函数表征所述第二有向图中的强连通分量;
30.在所述预设数量个目标函数之间不存在递归调用的情况下,根据所述预设数量个目标函数之间的调用先后顺序,对所述预设数量个目标函数进行逆序排序,得到第一函数序列;
31.根据所述第一函数序列中的每个函数在所述第一函数序列中的排序、所述第一函数序列中的每个函数中的多个指针变量,以及所述第一函数序列中的每个函数中的多个指针变量之间的赋值关系,依次构建所述第一函数序列中的每个函数对应的第一有向图。
32.在一示例性的实施方式中,所述方法还包括:
33.在所述预设数量个目标函数之间存在所述递归调用的情况下,获取递归调用函数,所述递归调用函数包括多个相互之间存在所述递归调用的目标函数;
34.根据所述归调用函数和其他函数之间的调用先后顺序,对所述递归调用函数和所述其他函数进行逆序排序,得到第二函数序列,所述其他函数表征所述预设数量个目标函数中,除所述递归调用函数之外的函数;
35.根据所述第二函数序列中的每个函数在所述第二函数序列中的排序、所述第二函数序列中的每个函数中的多个指针变量,以及所述第二函数序列中的每个函数中的多个指针变量之间的赋值关系,依次构建所述第二函数序列中的每个函数对应的第一有向图。
36.在一示例性的实施方式中,所述方法还包括:
37.运行由所述源程序编译得到的目标程序,所述目标程序包括多个操作信息,所述多个操作信息包括所述引用计数操作信息;
38.在执行所述引用计数操作信息的情况下,更新所述引用计数。
39.根据本公开实施例的第二方面,提供一种操作信息生成装置,包括:
40.第一获取模块,被配置为执行获取源程序以及所述源程序中存在赋值关系的多个目标栈指针变量;
41.第二获取模块,被配置为执行获取所述多个目标栈指针变量的属性信息;
42.第一生成模块,被配置为执行在所述多个目标栈指针变量的属性信息为借用属性的情况下,拒绝生成引用计数操作信息;所述借用属性用于指示在所述多个目标栈指针变量相互赋值过程中,拒绝更新所述多个目标栈指针变量所引用的堆对象的引用计数。
43.在一示例性的实施方式中,所述装置还包括:
44.第二生成模块,被配置为执行在所述多个目标栈指针变量的属性信息为普通属性的情况下,生成所述引用计数操作信息;所述普通属性用于指示在所述赋值过程中,更新所述引用计数。
45.在一示例性的实施方式中,所述装置还包括标注所述借用属性和所述普通属性的标注模块,所述标注模块包括:
46.待处理函数获取单元,被配置为执行获取所述源程序中的待处理函数,所述待处理函数包括多个指针变量;
47.第一有向图构建单元,被配置为执行根据所述多个指针变量,以及所述多个指针变量之间的赋值关系,构建所述待处理函数对应的第一有向图;所述第一有向图的顶点表征所述指针变量,所述第一有向图的边表征任意两个指针变量之间的赋值关系;
48.标注单元,被配置为执行标注所述多个指针变量中的栈指针变量的属性信息为所述普通属性;
49.候选栈指针变量确定单元,被配置为执行根据所述多个指针变量中的栈指针变量所对应的顶点,在所述第一有向图中的位置,以及所述栈指针变量的作用域,从所述栈指针变量中确定出候选栈指针变量,所述候选栈指针变量包括所述多个目标栈指针变量;
50.属性更新单元,被配置为执行将所述候选栈指针变量的属性信息由所述普通属性更新为所述借用属性。
51.在一示例性的实施方式中,所述第一有向图构建单元,包括:
52.顶点确定子单元,被配置为执行生成每个指针变量对应的顶点;
53.赋值变量确定子单元,被配置为执行根据任意两个指针变量之间的赋值关系,确定所述任意两个指针变量中的赋值变量和被赋值变量,所述被赋值变量用于接受所述赋值变量所赋予的值;
54.有向边确定子单元,被配置为执行创建由所述被赋值变量对应的顶点指向所述赋值变量对应的顶点的有向边;
55.生成子单元,被配置为执行根据所述顶点和所述有向边,生成所述第一有向图。
56.在一示例性的实施方式中,所述顶点存储所述顶点所表征的指针变量的变量类型和作用域等级,所述候选栈指针变量确定单元,包括:
57.栈指针变量确定子单元,被配置为执行根据所述多个指针变量各自对应的顶点所存储的变量类型,从多个指针变量中获取变量类型为栈上指针类型的预设数量个栈指针变量;
58.遍历子单元,被配置为执行依次遍历每一栈指针变量,并在遍历每一栈指针变量时,执行以下操作;
59.候选栈指针变量确定子单元,被配置为执行在所述第一有向图中的第一路径上不存在第一目标顶点,且所述第一有向图中不存在第二路径的情况下,确定每一栈指针变量为所述候选栈指针变量;其中,所述第一路径为所述第一有向图中,从每一栈指针变量对应的顶点出发所能够到达的路径,所述第二路径为所述第一有向图中,从第二目标顶点出发到达每一指针变量对应的顶点的路径,所述第一目标顶点表征作用域等级小于每一栈指针变量的作用域等级的指针变量所对应的顶点,所述第二目标顶点表征作用域等级大于每一指针变量的作用域等级的指针变量所对应的顶点。
60.在一示例性的实施方式中,所述待处理函数的数量为多个,所述装置还包括:
61.第二有向图生成模块,被配置为执行基于多个待处理函数之间的调用关系,生成所述多个待处理函数对应的第二有向图;所述第二有向图中的顶点表征所述待处理函数,所述第二有向图中的边表征任意两个待处理函数之间的调用关系;
62.目标函数确定模块,被配置为执行基于预设深度优先搜索算法对所述第二有向图进行深度优先遍历,基于遍历结果从所述多个待处理函数中确定出预设数量个目标函数,所述预设数量个目标函数表征所述第二有向图中的强连通分量;
63.第一函数序列确定模块,被配置为执行在所述预设数量个目标函数之间不存在递归调用的情况下,根据所述预设数量个目标函数之间的调用先后顺序,对所述预设数量个目标函数进行逆序排序,得到第一函数序列;
64.第一构建模块,被配置为执行根据所述第一函数序列中的每个函数在所述第一函数序列中的排序、所述第一函数序列中的每个函数中的多个指针变量,以及所述第一函数序列中的每个函数中的多个指针变量之间的赋值关系,依次构建所述第一函数序列中的每个函数对应的第一有向图。
65.在一示例性的实施方式中,所述装置还包括:
66.递归调用函数获取模块,被配置为执行在所述预设数量个目标函数之间存在所述递归调用的情况下,获取递归调用函数,所述递归调用函数包括多个相互之间存在所述递归调用的目标函数;
67.第二函数序列确定模块,被配置为执行根据所述归调用函数和其他函数之间的调
用先后顺序,对所述递归调用函数和所述其他函数进行逆序排序,得到第二函数序列,所述其他函数表征所述预设数量个目标函数中,除所述递归调用函数之外的函数;
68.第二构建模块,被配置为执行根据所述第二函数序列中的每个函数在所述第二函数序列中的排序、所述第二函数序列中的每个函数中的多个指针变量,以及所述第二函数序列中的每个函数中的多个指针变量之间的赋值关系,依次构建所述第二函数序列中的每个函数对应的第一有向图。
69.在一示例性的实施方式中,所述装置还包括:
70.运行模块,被配置为执行运行由所述源程序编译得到的目标程序,所述目标程序包括多个操作信息,所述多个操作信息包括所述引用计数操作信息;
71.更新模块,被配置为执行在执行所述引用计数操作信息的情况下,更新所述引用计数。
72.根据本公开实施例的第三方面,提供一种电子设备,包括:
73.处理器;
74.用于存储所述处理器可执行指令的存储器;其中,所述处理器被配置为执行所述指令,以实现如上述所述的操作信息生成方法。
75.根据本公开实施例的第四方面,提供一种计算机可读存储介质,当所述计算机可读存储介质中的指令由电子设备的处理器执行时,使得电子设备执行如上述所述的操作信息生成方法。
76.根据本公开实施例的第五方面,提供一种计算机程序产品,包括计算机程,所述计算机程序被处理器执行时实现上述所述的操作信息生成方法。
77.本公开的实施例提供的技术方案至少带来以下有益效果:
78.本公开实施例中在源程序的编译期预先对栈指针变量标注了两种不同的属性(普通属性和借用属性),在确定多个目标栈指针变量的属性信息为借用属性的情况下,拒绝生成引用计数操作信息,从而在编译期减少了引用计数操作信息的生成数量,优化了不必要的arc操作,避免由源程序所编译得到的目标程序运行过程中的引用计数频繁更新,对目标程序的运行造成额外的负担,从而降低资源消耗,提高目标程序吞吐量。
79.应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本公开。
附图说明
80.此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本公开的实施例,并与说明书一起用于解释本公开的原理,并不构成对本公开的不当限定。
81.图1是根据一示例性实施例示出的一种操作信息生成方法的流程图。
82.图2是根据一示例性实施例示出的一种标注借用属性和普通属性的流程图。
83.图3是根据一示例性实施例示出的一种通过赋值关系创建第一有向图的中的边的示意图。
84.图4是根据一示例性实施例示出的一种构建第一有向图的流程图一。
85.图5是根据一示例性实施例示出的一种从栈指针变量中确定出候选栈指针变量的流程图。
86.图6是根据一示例性实施例示出的一种构建第一有向图的流程图二。
87.图7是根据一示例性实施例示出的一种预设数量个目标函数之间存在递归调用的示意图。
88.图8是根据一示例性实施例示出的一种操作信息生成装置框图。
89.图9是根据一示例性实施例示出的一种用于操作信息生成的电子设备的框图。
具体实施方式
90.为了使本领域普通人员更好地理解本公开的技术方案,下面将结合附图,对本公开实施例中的技术方案进行清楚、完整地描述。
91.需要说明的是,本公开的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本公开的实施例能够以除了在这里图示或描述的那些以外的顺序实施。以下示例性实施例中所描述的实施方式并不代表与本公开相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本公开的一些方面相一致的装置和方法的例子。
92.首先,对本公开实施例所涉及的技术术语进行说明:
93.栈:指的是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。在计算机系统中,栈是一个具有以上属性的动态内存区域,程序可以将数据压入栈中,也可以将数据从栈顶弹出。栈在程序的运行中保存了一个函数调用时所需要的维护信息,即堆栈帧或者活动记录。堆栈帧一般包含函数的返回地址和参数,以及临时变量(包括函数的非静态局部变量以及编译器自动生成的其他临时变量)。
94.堆:指的是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象,堆满足下列性质:堆中某个结点的值不大于或不小于其父结点的值以及堆是一棵完全二叉树。堆中存储的是数组和对象。
95.堆对象:指的是在程序运行过程中可以随时建立或删除的对象。
96.指针:指的是单元的地址,该单元的内容里面存放的是数据。在c语言中,指针一般被认为是指针变量,指针变量的内容存储的是其指向的对象的首地址,指向的对象可以是变量(指针变量也是变量),数组,函数等占据存储空间的实体。
97.指针变量:是存放一个内存地址的变量,不同于其他类型变量,它是专门用来存放内存地址的,也称为地址变量。在c语言中,允许用指针变量来存放指针,因此,一个指针变量的值就是某个内存单元的地址或称为某内存单元的指针。
98.作用域:指的是变量的可用性范围。通常来说,一段程序代码中所用到的名字并不总是有效可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域。作用域的使用,可提高程序逻辑的局部性,增强程序的可靠性,减少名字冲突。从作用域角度区分,变量可分为全局变量和局部变量。
99.作用域等级的大小定义:如果a变量的生命周期大于b变量的生命周期,或者a变量的可见性范围大于b变量的可见性范围,则a的作用域等级大于b的作用域。
100.图1是根据一示例性实施例示出的一种操作信息生成方法的流程图。如图1所示,该包括以下步骤。
101.在步骤s11中,获取源程序以及上述源程序中存在赋值关系的多个目标栈指针变量。
102.具体地,源代码(也称源代码)是指未编译的按照一定的程序设计语言规范书写的文本文件,是一系列人类可读的计算机语言指令。
103.示例性地,可以对源程序进行词法分析、语法分析、语义分析、类型检查,确定源程序中的变量和表达式的类型。
104.可选地,源程序中的变量可以包括指针变量和非指针变量。
105.具体地,栈指针变量指的是栈上指针变量,即存在与栈上的指针变量。
106.可选地,上述赋值关系可以包括显示存在的赋值关系和隐式存在的赋值关系。
107.示例性地,显示存在的赋值关系如下:比如:a=b,变量b赋值给变量a。该显示存在的赋值关系表征的是实际参数(实参),实参包含了实实在在的数据,会被函数内部的代码使用。
108.示例性地,隐式存在的赋值关系如下:比如,调用函数时传递形式参数(形参)的值。形参可以看作是一个占位符,它没有数据,只能等到函数被调用时接收传递进来的数据。
109.具体地,在上述步骤s11中,可以根据上述显示存在的赋值关系和隐式存在的赋值关系,从源程序中的多个指针变量中获取存在赋值关系的多个目标栈指针变量。
110.在步骤s13中,获取上述多个目标栈指针变量的属性信息。
111.具体地,目标栈指针变量的属性信息(借用属性或普通属性)是预先标注好的。
112.在一个示例性的实施例中,上述操作信息生成方法可以用于如下场景:如果栈上指针变量(即栈指针变量)在其作用域范围内,没有通过直接或间接赋值的方式传递给更高作用域范围内的指针变量,即不会扩大引用堆对象的作用域。那么,在该栈指针变量的作用域范围内,无需对该栈指针变量所引用的堆象进行arc操作。因为在此情况下,该栈指针变量所引用堆对象的引用计数分别在其栈指针变量生命周期开始和结束时不会发生变化,即引用计数增减会相互抵消。
113.具体地,为了能够对上述场景进行建模,可以预先定义栈指针变量的两种属性:
114.借用属性(borrowed属性):若一个栈指针变量不会被赋值给作用域等级更大的指针变量(即第一其他指针变量),且该栈指针变量不会引用作用域等级更小的指针变量(即第二其他指针变量)所引用的堆对象,则该类指针变量(即属性信息均为借用属性的指针变量)间相互赋值时,无需进行arc操作,即借用属性用于指示在上述多个目标栈指针变量相互赋值过程中,拒绝更新多个目标栈指针变量所引用的堆对象的引用计数。
115.示例性地,一种源代码可以如下:
[0116][0117]
其中,源程序中的test函数中的局部指针变量a和b,以及print函数的形参变量a均可以标记为borrowed属性,则print(a)和b:=a产生的赋值传递均不需要进行arc操作(即拒绝更新所引用的堆对象的引用计数),堆对象在函数生命周期结束的时候,可以对其进行内存回收。
[0118]
普通属性(normal属性):该属性为栈指针变量的默认标注属性,需要进行arc操作(即更新所引用的堆对象的引用计数)。即上述普通属性用于指示在上述多个目标栈指针变量相互赋值过程中,更新上述多个目标栈指针变量所引用的上述堆对象的引用计数。
[0119]
其中,normal属性的指针可以赋值给borrowed属性的指针,但是borrowed属性的指针不可以赋值给nornal属性的指针。
[0120]
在步骤s15中,在上述多个目标栈指针变量的属性信息为借用属性的情况下,拒绝生成引用计数操作信息;上述借用属性用于指示在上述多个目标栈指针变量相互赋值过程中,拒绝更新上述多个目标栈指针变量所引用的堆对象的引用计数。
[0121]
在一可行的实施例中,上述方法还可以包括:
[0122]
在上述多个目标栈指针变量的属性信息为普通属性的情况下,生成上述引用计数操作信息;上述普通属性用于指示在上述赋值过程中,更新上述引用计数。
[0123]
具体地,引用计数操作信息表征更新堆对象引用计数的指令。可选地,该更新包括增加(即引用计数加1)和减小(即引用计数减1)。
[0124]
可选地,在相互之间存在赋值关系的多个目标栈指针变量的属性信息为普通属性的情况下,生成堆对象的引用计数操作信息。
[0125]
可选地,在相互之间存在赋值关系的多个目标栈指针变量的属性信息为借用属性的情况下,拒绝生成计数操作信息。
[0126]
由于可以在在源程序的编译期预先对栈指针变量标注了两种不同的属性(普通属性和借用属性),在确定存在赋值关系的多个目标栈指针变量的属性信息为普通属性的情况下,生成堆对象的引用计数操作信息,在确定个目标栈指针变量的属性信息为借用属性的情况下,拒绝生成引用计数操作信息,从而在编译期减少了引用计数操作信息的生成数量,避免了不必要的arc操作,避免由源程序所编译得到的目标程序运行过程中的引用计数频繁更新,对目标程序的运行造成额外的负担,从而降低资源消耗,提高目标程序吞吐量。
[0127]
图2是根据一示例性实施例示出的一种标注借用属性和普通属性的流程图。如图2所示,在一个可选的实施例中,上述方法还包括:标注上述普通属性和上述借用属性,上述标注上述普通属性和上述借用属性可以包括:
[0128]
在步骤s21中,获取上述源程序中的待处理函数,上述待处理函数包括多个指针变量。
[0129]
本公开实施例在将源程序编译为目标程序的过程中会对变量的属性信息进行标注。示例性地,在将源程序编译为目标程序的过程分为5个阶段:词法分析、语法分析、语义分析与中间代码产生阶段、代码优化阶段、目标代码生成程序阶段。
[0130]
具体地,待处理函数是对一段代码的封装,可以通过函数名和参数被调用,是程序的基本组成单位。
[0131]
示例性地,可以对源程序进行词法分析、语法分析、语义分析、类型检查,确定目标程序中的变量和表达式的类型。
[0132]
可选地,类型检查包括对表达式和变量的类型进行检查,类型检查主要是为了判断变量或者参数的实际类型和声明的类型是否匹配的问题,该类型检查可以便于及早的发现类型不匹配的问题,不用等到目标程序执行的时候才发现这个问题,从而能降低问题成本。
[0133]
在步骤s23中,根据上述多个指针变量,以及上述多个指针变量之间的赋值关系,构建上述待处理函数对应的第一有向图;上述第一有向图的顶点表征上述指针变量,上述第一有向图的边表征任意两个指针变量之间的赋值关系。
[0134]
示例性地,可以分析待处理函数中的表达式和语句,从而得到待处理函数中的多个指针变量以及多个指针变量之间的赋值关系。
[0135]
可选地,多个指针变量之间的赋值关系可以包上述显示存在的赋值关系和上述隐式存在的赋值关系。
[0136]
具体地,在构建第一有向图的时候,图中顶点代表指针类型的变量,边代表变量之间的赋值关系。可选地,图中顶点会保存变量所在作用域等级(level)、是否是栈上指针变量等属性。
[0137]
图3是根据一示例性实施例示出的一种通过赋值关系创建第一有向图的中的边的示意图。如图3所示,指针的赋值表达式“p=q”,则可以创建一条顶点p指向顶点q的边。
[0138]
在步骤s25中,标注上述多个指针变量中的栈指针变量的属性信息为上述普通属性。
[0139]
具体地,将每个栈指针变量的属性信息均默认标注为普通属性。
[0140]
在步骤s27中,根据上述多个指针变量中的栈指针变量所对应的顶点,在上述第一有向图中的位置,以及上述栈指针变量的作用域,从上述栈指针变量中确定出候选栈指针变量,上述候选栈指针变量包括上述多个目标栈指针变量。
[0141]
在步骤s29中,将上述候选栈指针变量的属性信息由上述普通属性更新为上述借用属性。
[0142]
具体地,可以结合图论的方法,根据多个指针变量中的栈指针变量所对应的顶点,在上述第一有向图中的位置,以及栈指针变量的作用域,从栈指针变量中确定出需要被标注为借用属性的候选栈指针变量,并将该候选栈指针变量的属性信息由普通属性更新为借用属性。
[0143]
示例性地,还可以将相应的属性信息保存至栈指针变量在第一有向图中的顶点中。即第一有向图中的顶点不仅保存有所表征的指针变量的作用域等级和变量类型,还存储有该指针变量在于其他指针变量相互赋值的过程中,是否执行arc操作的借用属性或普通属性。
[0144]
本公开实施例根据待处理函数中的多个指针变量以及多个指针变量之间的赋值关系,构建待处理函数对应的第一有向图(第一有向图的顶点表征指针变量,第一有向图的边表征任意两个指针变量之间的赋值关系),接着根据多个指针变量中的栈指针变量(栈指针变量的属性默认为进行arc操作的普通属性)所对应的顶点,在第一有向图中的位置,以及栈指针变量的作用域,从栈指针变量中确定出候选栈指针变量,最后将候选栈指针变量的属性由通属性更新为不进行arc操作的借用属性,从而在候选栈指针变量与其他指针变量相互赋值的过程中,不调整该其所引用的堆对象的引用计数,进而优化不必要的arc操作,避免引用计数频繁更新,对目标程序运行时的整体性能造成影响;此外,本公开通过上述方式能够提高堆对象引用计数的计算精度,确保垃圾内存能够及时得到回收,从而降低了堆对象引用计数过程对系统资源的消耗,避免对目标程序运行时造成额外的负担,有效提高了目标程序的性能;此外,上述属性信息标注是在将编译过程进行的,对用户是无感知的,不需要条用户进行接入,降低了属性信息标注的成本。
[0145]
图4是根据一示例性实施例示出的一种构建第一有向图的流程图一。如图4所示,在一个可能的实施例中,在上述步骤s23中,上述根据上述多个指针变量,以及上述多个指针变量之间的赋值关系,构建上述待处理函数对应的第一有向图,可以包括:
[0146]
在步骤s2301中,生成每个指针变量对应的顶点。
[0147]
在步骤s2303中,根据任意两个指针变量之间的赋值关系,确定上述任意两个指针变量中的赋值变量和被赋值变量,上述被赋值变量用于接受上述赋值变量所赋予的值。
[0148]
在步骤s2305中,创建由上述被赋值变量对应的顶点指向上述赋值变量对应的顶点的有向边。
[0149]
在步骤s2307中,根据上述顶点和上述有向边,生成上述第一有向图。
[0150]
示例性地,可以根据每个指针向量在空间中的位置,生成每个指针变量对应的顶点。
[0151]
继续如图3所示,图3中的赋值关系为:将变量q的值赋值给变量p,则变量q为赋值变量,变量p为被赋值变量,变量p接受变量q所赋予的值。
[0152]
继续如图3所示,可以创建一条由变量p对应的顶点指向变量q对应的顶点的有向边。通过该方式可以得到多个指针变量中,任意两个指针变量之间的有向边,从而生成该第一有向图。
[0153]
示例性地,该第一有向图可以为有向无权图。具体地,无权图指的是两点之间的连线没有长度,也就是说两点之间能连通,其距离就是1,不相通就为0。
[0154]
本公开实施例中,根据待处理函数中的多个指针变量以及多个指针变量之间的赋值关系,确定上述任意两个指针变量中的赋值变量和被赋值变量,并创建由上述被赋值变量对应的顶点指向上述赋值变量对应的顶点的有向边,从而根据上述顶点和上述有向边,生成该第一有向图,该方式创建的第一有向图能够准确体现出每个指针变量在空间中的位置关系,以及相互之间的赋值关系,通过该第一有向图,能够精准确定出需要标注为借用属性信的候选栈指针变量,从而确保生成精准的引用计数操作信息,进而确保对堆对象的引用计数进行精准控制。
[0155]
图5是根据一示例性实施例示出的一种从栈指针变量中确定出候选栈指针变量的流程图。如图5所示,在一个可行的实施例中,上述顶点存储上述顶点所表征的指针变量的
变量类型和作用域等级,在上述步骤s27中,上述根据上述多个指针变量中的栈指针变量所对应的顶点,在上述第一有向图中的位置,以及上述栈指针变量的作用域,从上述栈指针变量中确定出候选栈指针变量,可以包括:
[0156]
在步骤s2701中,根据上述多个指针变量各自对应的顶点所存储的变量类型,从多个指针变量中获取变量类型为栈上指针类型的预设数量个栈指针变量。
[0157]
具体地,由于每个指针变量各自对应的顶点存储每个指针变量的变量类型,该变量类型可以包括栈上指针变量类型、堆上指针变量类型等。根据该量变量类型,可以从多个指针变量中获取变量类型为栈上指针类型的预设数量个栈指针变量。
[0158]
在步骤s2703中,依次遍历每一栈指针变量,并在遍历每一栈指针变量时,执行以下操作。
[0159]
在步骤s2705中,在上述第一有向图中的第一路径上不存在第一目标顶点,且上述第一有向图中不存在第二路径的情况下,确定每一栈指针变量为上述候选栈指针变量;其中,上述第一路径为上述第一有向图中,从每一栈指针变量对应的顶点出发所能够到达的路径,上述第二路径为上述第一有向图中,从第二目标顶点出发到达每一指针变量对应的顶点的路径,上述第一目标顶点表征作用域等级小于每一栈指针变量的作用域等级的指针变量所对应的顶点,上述第二目标顶点表征作用域等级大于每一指针变量的作用域等级的指针变量所对应的顶点。
[0160]
假设某一栈指针变量a对应的顶点为顶点a,在上述第一有向图中,如果从顶点a出发所能够到达的第一路径上,不存在作用域等级小于栈指针变量a的作用域等级的指针变量所对应的顶点,且不存在从作用域等级大于栈指针变量a的作用域等级的指针变量所对应的顶点出发,达到该顶点a的第二路径,则说明该栈指针变量a不会被赋值给等级更高的作用域的指针变量,且该栈指针变量a不会引用等级更小的作用域的指针变量所引用的堆对象,则该栈指针变量a与其他指针变量(属性信息为借用属性的指针变量)相互赋值时,无需进行arc操作,则认为栈指针变量a的属性信息为需要标注为借用属性的候选栈指针变量。通过栈指针变量在第一有向图中的顶点的路径以及作用域的方式,能够准确确定出需要标注为借用属性的候选栈指针变量,从而确保生成精准的引用计数操作信息,进而确保对堆对象的引用计数进行精准控制。
[0161]
图6是根据一示例性实施例示出的一种构建第一有向图的流程图二。如图6所示,在一个可选的实施例中,上述待处理函数的数量为多个,上述方法还可以包括:
[0162]
在步骤s31中,基于多个待处理函数之间的调用关系,生成上述多个待处理函数对应的第二有向图;上述第二有向图中的顶点表征上述待处理函数,上述第二有向图中的边表征任意两个待处理函数之间的调用关系。
[0163]
示例性地,生成第一有向图的过程可以如下:
[0164]
将每个待处理函数作为第二有向图中的顶点。根据任意两个函数之间的调用关系,确定任意两个函数中的调用函数和被调用函数,上述调用函数调用上述被调用函数。
[0165]
创建由调用函数对应的顶点指向被调用函数对应的有向边,根据该顶点和该有向边,生成第二有向图。
[0166]
例如,函数a中调用了函数b和函数c,那么在有向图中就存在顶点a分别到顶点b和顶点c的有向边。
[0167]
在步骤s33中,基于预设深度优先搜索算法对上述第二有向图进行深度优先遍历,基于遍历结果从上述多个待处理函数中确定出预设数量个目标函数,上述预设数量个目标函数表征上述第二有向图中的强连通分量。
[0168]
具体地,强连通分量指的是:在有向图g中,如果两个顶点u,v间有一条从u到v的有向路径,同时还有一条从v到u的有向路径,则称两个顶点强连通。如果有向图g的每两个顶点都强连通,称g是一个强连通图。有向非强连通图的极大强连通子图,称为强连通分量。
[0169]
可选地,该预设深度优先搜索算法可以包括但不限于:tarjan算法、gabow算法等。以下,以tarjan算法为例,介绍强连通分量的计算原理:
[0170]
tarjan算法是基于对图深度优先搜索的算法,每个强连通分量为搜索树中的一棵子树。搜索时,把当前搜索树中未处理的节点加入一个堆栈,回溯时可以判断栈顶到栈中的节点是否为一个强连通分量。
[0171]
定义dfn(u)为节点u搜索的次序编号(时间戳),low(u)为u或u的子树能够追溯到的最早的栈中节点的次序号。
[0172]
当dfn(u)=low(u)时,以u为根的搜索子树上所有节点是一个强连通分量。
[0173]
在步骤s35中,在上述预设数量个目标函数之间不存在递归调用的情况下,根据上述预设数量个目标函数之间的调用先后顺序,对上述预设数量个目标函数进行逆序排序,得到第一函数序列。
[0174]
具体地,递归调用,指的是一种特殊的嵌套调用,是某个函数调用自己或者是调用其他函数后再次调用自己的,只要函数之间互相调用能产生循环的则一定是递归调用。
[0175]
如果预设数量个目标函数之间不存在递归调用,则每个目标函数(即强连通分量)就是一个独立的函数,最底层被调用的函数会排在最优先的位置。
[0176]
假设目标函数包括fa、fb、fc和fd,fa调用fb、fb调用fc、fc调用fd,由于fa、fb、fc和fd之间不存在递归调用,则第一函数序列为:fd、fc、fb和fa。
[0177]
在步骤s37中,根据上述第一函数序列中的每个函数在上述第一函数序列中的排序、上述第一函数序列中的每个函数中的多个指针变量,以及上述第一函数序列中的每个函数中的多个指针变量之间的赋值关系,依次构建上述第一函数序列中的每个函数对应的第一有向图。
[0178]
具体地,可以按照第一函数序列中的每个函数的排序,依次构建第一函数序列中的每个函数对应的第一有向图。第一有向图的构建过程请参见上述步骤s2301-步骤s2307,在此不再赘述。
[0179]
本公开实施例中,在待处理函数的数量为多个的情况下,可以构建多个待处理函数对应的第二有向图,并根据预设深度优先搜索算法确定第二有向图中的强连通分量,后续只需要对强连通分量对应的目标函数构建第一有向图即可,无需对每个待处理函数均构建第一有向图,从而减小了第一有向图的构建规模,减低了对系统资源的消耗,提高了属性信息标注的效率;此外,在各个目标函数之间不存在递归调用的情况下,将每个目标函数作为独立的个体进行排序,得到第一函数序列,并在构建第一有向图的时候,是按照第一函数序列中的每个函数的排序,依次构建第一函数序列中的每个函数对应的第一有向图,即先构建最底层被调用的函数的第一有向图,并对最底层被调用的函数的第一有向图进行向量属性标注,通过由调用复杂度较低到调用复杂度较高的顺序对函数进行构建有向图并进行
向量标注,有利于提第一有向图构建的速度和精度,从而提高向量属性信息标注的速度和精度。
[0180]
在另一个可选行的实施例中,继续如图6所示,上述方法还可以包括:
[0181]
在步骤s36中,在上述预设数量个目标函数之间存在上述递归调用的情况下,获取递归调用函数,上述递归调用函数包括多个相互之间存在上述递归调用的目标函数。
[0182]
在步骤s38中,根据上述归调用函数和其他函数之间的调用先后顺序,对上述递归调用函数和上述其他函数进行逆序排序,得到第二函数序列,上述其他函数表征上述预设数量个目标函数中,除上述递归调用函数之外的函数。
[0183]
在步骤s310中,根据上述第二函数序列中的每个函数在上述第二函数序列中的排序、上述第二函数序列中的每个函数中的多个指针变量,以及上述第二函数序列中的每个函数中的多个指针变量之间的赋值关系,依次构建上述第二函数序列中的每个函数对应的第一有向图。
[0184]
具体地,如果存在递归调用,存在递归调用的强联通分量就是递归调用的函数集合,可以将存在递归调用的强联通分量作为一个整体,进行排序。
[0185]
示例性地,另一种源代码可以如下:
[0186][0187][0188]
其中,该源代码中包括预设数量个目标函数(即f1、f2、f3、f4和main)。
[0189]
图7是根据一示例性实施例示出的一种预设数量个目标函数之间存在递归调用的示意图。如图7所示,该预设数量个目标函数之间的调用关系为:
[0190]
1)main—f1—f2—f3—f1;2)main—f1—f2—f4。
[0191]
由于f1、f2、f3之间存在递归调用,则将f1、f2、f3看成一个整体,由于最底层被调用的函数是f4,则第二函数序列为:f4、(f1、f2、f3)、main。(f1、f2、f3)即为递归调用函数,f4和main为其他函数。
[0192]
具体地,可以按照第二函数序列中的每个函数的排序,依次构建第二函数序列中的每个函数对应的第一有向图。第一有向图的构建过程请参见上述步骤s2301-步骤s2307,在此不再赘述。
[0193]
本公开实施例中,在各个目标函数之间存在递归调用的情况下,将存在递归调用的目标函数作为一个整体与其他非递归调用函数进行排序,得到第二函数序列,依次构建第二函数序列中的每个函数对应的第一有向图,即先构建最底层被调用的函数的第一有向图,并对最底层被调用的函数的第一有向图进行向量属性标注,通过由调用复杂度较低到调用复杂度较高的顺序对函数进行构建有向图并进行特征标注,有利于提第一有向图构建的速度和精度,从而提高属性信息标注的速度和精度。此外,由于存在递归调用的目标函数是一个整体,则在构建第一有向图的时候,只需构建这个整体对应的第一有向图即可,无需构建该整体中的每个函数对应的第一有向图,减少了第一有向图的构建数量,进一步降低了对系统资源的消耗,进一步提高了向量属性信息标注的速度。
[0194]
在一个示例性的实施方式中,上述方法还可以包括:
[0195]
运行由上述源程序编译得到的目标程序,上述目标程序包括多个操作信息,上述多个操作信息包括上述引用计数操作信息。
[0196]
在执行上述引用计数操作信息的情况下,更新上述引用计数。
[0197]
可选地,目标程序由源程序编译得到,其包括但不限于用户程序、应用软件包。其中,用户程序是为满足用户不同领域、不同问题的应用需求而提供的那部分软件。应用软件包是利用计算机解决某类问题而设计的程序的集合,供多用户使用。
[0198]
本公开实施例中,在目标程序运行过程中,当执行该引用计数操作信息的情况下,更新所引用的堆对象的引用计数。由于在编译过程生成引用计数操作信息的过程中,对于多个目标栈指针变量的属性信息为借用属性的情况下,拒绝生成引用计数操作信息,避免了不必要的arc操作,因此,在目标程序运行过程中,所执行的引用计数操作信息的数量大大减少,从而避免引用计数频繁更新对目标程序的运行造成额外的负担,从而降低资源消耗,提高目标程序吞吐量;此外,本公开通过上述方式能够提高堆对象引用计数的计算精度,且堆对象在其生命周期结束的时候,可以对其进行内存回收,确保垃圾内存能够及时得到回收,从而进一步避免对目标程序运行时造成额外的负担,有效提高目标程序的性能。
[0199]
图8是根据一示例性实施例示出的一种操作信息生成装置框图。参照图8,该装置包括第一获取模块41,第二获取模块43和第一生成模块45。
[0200]
第一获取模块41,被配置为执行获取源程序以及上述源程序中存在赋值关系的多个目标栈指针变量。
[0201]
第二获取模块43,被配置为执行获取上述多个目标栈指针变量的属性信息。
[0202]
第一生成模块45,被配置为执行被配置为执行在上述多个目标栈指针变量的属性信息为借用属性的情况下,拒绝生成引用计数操作信息;上述借用属性用于指示在上述多个目标栈指针变量相互赋值过程中,拒绝更新上述多个目标栈指针变量所引用的堆对象的引用计数。
[0203]
在示例性的实施方式中,上述装置还包括:第二生成模块,被配置为执行在上述多个目标栈指针变量的属性信息为普通属性的情况下,生成上述引用计数操作信息;上述普通属性用于指示在上述赋值过程中,更新上述引用计数。
[0204]
在示例性的实施方式中,上述装置还包括标注上述借用属性和上述普通属性的标注模块,上述标注模块包括:
[0205]
待处理函数获取单元,被配置为执行获取上述源程序中的待处理函数,上述待处
理函数包括多个指针变量;
[0206]
第一有向图构建单元,被配置为执行根据上述多个指针变量,以及上述多个指针变量之间的赋值关系,构建上述待处理函数对应的第一有向图;上述第一有向图的顶点表征上述指针变量,上述第一有向图的边表征任意两个指针变量之间的赋值关系;
[0207]
标注单元,被配置为执行标注上述多个指针变量中的栈指针变量的属性信息为上述普通属性;
[0208]
候选栈指针变量确定单元,被配置为执行根据上述多个指针变量中的栈指针变量所对应的顶点,在上述第一有向图中的位置,以及上述栈指针变量的作用域,从上述栈指针变量中确定出候选栈指针变量,上述候选栈指针变量包括上述多个目标栈指针变量;
[0209]
属性更新单元,被配置为执行将上述候选栈指针变量的属性信息由上述普通属性更新为上述借用属性。
[0210]
在示例性的实施方式中,上述第一有向图构建单元,包括:
[0211]
顶点确定子单元,被配置为执行生成每个指针变量对应的顶点;
[0212]
赋值变量确定子单元,被配置为执行根据任意两个指针变量之间的赋值关系,确定上述任意两个指针变量中的赋值变量和被赋值变量,上述被赋值变量用于接受上述赋值变量所赋予的值;
[0213]
有向边确定子单元,被配置为执行创建由上述被赋值变量对应的顶点指向上述赋值变量对应的顶点的有向边;
[0214]
生成子单元,被配置为执行根据上述顶点和上述有向边,生成上述第一有向图。
[0215]
在示例性的实施方式中,上述顶点存储上述顶点所表征的指针变量的变量类型和作用域等级,上述候选栈指针变量确定单元,包括:
[0216]
栈指针变量确定子单元,被配置为执行根据上述多个指针变量各自对应的顶点所存储的变量类型,从多个指针变量中获取变量类型为栈上指针类型的预设数量个栈指针变量;
[0217]
遍历子单元,被配置为执行依次遍历每一栈指针变量,并在遍历每一栈指针变量时,执行以下操作;
[0218]
候选栈指针变量确定子单元,被配置为执行在上述第一有向图中的第一路径上不存在第一目标顶点,且上述第一有向图中不存在第二路径的情况下,确定每一栈指针变量为上述候选栈指针变量;其中,上述第一路径为上述第一有向图中,从每一栈指针变量对应的顶点出发所能够到达的路径,上述第二路径为上述第一有向图中,从第二目标顶点出发到达每一指针变量对应的顶点的路径,上述第一目标顶点表征作用域等级小于每一栈指针变量的作用域等级的指针变量所对应的顶点,上述第二目标顶点表征作用域等级大于每一指针变量的作用域等级的指针变量所对应的顶点。
[0219]
在示例性的实施方式中,上述待处理函数的数量为多个,上述装置还包括:
[0220]
第二有向图生成模块,被配置为执行基于多个待处理函数之间的调用关系,生成上述多个待处理函数对应的第二有向图;上述第二有向图中的顶点表征上述待处理函数,上述第二有向图中的边表征任意两个待处理函数之间的调用关系;
[0221]
目标函数确定模块,被配置为执行基于预设深度优先搜索算法对上述第二有向图进行深度优先遍历,基于遍历结果从上述多个待处理函数中确定出预设数量个目标函数,
上述预设数量个目标函数表征上述第二有向图中的强连通分量;
[0222]
第一函数序列确定模块,被配置为执行在上述预设数量个目标函数之间不存在递归调用的情况下,根据上述预设数量个目标函数之间的调用先后顺序,对上述预设数量个目标函数进行逆序排序,得到第一函数序列;
[0223]
第一构建模块,被配置为执行根据上述第一函数序列中的每个函数在上述第一函数序列中的排序、上述第一函数序列中的每个函数中的多个指针变量,以及上述第一函数序列中的每个函数中的多个指针变量之间的赋值关系,依次构建上述第一函数序列中的每个函数对应的第一有向图。
[0224]
在示例性的实施方式中,上述装置还包括:
[0225]
递归调用函数获取模块,被配置为执行在上述预设数量个目标函数之间存在上述递归调用的情况下,获取递归调用函数,上述递归调用函数包括多个相互之间存在上述递归调用的目标函数;
[0226]
第二函数序列确定模块,被配置为执行根据上述归调用函数和其他函数之间的调用先后顺序,对上述递归调用函数和上述其他函数进行逆序排序,得到第二函数序列,上述其他函数表征上述预设数量个目标函数中,除上述递归调用函数之外的函数;
[0227]
第二构建模块,被配置为执行根据上述第二函数序列中的每个函数在上述第二函数序列中的排序、上述第二函数序列中的每个函数中的多个指针变量,以及上述第二函数序列中的每个函数中的多个指针变量之间的赋值关系,依次构建上述第二函数序列中的每个函数对应的第一有向图。
[0228]
在示例性的实施方式中,上述装置还包括:
[0229]
运行模块,被配置为执行运行由上述源程序编译得到的目标程序,上述目标程序包括多个操作信息,上述多个操作信息包括上述引用计数操作信息。
[0230]
更新模块,被配置为执行在执行上述引用计数操作信息的情况下,更新上述引用计数。
[0231]
关于上述实施例中的装置,其中各个模块执行操作的具体方式已经在有关该方法的实施例中进行了详细描述,此处将不做详细阐述说明
[0232]
在示例性实施例中,还提供了一种电子设备,包括处理器;用于存储处理器可执行指令的存储器;其中,处理器被配置为执行存储器上所存放的指令时,实现上述实施例中任一操作信息生成方法的步骤。
[0233]
该电子设备可以是终端、服务器或者类似的运算装置,以该电子设备是服务器为例,图9是根据一示例性实施例示出的一种用于操作信息生成的电子设备的框图,该电子设备50可因配置或性能不同而产生比较大的差异,可以包括一个或一个以上中央处理器(central processing units,cpu)51(中央处理器51可以包括但不限于微处理器mcu或可编程逻辑器件fpga等的处理装置)、用于存储数据的存储器53,一个或一个以上存储应用程序523或数据522的存储介质52(例如一个或一个以上海量存储设备)。其中,存储器53和存储介质52可以是短暂存储或持久存储。存储在存储介质52的程序可以包括一个或一个以上模块,每个模块可以包括对电子设备中的一系列指令操作。更进一步地,中央处理器51可以设置为与存储介质52通信,在电子设备50上执行存储介质52中的一系列指令操作。电子设备50还可以包括一个或一个以上电源56,一个或一个以上有线或无线网络接口55,一个或
一个以上输入输出接口54,和/或,一个或一个以上操作系统521,例如windows servertm,mac os xtm,unixtm,linuxtm,freebsdtm等等。
[0234]
输入输出接口54可以用于经由一个网络接收或者发送数据。上述的网络具体实例可包括电子设备50的通信供应商提供的无线网络。在一个实例中,输入输出接口54包括一个网络适配器(network interface controller,nic),其可通过基站与其他网络设备相连从而可与互联网进行通讯。在一个示例性实施例中,输入输出接口54可以为射频(radio frequency,rf)模块,其用于通过无线方式与互联网进行通讯。
[0235]
本领域普通技术人员可以理解,图9所示的结构仅为示意,其并不对上述电子设备的结构造成限定。例如,电子设备50还可包括比图9中所示更多或者更少的组件,或者具有与图9所示不同的配置。
[0236]
在示例性实施例中,还提供了一种计算机可读存储介质,当计算机可读存储介质中的指令由电子设备的处理器执行时,使得电子设备能够执行上述实施例中任一操作信息生成方法的步骤。
[0237]
在示例性实施例中,还提供了一种计算机程序产品,包括计算机程序,该计算机程序被处理器执行时实现上述任一种实施方式中提供的操作信息生成方法。
[0238]
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,该计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本公开所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和/或易失性存储器。非易失性存储器可包括只读存储器(rom)、可编程rom(prom)、电可编程rom(eprom)、电可擦除可编程rom(eeprom)或闪存。易失性存储器可包括随机存取存储器(ram)或者外部高速缓冲存储器。作为说明而非局限,ram以多种形式可得,诸如静态ram(sram)、动态ram(dram)、同步dram(sdram)、双数据率sdram(ddrsdram)、增强型sdram(esdram)、同步链路(synchlink)dram(sldram)、存储器总线(rambus)直接ram(rdram)、直接存储器总线动态ram(drdram)、以及存储器总线动态ram(rdram)等。
[0239]
本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本公开的其它实施方案。本技术旨在涵盖本公开的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本公开的一般性原理并包括本公开未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本公开的真正范围和精神由下面的权利要求指出。
[0240]
应当理解的是,本公开并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本公开的范围仅由所附的权利要求来限制。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献