CN106502707B - 代码生成方法及装置 - Google Patents
代码生成方法及装置 Download PDFInfo
- Publication number
- CN106502707B CN106502707B CN201611000637.6A CN201611000637A CN106502707B CN 106502707 B CN106502707 B CN 106502707B CN 201611000637 A CN201611000637 A CN 201611000637A CN 106502707 B CN106502707 B CN 106502707B
- Authority
- CN
- China
- Prior art keywords
- data structure
- allocator
- alias
- data
- target
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/74—Reverse engineering; Extracting design information from source code
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种代码生成方法及装置;方法包括:分析源文件中的代码,得到所述源文件中定义的用于在共享内存中实现的原始数据结构;确定各所述原始数据结构包括的基本数据类型,声明增进进程间通信库中对应各所述基本数据类型的分配器,并生成相应分配器别名;基于所述分配器别名,生成与相应原始数据结构对应的目标数据结构;确定各所述目标数据结构对应的分配器定义有相应的分配器别名;将各所述目标数据结构对应的分配器别名、以及对应的增进进程间通信库数据结构输出到目标文件中的代码。实施本发明,能够以简单高效的方式在共享内存中创建用于数据结构用于存取数据。
Description
技术领域
本发明涉及数据存储技术,尤其涉及一种代码生成方法及装置。
背景技术
随着互联网的发展以及移动终端设备的普及,各个行业接入互联网服务的诉求越来越高。因此,后台服务程序的性能问题也越来越重要。在后台服务体系中使用多级缓存来处理数据操作,对于不同操作频率的数据可以从相应级别的缓存中直接调用,避免了从磁盘等非易失性存储介质中读取数据的延迟,极大提升后台服务的响应速度,同时也保证了后台服务的可靠性和容灾能力。
目前,多机缓存一般在共享内存创建多个级别的数据结构来实现,另外,增进进程间(Boost Inter-Process)库提供共享内存中创建存储容器的方式实现多级缓存。
目前,共享内存中普遍将数据以二进制数据流的方式存储,这样在共享内存中存储数据时就对应要进行编码和解码,这个过程有较高的处理器的计算资源的消耗,进而很有可能影响后台的服务质量。甚至导致在实际使用过程中还需要再加一层进程缓存,增加了数据维护和更新的成本。
针对上述问题,相关技术提供使用Boost Inter-Process)库在共享内存中创建存储容器的方案,更加方便程序在共享内容中存取数据,降低了共享内存的编解码消耗,但是使用Boost Inter-Process)库需要开发人员付出额外的学习成本,开发以及维护的成本高,难以普及使用。
综上所述,对于使用一种简单高效的方式在共享内存中创建用于数据结构用于存取数据,减少避免编码、解码数据带来的处理器的计算资源的消耗,相关技术尚无有效解决方案。
发明内容
本发明实施例提供一种代码生成方法及装置,能够简单高效的方式在共享内存中创建用于数据结构用于存取数据。
本发明实施例的技术方案是这样实现的:
第一方面,本发明实施例提供一种代码生成方法,包括:
分析源文件中的代码,得到所述源文件中定义的用于在共享内存中实现的原始数据结构;
确定各所述原始数据结构包括的基本数据类型,声明增进进程间通信库中对应各所述基本数据类型的分配器,并生成相应分配器别名;
基于所述分配器别名,生成与相应原始数据结构对应的目标数据结构;
确定各所述目标数据结构对应的分配器定义有相应的分配器别名;
将各所述目标数据结构对应的分配器别名、以及对应的增进进程间通信库数据结构输出为目标文件中的代码。
第二方面,本发明实施例提供一种代码生成装置,包括:
分析单元,用于分析源文件中的代码,得到所述源文件中定义的用于在共享内存中实现的原始数据结构;
别名单元,用于确定各所述原始数据结构包括的基本数据类型,声明增进进程间通信库中对应各所述基本数据类型的分配器,并生成相应分配器别名;
生成单元,基于所述分配器别名,生成与相应原始数据结构对应的目标数据结构;
确定单元,确定各所述目标数据结构对应的分配器定义有相应的分配器别名;
输出单元,用于将各所述目标数据结构对应的分配器别名、以及对应的增进进程间通信库数据结构输出为目标文件中的代码。
第三方面,本发明实施例提供一种代码生成装置,包括存储器和处理器;存储器中存储有可执行指令,用于引起处理器执行包括以下的操作:
分析源文件中的代码,得到所述源文件中定义的用于在共享内存中实现的原始数据结构;
确定各所述原始数据结构包括的基本数据类型,声明增进进程间通信库中对应各所述基本数据类型的分配器,并生成相应分配器别名;
基于所述分配器别名,生成与相应原始数据结构对应的目标数据结构;
确定各所述目标数据结构对应的分配器定义有相应的分配器别名;
将各所述目标数据结构对应的分配器别名、以及对应的增进进程间通信库数据结构输出为目标文件中的代码。
第四方面,本发明实施例提供一种存储介质,存储有可执行指令,用于执行本发明实施例提供的代码生成方法。
本发明实施例具有以下有益效果:
对用户定义的特定格式的数据结构进行分析,生成程序中可用的、Boost Inter-Process库可识别的、可放入共享内存的数据结构,以目标文件中的代码描述,可以更高效合理的使用机器缓存,解决进程缓存和共享内存的短板,并降低开发人员接入的成本。
附图说明
图1是本发明实施例提供的通过在共享内存中实现多级缓存的服务后台的一个典型的应用示意图;
图2是本发明实施例提供的服务后台的一个可选的软硬件结构示意图;
图3是本发明实施例提供的共享内存中实现多级缓存的一个可选的架构示意图;
图4是本发明实施例提供的代码生成方法的一个可选的流程示意图;
图5是本发明实施例提供的代码生成装置的一个可选的硬件结构示意图;
图6是本发明实施例提供的代码生成装置的一个可选的功能结构示意图;
图7是本发明实施例提供的代码生成方法的一个可选的流程示意图。
具体实施方式
以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所提供的实施例仅仅用以解释本发明,并不用于限定本发明。另外,以下所提供的实施例是用于实施本发明的部分实施例,而非提供实施本发明的全部实施例,在本领域技术人员不付出创造性劳动的前提下,对以下实施例的技术方案进行重组所得的实施例、以及基于对发明所实施的其他实施例均属于本发明的保护范围。
需要说明的是,在本发明实施例中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的方法或者装置不仅包括所明确记载的要素,而且还包括没有明确列出的其他要素,或者是还包括为实施方法或者装置所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的方法或者装置中还存在另外的相关要素(例如方法中的步骤或者装置中的单元)。
例如,本发明实施例提供的代码生成方法包含了一系列的步骤,但是本发明实施例提供的代码生成方法不限于所记载的步骤,同样地,本发明实施例提供的代码生成装置包括了一系列单元,但是本发明实施例提供的代码生成装置不限于包括所明确记载的单元,还可以包括为获取相关信息、或基于信息进行处理时所需要设置的单元。
对本发明进行进一步详细说明之前,对本发明实施例中涉及的名词和术语进行说明,本发明实施例中涉及的名词和术语适用于如下的解释。
1)共享内存(Shared Memory),在多处理器的服务后台中,可以被不同进程访问的内存。共享内存是多进程之间的通信方法,通常用于一个程序的多进程间通信,当然实际上多个程序间也可以通过共享内存来传递信息。
多个进程把共享内存映射到相应进程的地址空间中去,由于共享内存对于各自附着的进程是共享的,一次进程可以很方便的通过共享内存上的共有数据进行通信。当一个进程附着到共享内存上后,得到一个指向这块共享内存的指针;进程可以像使用其他内存一样使用共享内存。
2)多级缓存,根据服务后台的系统架构的不同层级,在服务后台的共享内存中进行数据缓存,以提升对不同层级的数据的存取效率。
3)容器,以共享方式使用主机上的内存、处理器和存储空间中实现的通用的数据结构。
4)增进进程间(BIP,Boost Inter-Process)库,由C++标准委员会库公司组发起的,为共享内存的使用提供了新的方式,通过内存分配器来支持在共享内存中设置容器,例如设置图(map)、向量(vector)和列表(list)等类型的容器。
5)数据结构,数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的不同数据类型的数据元素的集合。通常情况下,选择的数据结构可以带来更高的运行或者存储效率。
6)数据类型,数据结构中的数据元素的类型,包括整型(int)、长整型(long)、字符型(char)、字符串(string)和双精度浮点型(double)等,上述数据类型也称为基本数据类型。
如图1所示本发明实施例提供的通过在共享内存中实现多级缓存的服务后台的一个典型的应用示意图,应用于服务器/客户端的架构中。
在图1中,代码生成装置实施为网络应用的服务后台10,示例性地,网络应用为社交软件、在线游戏、在线视频(如动漫)和在线电子书(例如,如漫画)等。
服务后台10在本地缓存与业务相关的部分或者全部数据,用于在需要时直接通过互联网20、接入点40向用户终端30运行的应用客户端返回,节省了从硬盘等非易失性存储介质查找数据带来的延迟,提高了数据存取的效率。
例如,对于手机游戏应用而言,服务后台10本地可以存储手机游戏的相关介绍信息,包括游戏的版本,游戏剧情、游戏角色和任务介绍等信息,当用户需要了解游戏的相关信息时可以及时向多个用户终端30的客户端返回数据。
再例如,对于动漫播放应用而言,代码生成装置本地可以存储动漫的剧情、片长和人物介绍等信息,当用户需要了解动漫的相关信息时可以及时向多个用户终端30的客户端返回数据。
如图2所示的代码生成装置20的一个可选的软硬件结构示意图,由于服务后台缓存的数据是需要供多个进程(如图1中的多个用户终端30运行的客户端程序)进行存取,服务后台在本地的共享内存中存储数据以实现数据的缓存,在服务后台的物理内存中划分出部分内存空间作为共享内存27,在共享内存27中缓存数据供多个用户终端30的客户端在共享内存中存储数据。
这里再结合图2对代码生成装置的软硬件结构进行说明,
如上所述,以代码生成装置基于用户侧终端的硬件资源实现时,参见图2示出的代码生成装置的一个可选的软硬件结构示意图,代码生成装置包括硬件层、中间层、操作系统层和软件层。然而,本领域的技术人员应当理解,图2示出的代码生成装置的结构仅为示例,并不构成对代码生成装置结构的限定。例如,代码生成装置可以根据实施需要设置较图2更多的组件,或者根据实施需要省略设置部分组件。
代码生成装置20的硬件层包括处理器21、输入/输出接口23,存储介质24以及网络接口22,组件可以经系统总线连接通信。
处理器21可以采用中央处理器(CPU)、微处理器(MCU,Microcontroller Unit)、专用集成电路(ASIC,Application Specific Integrated Circuit)或逻辑可编程门阵列(FPGA,Field-Programmable Gate Array)实现。
输入/输出接口23可以采用如显示屏、触摸屏、扬声器等输入/输出器件实现。
存储介质24可以采用闪存、硬盘、光盘等非易失性存储介质实现,也可以采用双倍率(DDR,Double Data Rate)动态缓存等易失性存储介质实现,其中存储有用以执行上述代码生成方法的可执行指令。
示例性地,存储介质24可以与代码生成装置的其他组件集中设置,也可以相对于代码生成装置中的其他组件分布设置。网络接口22向处理器21提供外部数据如异地设置的存储介质24的访问能力,示例性地,网络接口22可以基于近场通信(NFC,Near FieldCommunication)技术、蓝牙(Bluetooth)技术、紫蜂(ZigBee)技术进行的近距离通信,另外,还可以实现如基于码分多址(CDMA,Code Division Multiple Access)、宽带码分多址(WCDMA,Wideband Code Division Multiple Access)等通信制式及其演进制式的通信。
驱动层包括用于供操作系统26识别硬件层并与硬件层各组件通信的中间件15,例如可以为针对硬件层的各组件的驱动程序的集合。
操作系统26用于提供面向用户的图形界面,示例性地,包括插件图标、桌面背景和应用图标,操作系统26支持用户经由图形界面对设备的控制本发明实施例对上述设备的软件环境如操作系统类型、版本不做限定,例如可以是Linux操作系统、UNIX操作系统或其他操作系统。
如图3所示为本发明实施例提供的共享内存中实现多级缓存的一个可选的架构示意图。
根据不同数据的分级原则分为多个级别,相应地,共享内存划分为不同的级别,每个级别的共享内存中存储相应级别的数据。在图3中,从一级缓存到三级缓存按照数据的存取频率进行划分,例如从一级缓存到三级缓存中的数据的存取频率依次降低。
服务后台10在接收到来自用户终端30数据请求时,首先从一级缓存查找要需要存取的数据,如果没有命中数据请求,则从二级缓存中查找需要存取的数据,因此类推,直至在任一级缓存中命中数据请求,对数据进行存储请返回存取结果。
可以理解地,如果多级缓存中数据没有命中数据请求,则服务后台10在本地或远端的非易失性存储介质承载的数据库中查找数据并进行响应。由于存储频率的数据能够在多级缓存中命中,显著降低了数据存取的延迟,提升了数据响应性能。
通过开发的代码生成装置对用户自定义的数据结构,(例如,前述的代码1描述的数据结构)进行处理,形成Boost Inter-Process库支持的、支持存放于共享内存中的目标数据结构(如前述的代码2描述的数据结构)。
由于目标数据结构可供Boost Inter-Process库直接使用,因此可以通过BoostInter-Process库在共享内存中存储目标数据结构的存储数据,避免将数据以二进制数据流的方式存储时,由于共享内存中存储数据时就对应要进行编码和解码而导致的较高的处理器的计算资源的消耗,已经影响服务后台的服务质量的问题;
同时,由于可供Boost Inter-Process库直接使用的目标数据结构是根据代码生成装置基于用户定义的原始数据结构自动生成的,可以节约开发者使用Boost Inter-Process库的语法定义目标数据结构的过程,从而解除Boost Inter-Process库使用时带来的开发、维护成本高的技术壁垒。
在共享内存中实现多级缓存时,不可避免地需要到如何在共享内存存储数据的问题,如果在共享内存中普遍将数据以二进制数据流的方式存储,这样在共享内存中存储数据时就对应要进行编码和解码,这个过程有较高的处理器的计算资源的消耗,进而很有可能影响后台的服务质量。甚至导致在实际使用过程中还需要再加一层进程缓存,增加了数据维护和更新的成本。
为了避免上述的二进制数据流的方式存储的数据的编码和解码问题,BoostInter-Process库提供在共享内存中创建存储容器,基于容器存储数据的方案,更加方便程序在共享内容中存取数据,降低了共享内存的编解码消耗,但是使用BIP库需要开发人员付出额外的学习成本,开发以及维护的成本高,难以普及使用。
下面结合具体示例进行说明,Boost库是由C++标准委员会库公司组发起的,是C++标准库的后备。Boost Inter-Process库为共享内存的使用提供了新的方式,通过BoostInter-Process库提供的内存分配器在内存中设置容器,如前述的map、vector和list)等类型的容器,使用容器来支持数据的存取,更加方便了程序的使用,降低了共享内存的编解码消耗。
然而,使用Boost Inter-Process库在共享内存中存储容器需要较高的开发维护成本,需要对在多级缓存中实现的数据结构进行复杂的定义,下面进行说明。
以在共享内存中存储C++std系列容器为例,如果需要定义一个基本数据类型为字符(string)的vector,使用如下的代码1描述:
代码1
std::vector<std::string>myShmVector
以在共享内存中定义Boost Inter-Process库的容器为例,如果同样需要定义一个基本数据类型为string的vector,则需要使用如下方式进行同样的定义:
Boost Inter-Process库允许在共享内存和内存映射文件上创建复杂对象。例如,可以在共享内存上构造容器。只需创建一个共享内存,然后声明一个Boost Inter-Process库分配器(后续也简称为分配器),然后就可在共享内存上采用与创建普通对象一样的方式构建vector,从而可供不同的程序访问。
例如,如果需要在共享内存构建基本数据类型为string的vector,使用如下的代码2:
using namespace boost::Inter-Process;
//定义基本数据类型为char的分配器的别名
typedef allocator<char,managed_shared_memory::segment_manager>CharAllocator;
//使用char类型的分配器定义基本类型为string的vector
typedef basic_string<char,std::char_traits<char>,CharAllocator>MyShmString;
//定义基本数据类型为string类型分配器的别名
typedef
allocator<MyShmString,managed_shared_memory::segment_manager>StringShmAllocator;
//使用string类型的分配器定义基本类型为string的vector
typedef vector<MyShmString,StringShmAllocator>myShmVector;
由此可见,实现Boost Inter-Process库的容器与C++std容器的主要区别在于,实现Boost Inter-Process库时,需要进行不同数据类型的分配器的别名的定义,如前述的字符(char)类型的分配器、string类型分配器的别名的定义,已经使用相应类型的分配器定义相应数据类型的向量,导致使用Boost Inter-Process库在共享内存中存储容器时,需要额外付出的开发成本,这影响了在共享内存中实现多级缓存的效率。
针对上述问题,本发明实施例提供代码生成方法。参见图4示出的本发明实施例提供的代码生成方法的一个可选的流程示意图,包括以下步骤:
步骤101,分析源文件中的代码,得到所述源文件中定义的用于在共享内存中实现的原始数据结构。
在一个实施例中,源文件是以C++std标准描述的需要在共享内存中实现的数据结构,源文件中支持定义多个不同类型的数据结构;源文件中对于原始的数据结构的定义需要遵从C++std标准描述规范,例如在源文件中结构体、容器定义需要闭合,另外,需要在共享内存中实现的数据结构在源文件的起始位置定义。
在一个实施例中,分析所述源文件之前,对所述源文件进行语法检测,例如括号未闭合;语法错误;未知的数据类型等,并在检测语法错误时输出错误提示,实现确保源文件的语法正确性的效果。
步骤102,确定各所述原始数据结构包括的基本数据类型,声明增进进程间通信库中对应各所述基本数据类型的分配器,并生成相应分配器别名。
可以理解地,原始数据结构中可以包括一个或多个基本数据类型,例如,可以通过包括string、int和double等基本数据类型。
以定义基本数据类型为char的分配器的别名为例,可以通过如下的代码实现:
typedef allocator<char,managed_shared_memory::segment_manager>CharAllocator;
步骤103,基于所述分配器别名,生成与相应原始数据结构对应的目标数据结构。
在一个实施例中,对于源文件中包括的各个数据结构,通过逐行分析源文件,对于源文件中包括的各个数据结构,对应生成新的数据结构也即目标数据结构中所包括的数据类型对应的分配器的别名,生成新的数据结构也即目标数据结构的代码描述。如前述的代码1和代码2,目标数据结构的代码描述存在于同名的以.h结尾的头文件中,从而可以被用户程序直接使用。
步骤104,确定各所述目标数据结构对应的分配器定义有相应的分配器别名。
在一个实施例中,目标数据结构是否定义有分配器别名,是指目标数据结构表中包括的数据类型的分配器是否已经定义有相应的分配器别名。通过分析出各目标数据结构所包括的数据类型,判断出当前数据类型对应的分配器是否已经定义有别名:
1)如果判断出当前目标数据结构中各数据类型均已经定义有别名,则继续分析下一个目标数据结构,直至分析完毕所有目标数据结构。
2)如果判断出当前目标数据结构中数据类型未定义有分配器别名,则根据当前目标数据结构对应的原始数据结构,分析原始数据结构包括的数据类型:
2.1)_如果没有分析出,说明原始数据结构的语法定义有问题,异常退出并提示用户原始数据结构中出问题的行号;
2.2)如果分析出,则判断相应数据类型是否已被声明相应的分配器:
2.2.1)如果未声明,将相应的数据类型添加为新基本数据类型,生成对应所述新基本数据类型的分配器别名。另外,将该新数据类型作为再次判断目标数据结构中数据结构是否定义有分配器别名时优先处理的数据类型,从而,能够尽快确认该目标数据结构中各数据类型对应的分配器已经定义有别名。
2.2.2)如果已经声明,根据判断为未定义有相应分配器别名的数据类型,生成相应数据类型的分配器别名。
步骤105,将各所述目标数据结构对应的分配器别名、以及对应的增进进程间通信库数据结构输出为目标文件中的代码。
在一个实施例中,目标文件中的代码是针对目标数据结构的代码化描述,符合Boost Inter-Process库在共享内存中存储容器的语法描述,因此可以被Boost Inter-Process库直接读取识别。相应地,调用增进进程间通信库应用程序接口,将所述目标文件添加到共享内存中,基于所述目标文件中的目标数据结构存储数据,同时由于是在共享内存中基于目标数据结构存储数据,可以支持不同进程存取数据。
本发明实施例还提供用于执行前述代码执行方法的代码生成装置,本发明实施例提供的本代码生成装置可以采用各种方式实施,例如,可以实施为前述的服务平台中的代码生成功能模块,使用服务后台中的硬件资源(如处理器等计算资源)运行响应的可执行指令实施代码生成方法。
当然,代码生成装置也可以实施为独立于服务后台的代码生成设备,如图5示出的代码生成装置50的一个可选的硬件结构示意图,包括:处理器54、输入/输出接口56(例如显示器、键盘、触摸屏、扬声器麦克风中的一个或多个),存储介质57以及网络接口55,组件可以经系统总线58连接通信。
存储介质可以为ROM(例如,只读存储器、FLASH存储器、转移装置等)、磁存储介质(例如,磁带、磁盘驱动器等)、光学存储介质(例如,CD-ROM、DVD-ROM、纸卡、纸带等)以及其他熟知类型的程序存储器,其中存储有用于执行代码生成方法的可执行指令。
需要说明的是,代码生成装置中的各模块也可以部署在同一实体设备中,当然代码生成装置中的硬件功能模块可以分布式实施的,例如其中的部分模块分布实施在不同的区域并设置相应的通信接口,通过任何可用的通信方式如蜂窝、专用电缆、互联网或局域网等方式通信。例如,代码生成设备中的存储介质分布在不同的区域,并通过部署为分布式数据库的方式向处理器提供访问。
对前述代码生成装置的功能结构进行说明,参见图6示出的本发明实施例提供的代码生成装置60的一个可选的功能结构示意图,包括:分析单元61、别名单元62、生成单元63、确定单元64、输出单元65和调用单元66,下面分别进行说明。
分析单元61,用于分析源文件中的代码,得到所述源文件中定义的用于在共享内存中实现的原始数据结构。
在一个实施例中,所述分析单元61,还用于分析所述源文件之前,对所述源文件进行语法检测,并在检测语法错误时输出错误提示。
源文件是以C++std标准描述的需要在共享内存中实现的数据结构,源文件中支持定义多个不同类型的数据结构;源文件中对于原始的数据结构的定义需要遵从C++std标准描述规范,例如在源文件中结构体、容器定义需要闭合,另外,需要在共享内存中实现的数据结构在源文件的起始位置定义。
别名单元62,用于确定各所述原始数据结构包括的基本数据类型,可以理解地,原始数据结构中可以包括一个或多个基本数据类型,例如,可以通过包括string、int和double等基本数据类型,别名单元62声明增进进程间通信库中对应各所述基本数据类型的分配器,并生成相应分配器别名。
以定义基本数据类型为char的分配器的别名为例,可以通过如下的代码实现:
typedef allocator<char,managed_shared_memory::segment_manager>CharAllocator;
生成单元63,用于基于所述分配器别名,生成与相应原始数据结构对应的目标数据结构。
在一个实施例中,生成单元63对于源文件中包括的各个数据结构,通过逐行分析源文件,对于源文件中包括的各个数据结构,对应生成新的数据结构也即目标数据结构中所包括的数据类型对应的分配器的别名,生成新的数据结构也即目标数据结构的代码描述。如前述的代码1和代码2,目标数据结构的代码描述存在于同名的以.h结尾的头文件中,从而可以被用户程序直接使用。
确定单元64,确定各所述目标数据结构对应的分配器定义有相应的分配器别名。
在一个实施例中,目标数据结构是否定义有分配器别名,是指目标数据结构表中包括的数据类型的分配器是否已经定义有相应的分配器别名。通过分析出各目标数据结构所包括的数据类型,判断出当前数据类型对应的分配器是否已经定义有别名:
1)如果判断出当前目标数据结构中各数据类型均已经定义有别名,则继续分析下一个目标数据结构,直至分析完毕所有目标数据结构。
2)如果判断出当前目标数据结构中数据类型未定义有分配器别名,则根据当前目标数据结构对应的原始数据结构,分析原始数据结构包括的数据类型:
2.1)_如果没有分析出,说明原始数据结构的语法定义有问题,异常退出并提示用户原始数据结构中出问题的行号;
2.2)如果分析出,则判断相应数据类型是否已被声明相应的分配器:
2.2.1)如果未声明,将相应的数据类型添加为新基本数据类型,生成对应所述新基本数据类型的分配器别名。另外,将该新数据类型作为再次判断目标数据结构中数据结构是否定义有分配器别名时优先处理的数据类型,从而,能够尽快确认该目标数据结构中各数据类型对应的分配器已经定义有别名。
2.2.2)如果已经声明,根据判断为未定义有相应分配器别名的数据类型,生成相应数据类型的分配器别名。
输出单元65,用于将各所述目标数据结构对应的分配器别名、以及对应的增进进程间通信库数据结构输出到目标文件中的代码。
在一个实施例中,目标文件中的代码是针对目标数据结构的代码化描述,符合Boost Inter-Process库在共享内存中存储容器的语法描述,因此可以被Boost Inter-Process库直接读取识别。
在一个实施例中,还包括:调用单元66,用于调用增进进程间通信库应用程序接口,将所述目标文件添加到共享内存中,基于所述目标文件中的目标数据结构支持不同进程存取数据。
对于在服务器后台的共享内存中设置目标数据结构来说,通过调用增进进程间通信库应用程序接口,将所述目标文件添加到共享内存中,基于所述目标文件中的目标数据结构存储数据,同时由于是在共享内存中基于目标数据结构存储数据,可以支持不同进程存取数据。
以下结合图7对代码生成装置根据用户定义的原始数据结构生成目标数据结构的实现过程进行说明,包括如下几个阶段。
阶段一、代码生成装置接收用户提交的源文件。
这里,源文件是用户在以“.bip”结尾的文件,其中用户自定义需要在共享内存中使用的原始的数据结构,此数据结构需要在共享内存中实现。
对数据结构的定义存储于以.bip结尾的文件(后续也称为bip文件),bip文件中支持定义多个不同类型的数据结构;在bip文件中对于原始的数据结构的定义需要遵从特定规范,bip文件关于数据结构的定义的一个代码描述如下:
代码3
在上述代码3中,命名空间(namespace)后的值“nsp”指的是数据结构所在的命名空间,满足如下的特定规范:
1)结构体(struct)内部定义方式和C++std容器用法相同;
2)定义容器时“<>“必须要闭合;
3)struct需要闭合;
4)用户需要使用到的数据结构需要定义在bip文件中的开始位置,比如在代码3中的结构体data_in_shm中使用数据结构complex_data,所以数据结构complex_data需要在代码3的开始位置定义。
阶段二、代码自动生成装置析用户生成的bip文件,进行语法检测,如果检测到语法错误则停止执行并报错,提示用户bip文件中存在语法错误。
对bip文件进行语法错误检测,包括:括号未闭合;语法错误;未知的数据类型等。
阶段三、语法检测通过后,根据用户在bip文件(源文件)中定义的数据结构(也称为原始数据结构或基本数据结构),生成与数据结构对应的分配器的别名,利用生成的分配器的别名生成新的数据结构(也称为目标数据结构),目标数据结构实质上也就是目标数据结构的代码描述,如代码1和代码2,目标数据结构的代码描述存在于同名的以.h结尾的头文件中,可以被用户程序直接使用。
下面再对阶段三的实现过程进行说明。
步骤1、首先,分析bip文件得到bip文件中所涉及的基本的数据类型,对于bip文件中涉及的基本数据类型,生成相应基本数据类型的分配器的别名。
例如,这里所涉及的基本数据类型主要包括int、char和double等数据类型。
步骤2、其次,逐行分析bip文件,对于bip文件中包括的各个数据结构,对应生成新的数据结构也即目标数据结构。
对于bip文件中包括的各个数据结构,通过数据结构中所包括的数据类型对应的分配器的别名,生成新的数据结构也即目标数据结构的代码描述,如代码1和代码2。
以“;”隔离的所有目标数据结构;把目标数据结构是否定义有分配器别名的信息写入目标数据结构表中。
目标数据结构是否定义有分配器别名,是指目标数据结构表中包括的数据类型的分配器是否已经定义有相应的分配器别名。
例如,在图7中,对于基本数据类型为字符(string)的vector,以二进制1表示数据类型string的对应的分配器已经定义有别名;对于map<string,vector<int>>,以二进制1表示该数据结构中的数据类型string、int对应的分配器已经定义有别名;对于structcomplex_data,以二进制0表示该数据结构包括的数据类型的分配器未定义有别名。
步骤3、筛选每个目标数据结构,分析出每个目标数据结构所包括的数据类型,遍历每个目标数据结构的数据类型,判断各数据类型对应的分配器是否已经定义有别名,如果是,则继续分析下一个目标数据结构,直至分析完毕所有目标数据结构,进入步骤6;如果否,则进入步骤4。
步骤4,递归加循环分析此目标数据结构的原始数据结构包括的数据类型,并进行分析处理,判断是否分析出原始数据结构包括的数据类型:
如果没有分析出,说明原始数据结构的语法定义有问题,异常退出并提示用户原始数据结构中出问题的行号;
如果分析出原始数据结构包括的数据类型,进入步骤5。
原始数据结构与目标数据结构对应,代码生成装置根据用户在bip文件中定义的原始数据结构形成对应的目标数据结构。
例如,对于代码1描述的目标数据结构而言,分析对应的原始数据结构可以得知包括数据类型string,对于代码3描述的目标数据结构而言,分析对应的原始数据结构可以得到包括complex_map。
步骤5,判断原始数据结构包括的数据类型对应的分配器是否被声明:
如果未声明,则将步骤3中判断为未定义有相应分配器别名的数据类型添加为新的基本数据类型,以生成针对该新基本数据类型的分配器的别名,同时,将该新数据类型作为在再次执行步骤4优先处理的数据类型,从而,能够尽快确认该目标数据结构中各数据类型对应的分配器已经定义有别名;进入步骤3继续处理下一个目标数据结构;
如果已经声明,则针对步骤3中判断为未定义有相应分配器别名的数据类型,生成相应数据类型的分配器的别名;进入步骤6。
步骤6,将生成的目标数据结构的分配器别名以及对应的Boost Inter-Process)库数据结构,输出为目标文件中的代码描述,进入步骤3继续分析下一个目标数据结构。
例如,遇到目标数据类型vector<T>,则生成如下代码:
typedef vector<T,TShmAllocator>myTVector;
如上:对于vector类型的数据结构,未加粗黑色字符是固定的(代码中内置string/set/vector/map四种容易类型对应的基本字符),加粗部分T为容器的基本数据类型。IntShmAllocator是基本数据类型int对应的分配器的别名。
用户代码包含生成的.h文件,然后直接使用生成好的目标数据结构即可,这些目标数据结构可以直接通过Boost Inter-Process库应用程序接口(API,ApplicationProgram Interface)放入共享内存中用以存储数据,例如支持多个进程存取数据,以此达到多级缓存最好的使用效果—更加安全和方便。
在共享内存中使用上面数据结构的方法如下:
//在共享内存中构造myShmVector类型的数据结构
myShmVector*mydata=segment.construct<myShmVector>
("MyVector")(alloc_inst);
对*mydata可进行存取操作。
综上所述,本发明实施例具有如下有益效果:
在本发明实施例中,通过开发的代码生成装置对用户自定义的数据结构,(例如,前述的代码1描述的数据结构)进行处理,形成Boost Inter-Process库支持的、支持存放于共享内存中的目标数据结构(如前述的代码2描述的数据结构)。
由于目标数据结构可供Boost Inter-Process库直接使用,因此可以通过BoostInter-Process库在共享内存中存储目标数据结构的存储数据,避免将数据以二进制数据流的方式存储时,由于共享内存中存储数据时就对应要进行编码和解码而导致的较高的处理器的计算资源的消耗,已经影响服务后台的服务质量的问题;
同时,由于可供Boost Inter-Process库直接使用的目标数据结构是根据代码生成装置基于用户定义的原始数据结构自动生成的,可以节约开发者使用Boost Inter-Process库的语法定义目标数据结构的过程,从而解除Boost Inter-Process库使用时带来的开发、维护成本高的技术壁垒。
本领域的技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于一计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:移动存储装置、随机存取存储器(RAM,Random Access Memory)、只读存储器(ROM,Read-Only Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
或者,本发明上述集成的单元如果以软件功能模块的形式实现并作为独立的产品销售或使用时,也可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明实施例的技术方案本质上或者说对相关技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机装置(可以是个人计算机、服务器、或者网络装置等)执行本发明各个实施例所述方法的全部或部分。而前述的存储介质包括:移动存储装置、RAM、ROM、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述权利要求的保护范围为准。
Claims (15)
1.一种代码生成方法,其特征在于,包括:
分析源文件中的代码,得到所述源文件中定义的用于在共享内存中实现的原始数据结构;
确定各所述原始数据结构包括的基本数据类型,声明增进进程间通信库中对应各所述基本数据类型的分配器,并生成相应分配器别名;
基于所述分配器别名,生成与相应原始数据结构对应的目标数据结构所包括的数据类型对应的分配器别名;
确定各所述目标数据结构所包括的数据类型对应的分配器定义有相应的分配器别名;
将各所述目标数据结构所包括的数据类型对应的分配器别名、以及对应的增进进程间通信库数据结构输出为目标文件中的代码;
其中,所述目标文件中的代码为针对所述目标数据结构的代码化描述,且符合所述增进进程间通信库在所述共享内存中存储容器的语法描述。
2.如权利要求1所述的方法,其特征在于,还包括:
分析所述源文件之前,对所述源文件进行语法检测,并在检测语法错误时输出错误提示。
3.如权利要求1所述的方法,其特征在于,还包括:
调用增进进程间通信库应用程序接口,将所述目标文件添加到共享内存中,基于所述目标文件中的目标数据结构支持不同进程存取数据。
4.如权利要求1所述的方法,其特征在于,所述确定各所述目标数据结构所包括的数据类型对应的分配器定义有相应的分配器别名,包括:
分析出各目标数据结构所包括的数据类型,判断出各数据类型对应的分配器已经定义有别名时,继续分析下一个目标数据结构,直至分析完毕所有目标数据结构。
5.如权利要求4所述的方法,其特征在于,还包括:
判断出当前目标数据结构中存在数据类型未定义有分配器别名时,根据当前目标数据结构对应的原始数据结构包括的数据类型,判断相应数据类型是否已被声明相应的分配器,如果未声明,将相应的数据类型添加为新基本数据类型,生成对应所述新基本数据类型的分配器别名。
6.如权利要求5所述的方法,其特征在于,还包括:
如果已经声明,根据判断为未定义有相应分配器别名的数据类型,生成相应数据类型的分配器别名。
7.如权利要求5所述的方法,其特征在于,还包括:
当根据当前目标数据结构对应的原始数据结构,未分析出相应原始数据结构包括的数据类型时,异常退出并提示所述原始数据结构中的出错位置。
8.一种代码生成装置,其特征在于,包括:
分析单元,用于分析源文件中的代码,得到所述源文件中定义的用于在共享内存中实现的原始数据结构;
别名单元,用于确定各所述原始数据结构包括的基本数据类型,声明增进进程间通信库中对应各所述基本数据类型的分配器,并生成相应分配器别名;
生成单元,基于所述分配器别名,生成与相应原始数据结构对应的目标数据结构所包括的数据类型对应的分配器别名;
确定单元,确定各所述目标数据结构所包括的数据类型对应的分配器定义有相应的分配器别名;
输出单元,用于将各所述目标数据结构所包括的数据类型对应的分配器别名、以及对应的增进进程间通信库数据结构输出为目标文件中的代码;
其中,所述目标文件中的代码为针对所述目标数据结构的代码化描述,且符合所述增进进程间通信库在所述共享内存中存储容器的语法描述。
9.如权利要求8所述的装置,其特征在于,
所述分析单元,还用于分析所述源文件之前,对所述源文件进行语法检测,并在检测语法错误时输出错误提示。
10.如权利要求8所述的装置,其特征在于,还包括:
调用单元,用于调用增进进程间通信库应用程序接口,将所述目标文件添加到共享内存中,基于所述目标文件中的目标数据结构支持不同进程存取数据。
11.如权利要求8所述的装置,其特征在于,
所述确定单元,还用于分析出各目标数据结构所包括的数据类型,判断出各数据类型对应的分配器已经定义有别名时,继续分析下一个目标数据结构,直至分析完毕所有目标数据结构。
12.如权利要求11所述的装置,其特征在于,
所述确定单元,还用于判断出当前目标数据结构中数据类型未定义有分配器别名时,根据当前目标数据结构对应的原始数据结构包括的数据类型,判断相应数据类型是否已被声明相应的分配器,如果未声明,将相应的数据类型添加为新基本数据类型,生成对应所述新基本数据类型的分配器别名。
13.如权利要求12所述的装置,其特征在于,
所述确定单元,还用于如果已经声明,根据判断为未定义有相应分配器别名的数据类型,生成相应数据类型的分配器别名。
14.如权利要求12所述的装置,其特征在于,
所述确定单元,还用于当根据当前目标数据结构对应的原始数据结构,未分析出相应原始数据结构包括的数据类型时,异常退出并提示所述原始数据结构中的出错位置。
15.一种存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1-7任一项所述的代码生成方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201611000637.6A CN106502707B (zh) | 2016-11-14 | 2016-11-14 | 代码生成方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201611000637.6A CN106502707B (zh) | 2016-11-14 | 2016-11-14 | 代码生成方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN106502707A CN106502707A (zh) | 2017-03-15 |
CN106502707B true CN106502707B (zh) | 2020-05-19 |
Family
ID=58324368
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201611000637.6A Active CN106502707B (zh) | 2016-11-14 | 2016-11-14 | 代码生成方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN106502707B (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109445771B (zh) * | 2018-10-25 | 2021-06-15 | 北京和普威视科技股份有限公司 | 一种cs架构下网络层模块代码自动生成工具及方法 |
CN111858258A (zh) * | 2020-07-29 | 2020-10-30 | 浪潮电子信息产业股份有限公司 | 一种内存监控方法、装置及电子设备和存储介质 |
CN113407631B (zh) * | 2021-06-24 | 2023-09-08 | 深圳智多豚物联技术有限公司 | 基于kafka与哈希共享内存的分布式数据中心 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103246671A (zh) * | 2012-02-09 | 2013-08-14 | 中兴通讯股份有限公司 | 抽象语法标记文件的处理方法及装置 |
CN105072130B (zh) * | 2015-08-26 | 2018-03-06 | 广州慧睿思通信息科技有限公司 | 一种asn.1解码器代码自动生成方法 |
-
2016
- 2016-11-14 CN CN201611000637.6A patent/CN106502707B/zh active Active
Also Published As
Publication number | Publication date |
---|---|
CN106502707A (zh) | 2017-03-15 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US8626786B2 (en) | Dynamic language checking | |
US9292253B2 (en) | Methods and apparatus for voiced-enabling a web application | |
US9400633B2 (en) | Methods and apparatus for voiced-enabling a web application | |
WO2019085474A1 (zh) | 计算引擎实现方法、电子装置及存储介质 | |
US9781262B2 (en) | Methods and apparatus for voice-enabling a web application | |
CN106648569B (zh) | 目标序列化实现方法和装置 | |
US10157612B2 (en) | Methods and apparatus for voice-enabling a web application | |
US11048885B2 (en) | Cognitive translation service integrated with context-sensitive derivations for determining program-integrated information relationships | |
CN105573734B (zh) | 一种用于提供sdk文件的方法与设备 | |
US20190087208A1 (en) | Method and apparatus for loading elf file of linux system in windows system | |
US9292252B2 (en) | Methods and apparatus for voiced-enabling a web application | |
CN106502707B (zh) | 代码生成方法及装置 | |
CN113204345A (zh) | 页面生成方法、装置、电子设备及存储介质 | |
CN115599386A (zh) | 代码生成方法、装置、设备及存储介质 | |
CN113778897B (zh) | 接口的自动测试方法、装置、设备及存储介质 | |
CN110888972A (zh) | 一种基于Spark Streaming的敏感内容识别方法及装置 | |
CN111240790A (zh) | 一种应用的多语言适配方法、装置、客户端和存储介质 | |
US20230419036A1 (en) | Random token segmentation for training next token prediction models | |
US20230418566A1 (en) | Programmatically generating evaluation data sets for code generation models | |
CN112925523B (zh) | 对象比较方法、装置、设备及计算机可读介质 | |
CN111400623B (zh) | 用于搜索信息的方法和装置 | |
US9697018B2 (en) | Synthesizing inputs to preserve functionality | |
CN112068814A (zh) | 可执行文件的生成方法、装置、系统及介质 | |
CN116955209B (zh) | WebAssembly虚拟机的测试方法和装置 | |
US12014155B2 (en) | Constrained prefix matching for generating next token predictions |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |