CN114489653A - 基于编译器的数据处理方法、装置以及可读存储介质 - Google Patents

基于编译器的数据处理方法、装置以及可读存储介质 Download PDF

Info

Publication number
CN114489653A
CN114489653A CN202011166281.XA CN202011166281A CN114489653A CN 114489653 A CN114489653 A CN 114489653A CN 202011166281 A CN202011166281 A CN 202011166281A CN 114489653 A CN114489653 A CN 114489653A
Authority
CN
China
Prior art keywords
annotation
target
code
compiler
target annotation
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.)
Pending
Application number
CN202011166281.XA
Other languages
English (en)
Inventor
徐旭栋
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Tencent Technology Shenzhen Co Ltd
Original Assignee
Tencent Technology Shenzhen Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Tencent Technology Shenzhen Co Ltd filed Critical Tencent Technology Shenzhen Co Ltd
Priority to CN202011166281.XA priority Critical patent/CN114489653A/zh
Publication of CN114489653A publication Critical patent/CN114489653A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/33Intelligent editors

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Stored Programmes (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

本申请公开了一种基于编译器的数据处理方法、装置以及可读存储介质,该基于编译器的数据处理方法包括:获取源代码中的目标注解;通过编译器加载注解处理插件,获取所述注解处理插件中与所述目标注解对应的目标注解代码;根据所述目标注解代码生成用于描述所述目标注解的数据结构的目标注解列表,对所述目标注解列表进行转译处理,生成所述源代码对应的中间代码;通过所述编译器生成所述中间代码对应的目标文件。采用本申请,可以提升开发效率。

Description

基于编译器的数据处理方法、装置以及可读存储介质
技术领域
本申请涉及计算机技术领域,尤其涉及基于编译器的数据处理方法、装置以及可读存储介质。
背景技术
现有的技术为编程语言提供了注解的能力,程序可以通过注解获取类、字段、方法等程序元素的相关信息,开发人员则可以利用注解跟踪源代码中的依赖性。然而,对Objective-C(扩充C的面向对象编程语言)等编程语言进行注解的现有方案,在使用过程中会存在引入第三方依赖框架以及头文件等操作,造成组件开发或应用开发时的开发效率过低。
发明内容
本申请提供了一种基于编译器的数据处理方法、装置以及可读存储介质,可以提升开发效率。
本申请一方面提供了一种基于编译器的数据处理方法,包括:
获取源代码中的目标注解;
通过编译器加载注解处理插件,获取所述注解处理插件中与所述目标注解对应的目标注解代码;
根据所述目标注解代码生成用于描述所述目标注解的数据结构的目标注解列表,对所述目标注解列表进行转译处理,生成所述源代码对应的中间代码;
通过所述编译器生成所述中间代码对应的目标文件。
本申请一方面提供了一种基于编译器的数据处理装置,包括:
注解获取模块,用于获取源代码中的目标注解;
代码获取模块,用于通过编译器加载注解处理插件,获取所述注解处理插件中与所述目标注解对应的目标注解代码;
代码生成模块,用于根据所述目标注解代码生成用于描述所述目标注解的数据结构的目标注解列表,对所述目标注解列表进行转译处理,生成所述源代码对应的中间代码;
文件生成模块,用于通过所述编译器生成所述中间代码对应的目标文件。
其中,所述代码获取模块包括:
分析单元,用于通过所述注解处理插件对所述目标注解进行分析,生成初始注解列表;所述初始注解列表包括所述目标注解的基础描述标识;
匹配单元,用于根据所述初始注解列表,在所述注解处理插件中的注解库中,查找与所述基础描述标识相匹配的注解代码,作为目标注解代码;所述注解库中的注解代码为针对注解的实现代码。
其中,所述代码生成模块包括:
更新单元,用于根据所述目标注解代码对所述初始注解列表进行更新,得到目标注解列表;所述目标注解列表包括携带有所述目标注解的详情信息的数据结构;
转译单元,用于对所述目标注解列表中的所述数据结构进行转译处理,生成所述目标注解的业务逻辑;在过渡中间代码中对所述业务逻辑进行代码插桩,生成所述源代码对应的中间代码;所述过渡中间代码由所述编译器对工程代码进行编译得到,所述工程代码为所述源代码中除了所述目标注解之外的代码。
其中,所述装置还包括:
检测模块,用于调用所述注解处理插件对所述目标注解进行错误检测,若检测到所述目标注解不满足注解协议,则调用所述编译器进行报错处理。
其中,所述检测模块具体用于当所述注解处理插件检测到所述目标注解的编写格式不满足所述注解协议中的编写格式,或者,所述注解处理插件检测到所述目标注解存在错误拼写,或者,所述注解处理插件检测到所述目标注解中的注解参数的类型错误时,确定所述目标注解不满足所述注解协议。
其中,所述装置还包括:
注册模块,用于若从所述目标注解中获取到服务信息,则根据所述服务信息生成描述文件;所述服务信息用于描述目标组件提供的开放服务;当所述目标组件被集成到应用工程时,根据所述描述文件将所述服务信息集成到资源锁定文件中,调用命令行工具将所述资源锁定文件中的所述服务信息转换成服务代码,将所述服务代码插入到所述应用工程中;通过所述服务代码调用业务框架,在运行时注册所述开放服务。
其中,所述目标注解包括目标应用程序的界面颜色属性;所述界面颜色属性是通过所述目标注解对所述源代码中的初始界面颜色属性进行修改所得到的;所述装置还包括:
颜色更新模块,用于通过链接器获取所述目标文件,在所述链接器中将所述目标文件转换为可执行程序;运行所述可执行程序,根据所述界面颜色属性,更新所述目标应用程序的界面颜色。
本申请一方面提供了一种基于编译器的数据处理装置,包括:处理器和存储器;
所述处理器和存储器相连,其中,所述存储器用于存储计算机程序,所述处理器用于调用所述计算机程序,以执行如本申请中一方面中的方法。
本申请一方面提供了一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序包括程序指令,所述程序指令当被处理器执行时,执行如本申请中一方面中的方法。
本申请可以通过获取源代码中的目标注解,并通过编译器加载注解处理插件,进而可以通过注解处理插件对目标注解进行分析和匹配,获取目标注解对应的目标注解代码,进一步可以根据目标注解代码生成目标注解列表,并对目标注解列表进行转译处理,从而可以生成源代码对应的中间代码,并通过编译器生成中间代码对应的目标文件。由此可见,本申请提供的方法可以提供编译器级别的注解,且可以通过编译器自动生成包含有注解的业务逻辑的中间代码,而无需额外的代码支持,也无需引入第三方依赖框架以及头文件,极大提升了开发效率。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本申请提供的一种系统架构示意图;
图2是本申请提供的一种基于编译器的数据处理方法的场景示意图;
图3是本申请提供的一种基于编译器的数据处理方法的流程示意图;
图4是本申请提供的另一种基于编译器的数据处理方法的流程示意图;
图5是本申请提供的一种注解信息传递过程的流程示意图;
图6是本申请提供的一种基于编译器的数据处理装置的结构示意图;
图7是本申请提供的另一种基于编译器的数据处理装置的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
请参见图1,是本申请提供的一种系统架构示意图。如图1所示,该系统架构可以包括服务器100、终端设备200a、终端设备200b和终端设备200c。其中,服务器100可以通过网络与终端设备200a、终端设备200b和终端设备200c进行数据传输,每个终端设备均可以安装各式各样的应用程序(或可称为软件),如即时通信应用、游戏类应用、视频类应用、音乐类应用等,这些应用可以通过下载开发人员发布的安装包得到。因此,每个终端设备均可以通过应用对应的客户端与服务器100进行数据传输,如服务器100可以向每个终端设备发送应用更新信息,终端设备可以响应用户录入的更新操作,通过服务器100下载最新的安装包进行版本更新。终端设备可以包括手机、平板电脑、笔记本电脑、掌上电脑、移动互联网设备(mobile internet device,MID)、可穿戴设备(例如智能手表、智能手环等)。
其中,通过开发工具对编写完成的源代码进行编译、链接以及运行测试等步骤后,可以将整个项目打包成一个安装包,并发布出去供用户下载使用。其中,计算机程序(Computer program),也成为软件(software),简称程序(Program),是一组指示计算机或其他具有信息处理能力的装置执行每一步动作的指令,通常用某种程序设计语言编写,运行于某种目标体系结构上。源代码即是指采用某种程序设计语言编写的最原始程序的代码。具体请一并参见图2,是本申请提供的一种基于编译器的数据处理方法的场景示意图。如图2所示,该场景以图1所对应实施例中的服务器100以及终端设备200a为例,在开发新版本应用程序的项目中,开发工具可以获取开发人员编写的源代码,源代码中可以包括注解以及工程代码,工程代码是指源代码中除了注解之外的代码,例如图2所示源代码中的300a、300b,注解300a即为工程代码300b的注解。其中,可以对源代码中的程序元素进行注解,程序元素可以包括类、字段、方法、包、变量、方法或参数等,注解通常声明在程序元素的前面,用来对这些元素进行说明或注释,并与这些元素信息关联。在传统的开发过程中,可能需要开发人员修改很多代码才能实现应用程序的更新,但通过本申请提供的方法,开发人员可以通过注解来简化代码,并且注解支持的参数类型可以包括但不限于字符串、数字、类、枚举类型,例如,可以通过注解对源代码中的初始页面颜色属性进行修改,将应用程序的界面颜色属性由“白色”修改为“灰色”。进一步,由于机器无法识别用程序设计语言编写的源代码,故而可以调用编译器对源代码进行编译,具体的,可以将注解从源代码中提取出来,并通过编译器加载注解处理插件对上述注解进行相关处理,生成运行时注解的业务逻辑,同时编译器也可以对源代码中除了注解之外的代码进行编译,生成过渡中间代码,并将上述业务逻辑和过渡中间代码进行组装,得到源代码对应的中间代码,进而可以通过编译器生成中间代码对应的目标文件,此时的目标文件为机器可以识别的二进制文件,进一步,将目标文件传送至链接器,链接器可以将整个项目中相关联的目标文件以及一些函数库组合在一起,生成可执行程序,链接器执行的操作可称为“链接”,在开发工具或其他设备上运行上述可执行程序,在测试通过后,可以通过开发工具将项目打包为一个安装包,并可以通过服务器100将该安装包发布到相关网络平台上(例如终端设备200a的应用商店),在平台审核通过后,服务器100可以获取上述应用程序的更新信息,并将更新信息发送至终端设备200a进行显示,更新信息可以包括应用程序的版本号、优化或新增功能的简介等信息,终端设备200a可以相应用户录入的更新操作,例如响应针对“升级”按钮的触发操作,通过服务器100下载上述更新后的安装包,并将其安装在终端设备200a中以进行该应用程序的版本更新。例如,终端设备200a安装了更新后的即时通信应用A1,在打开即时通信应用A1后,可以在操作系统上运行即时通信应用A1对应的可执行程序,响应进入聊天页面的相关操作,终端设备200a可以获取即时通信应用A1的界面颜色属性,并根据界面颜色属性显示更新后的聊天页面a2,可以看到聊天页面的背景颜色,由初始聊天页面a1中的白色更新为聊天页面a2中的灰色。
由此可见,本申请可以通过获取源代码中的注解,并通过编译器加载注解处理插件,进而可以通过注解处理插件对注解进行处理,从而可以生成源代码对应的中间代码,并通过编译器生成中间代码对应的目标文件。由此可见,本申请提供的方法可以提供编译器级别的注解,且可以通过编译器自动生成包含有注解的业务逻辑的中间代码,而无需额外的代码支持,也无需引入第三方依赖框架以及头文件,极大提升了开发效率。
请参见图3,是本申请提供的一种基于编译器的数据处理方法的流程示意图。该方法可以包括以下步骤:
步骤S101,获取源代码中的目标注解;
具体的,编译器可以获取源代码中的目标注解,源代码中可以包括目标注解以及工程代码,其中,工程代码为源代码中除了目标注解之外的代码。注解是指源代码中按照注解协议编写的用于对程序元素进行注解的代码,即注解可以理解为源代码中的特殊标志,这些标志可以在编译、类加载或运行时被读取,并执行相应的处理,以便其它工具补充信息或者进行部署。注解协议主要用于区分注解与其它代码,并且还可以根据注解协议的具体规定从源代码中识别出所有注解。因此,注解协议的具体规定可以根据实际需要来设定,例如采用预先约定的特殊的标识、或者采用预先约定的关键字、或者采用预先约定的编写格式、或者编写在预先约定的特殊的位置、或者其他预先约定的语法规则等,本申请在此不做限定。例如可以参见下面用Objective-C(Objective C或Obj-C,是扩充C的面向对象编程语言)编写的部分源代码:
NS_ASSUME_NONNULL_BEGIN
@protocol RABasicProtocol<NSObject>
@end
__attribute__((raft(service)));
__attribute__((raft(interface=RABasicProtocol,RACustomProtocol)));
@interface RAFTBasicService:NSObject<RABasicProtocol>
__attribute__((raft(property)));
@property(nonatomic,strong)NSString*name;
__attribute__((raft(property)));
@property(nonatomic,strong)NSString*version;
__attribute__((raft(initmethod)));
-(instancetype)initWinthVersion:(NSString*)version
name:(NSString*)name;
__attribute__((raft(method)));
-(void)startup;
@end
在上述的源代码中,使用注解声明了一个名为RAFTBasicService的类(class),且这个类是提供了服务的类(可称为Service),并指定了这个服务实现的接口(interface),且上述源代码中包含了多个注解,例如,第四行代码__attribute__((raft(service)))即表示一个针对RAFTBasicService的注解,在该源代码中采用了__attribute__((……))的编写格式来编写注解,注解可以编写在括号中,注解的标识采用__attribute__和括号,其中__attribute__表示注解的开始标识,以两个右括号表示注解的结束标识,则后续可以根据注解标识快速地从源代码中识别出目标注解。注解编可以编写在被注解元素之前,如__attribute__((raft(service)))只能出现在类声明上,因此可以快速地获取到被注解元素的相关信息。且注解可以采用关键字,例如可以是上述例子中的raft,需要的时候可以添加上注解参数,如property等,减少了编写代码的工作量。每个注解可以只编写在一行代码中,从而可以提高从源代码中识别出注解的效率。由此可见,根据上述对注解协议的规定,可以从源代码中快速高效地识别并提取出注解。此外,注解还支持指定初始化方法和属性注入,如上述例子中的__attribute__((raft(initmethod)))以及__attribute__((raft(property)))。
可以理解的是,为了使得注解更简洁,还可以在源代码中只使用一些特定的名称来表示注解,例如上述的__attribute__((raft(service)))可以简化为一个名称RAFT_SERVICE,需要的时候还可以在名称后添加注解参数,例如RAFT_FACTORYCLASS(CLS),括号中的CLS就是注解参数。其中,本申请提供的注解方案可以支持几乎所有类型的参数,具体可以包括字符串类型、数字类型、枚举类型、字符类型、布尔类型、类、数组类型以及自定义语言类型中的至少一种。注解的定义和实现可以根据实际需要来确定,本申请在此不做限制。
步骤S102,通过编译器加载注解处理插件,获取所述注解处理插件中与所述目标注解对应的目标注解代码;
具体的,在源代码中识别到目标注解后,编译器可以加载注解处理插件,注解处理插件可以单独实现,但可以和编译器共同工作。注解处理插件可以对目标注解进行分析,如词法分析、语法分析等,从而生成初始注解列表,该初始注解列表可以包括目标注解的基础描述标识,即可以使用带有注解信息的描述符号来表示目标注解在源代码中的结构。进一步,注解处理插件可以根据初始注解列表,在注解处理插件中的注解库中,查找与基础描述标识相匹配的注解代码,作为目标注解代码,其中,注解库中包含了所有自定义的注解代码,注解代码为针对注解的实现代码,描述了注解的定义以及具体实现,上述注解代码可以预先定义在注解库中,当注解处理插件运行时可以动态库的形式动态注入注解处理插件中。
步骤S103,根据所述目标注解代码生成用于描述所述目标注解的数据结构的目标注解列表,对所述目标注解列表进行转译处理,生成所述源代码对应的中间代码;
具体的,注解处理插件可以根据目标注解代码对初始注解列表进行更新,得到目标注解列表,该目标注解列表可以用来描述目标注解的数据结构,且包括携带有目标注解的详情信息的数据结构,详情信息具体可以包括目标注解代码相关的数据,例如目标注解的一些定义,进而可以对目标注解列表中的数据结构进行转译处理,生成目标注解的业务逻辑,并在过渡中间代码中对业务逻辑进行代码插桩,即将业务逻辑和过渡中间代码进行组装,可以生成源代码对应的中间代码。其中,过渡中间代码由编译器对工程代码进行编译得到,而工程代码为源代码中除了目标注解之外的代码。在本申请中的中间代码特指最终版本的中间代码,中间代码相当于编译器前端和后端之间的“桥梁”,使用中间代码可以便于编译器程序的开发和移植,且便于代码进行优化处理。目标注解的业务逻辑可以理解为依赖注入的框架,可形成一套完整的生命周期管理的代码,后续生成的可执行程序会根据上述业务逻辑自动运行。
步骤S104,通过所述编译器生成所述中间代码对应的目标文件。
具体的,编译器可以对上述中间代码进行优化处理,具体可以通过公共子表达式的提取、循环优化、删除无用代码等对中间代码进行加工变换,以期能够生成更为高效的目标文件。
本申请可以通过获取源代码中的目标注解,并通过编译器加载注解处理插件,进而可以通过注解处理插件对目标注解进行分析和匹配,获取目标注解对应的目标注解代码,进一步可以根据目标注解代码生成目标注解列表,并对目标注解列表进行转译处理,从而可以生成源代码对应的中间代码,并通过编译器生成中间代码对应的目标文件。由此可见,本申请提供的方法可以通过提供编译器级别的注解,丰富支持的注解参数的类型,从而可以完善注解功能,并扩展注解的能力,且通过编译器自动生成包含有注解的业务逻辑的中间代码,而无需额外的代码支持,也无需引入第三方依赖框架以及头文件,极大提升了开发效率。
请参见图4,是本申请提供的另一种基于编译器的数据处理方法的流程示意图。该方法可以包括以下步骤:
步骤S201,获取源代码中的目标注解;
具体的,可以根据注解协议从源代码中快速地识别出目标注解,如图4中,源代码使用Objective-C语言进行编写,该源代码可以包括注解以及工程代码,其中,目标注解300a包括标识__attribute__((…))以及关键字raft和注解参数property,工程代码300b是采用Objective-C语言编写的声明。请一并参见图5,是本申请提供的一种注解信息传递过程的流程示意图。如图5所示,将在源代码中识别到的所有目标注解提取出来,即可得到目标注解400a,也可称为User Code。
步骤S202,通过编译器加载注解处理插件,通过所述注解处理插件对所述目标注解进行分析,生成初始注解列表;所述初始注解列表包括所述目标注解的基础描述标识;
具体的,在源代码中识别到目标注解后,编译器可以调用注解处理插件共同工作。注解处理插件可以对目标注解进行词法分析,将字符串形式的目标注解转换为令牌(Tokens)流,可将令牌看作是一个扁平的语法片段数组(或理解成简短字符串的排列),进而可以对令牌流进行语法分析,将令牌流转换成初始注解列表,该初始注解列表具体可以是抽象语法树(Abstract Syntax Code,AST)的形式,在语法分析阶段会使用令牌中的信息把它们转换成一个AST的树结构,因此,初始注解列表可以包括目标注解的基础描述标识,这些基础描述标识可以是简短的字符串,只是用来描述注解信息,而不是实际的可以被机器识别和运行的数据结构。针对采用Objective-C语言编写的源代码,本申请可以采用基于LLVM(Low Level Virtual Machine,又名底层虚拟机)和Clang的编译器对源代码进行处理,其中,LLVM是建立编译器的基础框架,利用该基础框架,可以构建一个包括编译时、链接时、执行时等的语言执行器,因此可以作为Objective-C的编译器工具链,同时也是后端优化器。Clang是LLVM项目的一个子项目,是基于LLVM架构的编译器前端,因此Clang可以对Objective-C进行前端优化、抽象语法树生成,作为LLVM工具链生态中的一环。如图5所示,注解处理插件以及编译器都可以通过LLVM和Clang实现,注解处理插件可以包括抽象语法树匹配器400b(Clang AST Matcher)、属性定义库400c(LLVM Attribute Definition)、动态库400d(LLVM dylib)、注解插件400e(LLVM Annotation Plugin)、转译器400f(LLVMTransformer),进而可以调用注解处理插件中的抽象语法树匹配器400b对目标注解400a进行分析,完成之后生成AST列表(即初始注解列表)供下一阶段的LLVM插件做分析。
步骤S203,根据所述初始注解列表,在所述注解处理插件中的注解库中,查找与所述基础描述标识相匹配的注解代码,作为目标注解代码;所述注解库中的注解代码为针对注解的实现代码;
具体的,如图5所示,属性定义库400c中可以包含预定义的所有注解的注解代码,注解代码是指注解的具体定义及实现代码,且属性定义库400c会以一个动态库400d的形式动态注入LLVM中。进一步,注解插件400e可以通过属性定义库400c中定义的注解,对上述抽象语法树匹配器400b中生成的初始注解列表(或称为AST列表)进行解析,具体可以在属性定义库400c(即注解库)中进行查找,当检测到与初始注解列表中的基础描述标识相匹配的注解代码时,将其作为目标注解代码。
可选的,可以根据实际需要编写自定义的注解代码,例如可以将注解的定义保存在一个配置文件中,后续可通过预定义的模板文件去读取配置文件中自注解代码。
步骤S204,根据所述目标注解代码对所述初始注解列表进行更新,得到目标注解列表;所述目标注解列表包括携带有所述目标注解的详情信息的数据结构;
具体的,注解插件400e可以根据目标注解代码对初始注解列表进行更新,得到目标注解列表,此时的目标注解列表仍然是AST列表的形式,但目标注解列表包括携带有目标注解的详情信息的数据结构,且这些数据结构可以被机器识别和使用,目标注解的详情信息不再是上述步骤S202中所说的目标注解的基础描述标识,而是更为详细具体的信息,例如目标注解的具体类型,对应注解库中的哪些注解代码,目标注解所标注的程序元素等信息。
步骤S205,对所述目标注解列表中的所述数据结构进行转译处理,生成所述目标注解的业务逻辑;在过渡中间代码中对所述业务逻辑进行代码插桩,生成所述源代码对应的中间代码;所述过渡中间代码由所述编译器对工程代码进行编译得到,所述工程代码为所述源代码中除了所述目标注解之外的代码;
具体的,转译器400f在获取目标注解列表后,可以将目标注解列表中的数据结构转换为LLVM Pass可以识别的数据结构,从而生成目标注解的业务逻辑,进而可以通过LLVMPass将上述目标注解的业务逻辑插入到过渡中间代码中,即对业务逻辑和过渡中间代码进行组装,生成源代码对应的最终版本的中间代码,如图5所示的中间代码400g(LLVM IR)。其中,过渡中间代码可以由编译器对工程代码进行编译得到,对工程代码进行编译的步骤可以在进行代码插桩之前完成,本申请在此不做限制。其中,LLVM Pass是LLVM框架的重要组成部分,其主要工作是对代码进行优化,同时也负责一些对代码的分析工作。
需要说明的是,上述步骤S201-步骤S205的过程都是“隐性”的,即对用户级别无感知、无侵入。
步骤S206,调用所述注解处理插件对所述目标注解进行错误检测,若检测到所述目标注解不满足注解协议,则调用所述编译器进行报错处理;
具体的,注解处理插件可以对目标注解进行错误检测,可选的,当注解处理插件检测到目标注解的编写格式不满足注解协议中的编写格式时,例如使用__attribute__((…))的规则来编写注解,则要完整地使用下划线以及括号,并将注解放在括号中,否则可以确定目标注解不满足注解协议。
可选的,当注解处理插件检测到目标注解存在错误拼写时,例如将关键字“raft”拼写成“rafy”,且注解库中不存在有关“rafy”的注解代码,则可以确定目标注解不满足注解协议。
可选的,当注解处理插件检测到目标注解中的注解参数的类型错误时,例如在只支持字符串参数的目标注解中使用了不是字符串的参数,则可以确定目标注解不满足注解协议。
可选的,当注解处理插件检测到目标注解所在的位置不是指定位置时,例如不同的attribute只能出现在对应的位置,如raft(service)只能出现在类声明上,而raft(method)只能出现在method上,否则可以确定目标注解不满足注解协议。
进而,当检测到目标注解不满足注解协议时,可以将注解处理插件的检测结果发送至编译器,编译器获取该检测结果后,可以进行报错处理,例如可以在用户界面上显示错误提示信息,错误提示信息可以包括错误的个数、错误原因和错误代码的行号等,此时无法编译成功,必须要修正相应的错误,重新编译成功后才能生成目标文件。需要说明的是,在预编译阶段(可以理解为还在编写源代码的阶段)和编译阶段,编译器都可以根据检测结果进行相应的提示,对工程代码中出现的任何语法错误同样会进行报错处理。此外,如果检测到某些代码没有出错,但可能存在编译器不推荐的一些编写方式或方法等,编译器也可以进行报警处理,给开发人员推荐更好的编写规范。
步骤S207,通过所述编译器生成所述中间代码对应的目标文件;
具体的,编译器可以对上述中间代码进行优化处理,具体可以通过公共子表达式的提取、循环优化、删除无用代码等对中间代码进行加工变换,生成中间代码对应的目标文件,编译的过程即将每个源代码指令转换为适当的机器语言指令的过程。
需要说明的是,上述步骤S201-步骤S207的流程在预编译阶段和编译阶段都可以起到作用。预编译(pre-compile)过程可以用于校验目标注解是否完整且正确,编译(compile)过程主要用于生成具体的中间代码,后续注入运行时,是一个动态插桩的过程。
步骤S208,通过链接器获取所述目标文件,在所述链接器中将所述目标文件转换为可执行程序;
具体的,目标文件虽然包含了机器语言指令,但它还不是一个完整的程序,因此可以通过LLVM后端的链接器获取目标文件,并将目标文件与必需的运行时库例程相结合,生成可执行程序。其中,可执行程序(存储在可执行文件中)包含机器语言指令或可执行代码,并已经可以在计算机设备上运行。
步骤S209,运行所述可执行程序。
具体的,Objective-C是一个动态语言,故而它不仅需要编译器,还需要一个运行时系统来动态地创建类和对象、进行消息传递和转发,如图5所示的运行时系统400h,即Objective-C Runtime,上述可执行程序可以在运行时系统400h上正常地运行。例如,在对目标应用程序的界面颜色进行更新时,可以使用注解对其源代码中的初始界面颜色属性进行修改,通过编译器、链接器等工具对修改后的源代码进行相应处理,可以生成目标应用程序对应的可执行程序,在终端设备的操作系统上运行上述可执行程序,可以根据其界面颜色属性,更新该目标应用程序的界面颜色,具体可以参见上述图2所对应实施例中,使用注解对即时通信应用A1中聊天页面的背景颜色进行更新的过程,本申请在此不再赘述。
可选的,还可以基于注解采用不同的方案以实现与上述方法相似的效果。例如,在组件治理项目中,开发人员可以在Objective-C代码中使用注解来定义目标组件提供的开放服务(也可称为Servive,本质上是组件提供开放服务的类,可以理解为组件对外部提供的功能),例如,组件可以给外部提供资源下载的地址,外部获取到资源下载地址后可以从网页中下载需要的内容,这就是一个开放服务。其中,在本申请中可以将目标组件的部分公开API(Application Programming Interface,应用程序接口)定义为开放服务暴露给外部,一个组件可以暴露多个开放服务供外部使用。从目标注解中获取到服务信息后,根据服务信息可以自动生成描述文件,其中,服务信息用于描述目标组件提供的开放服务,描述文件本质上是配置文件,可以描述开放服务的接口等信息。可选的,描述文件也可以由开发人员手写得到。当目标组件被集成到应用工程时,目标组件的服务信息也会被集成到资源锁定文件中,资源锁定文件可以包含有多个开放服务的服务信息,通过项目提供的命令行工具可以将资源锁定文件中的服务信息转换成服务代码(即注解的业务逻辑),并将该服务代码自动插入到应用工程中,进而可以通过该服务代码调用项目提供的业务框架,在后续生成的可执行程序运行时自动注册该服务。通过这个方法,避免了传统方法中需要开发人员手写注册服务代码,可以通过命令行工具自动生成,且可以直接通过业务框架获取到服务并使用,而无需关心服务的初始化流程及依赖项,进而极大扩展了注解的能力,提升项目开发的效率。与上述基于编译器的数据处理方法相比,该方法是“显性”的,即开发人员可以看到服务代码保存在一个文件中,且该文件会被集成到应用工程中,且开发人员需要使用命令行工具手写相关的指令才能将资源锁定文件中的服务信息转换成服务代码,而上述基于编译器的数据处理方法对开发人员来说则是无感知、无侵入的。
本申请可以通过获取源代码中的目标注解,并通过编译器加载注解处理插件,进而可以通过注解处理插件对目标注解进行分析和匹配,获取目标注解对应的目标注解代码,进一步可以根据目标注解代码生成目标注解列表,并对目标注解列表进行转译处理,同时还可以检测源代码中的错误,检测无误后可以生成源代码对应的中间代码,并通过编译器生成中间代码对应的目标文件,最终生成可执行程序。由此可见,本申请提供的方法可以通过提供编译器级别的注解以及纠错机制,丰富了支持的注解参数的类型,从而可以完善注解功能,并扩展注解的能力,且通过编译器自动生成包含有注解的业务逻辑的中间代码,而无需额外的代码支持,也无需引入第三方依赖框架以及头文件,极大提升了开发效率。
请参见图6,是本申请提供的一种基于编译器的数据处理装置的结构示意图。如图6所示,该基于编译器的数据处理装置1可以包括注解获取模块11、代码获取模块12、代码生成模块13、文件生成模块14;
注解获取模块11,用于获取源代码中的目标注解;
代码获取模块12,用于通过编译器加载注解处理插件,获取所述注解处理插件中与所述目标注解对应的目标注解代码;
代码生成模块13,用于根据所述目标注解代码生成用于描述所述目标注解的数据结构的目标注解列表,对所述目标注解列表进行转译处理,生成所述源代码对应的中间代码;
文件生成模块14,用于通过所述编译器生成所述中间代码对应的目标文件。
其中,注解获取模块11的具体功能实现方式可以参见上述图3所对应实施例中的步骤S101,或者可以参见上述图4所对应实施例中的步骤S201,代码获取模块12的具体功能实现方式可以参见上述图3所对应实施例中的步骤S102,或者可以参见上述图4所对应实施例中的步骤S202-步骤S203,代码生成模块13的具体功能实现方式可以参见上述图3所对应实施例中的步骤S103,或者可以参见上述图4所对应实施例中的步骤S204-步骤S205,文件生成模块14的具体功能实现方式可以参见上述图3所对应实施例中的步骤S104,或者可以参见上述图4所对应实施例中的步骤S207,这里不再进行赘述。
请一并参见图6,该基于编译器的数据处理装置1还可以包括检测模块15;
检测模块15,用于调用所述注解处理插件对所述目标注解进行错误检测,若检测到所述目标注解不满足注解协议,则调用所述编译器进行报错处理;
所述检测模块15具体用于当所述注解处理插件检测到所述目标注解的编写格式不满足所述注解协议中的编写格式,或者,所述注解处理插件检测到所述目标注解存在错误拼写,或者,所述注解处理插件检测到所述目标注解中的注解参数的类型错误时,确定所述目标注解不满足所述注解协议。
其中,检测模块15的具体功能实现方式可以参见上述图4所对应实施例中的步骤S206,这里不再进行赘述。
请一并参见图6,该基于编译器的数据处理装置1还可以包括注册模块16;
注册模块16,用于若从所述目标注解中获取到服务信息,则根据所述服务信息生成描述文件;所述服务信息用于描述目标组件提供的开放服务;当所述目标组件被集成到应用工程时,根据所述描述文件将所述服务信息集成到资源锁定文件中,调用命令行工具将所述资源锁定文件中的所述服务信息转换成服务代码,将所述服务代码插入到所述应用工程中;通过所述服务代码调用业务框架,在运行时注册所述开放服务。
其中,注册模块16的具体功能实现方式可以参见上述图4所对应实施例中的步骤S209,这里不再进行赘述。
请一并参见图6,该基于编译器的数据处理装置1还可以包括颜色更新模块17;
颜色更新模块17,用于通过链接器获取所述目标文件,在所述链接器中将所述目标文件转换为可执行程序;运行所述可执行程序,根据所述界面颜色属性,更新所述目标应用程序的界面颜色。
其中,颜色更新模块17的具体功能实现方式可以参见上述图4所对应实施例中的步骤S209,这里不再进行赘述。
请一并参见图6,代码获取模块12可以包括分析单元121、匹配单元122;
分析单元121,用于通过所述注解处理插件对所述目标注解进行分析,生成初始注解列表;所述初始注解列表包括所述目标注解的基础描述标识;
匹配单元122,用于根据所述初始注解列表,在所述注解处理插件中的注解库中,查找与所述基础描述标识相匹配的注解代码,作为目标注解代码;所述注解库中的注解代码为针对注解的实现代码。
其中,分析单元121的具体功能实现方式可以参见上述图4所对应实施例中的步骤S202,匹配单元122的具体功能实现方式可以参见上述图4所对应实施例中的步骤S203,这里不再进行赘述。
请一并参见图6,代码生成模块13可以包括更新单元131、转译单元132;
更新单元131,用于根据所述目标注解代码对所述初始注解列表进行更新,得到目标注解列表;所述目标注解列表包括携带有所述目标注解的详情信息的数据结构;
转译单元132,用于对所述目标注解列表中的所述数据结构进行转译处理,生成所述目标注解的业务逻辑;在过渡中间代码中对所述业务逻辑进行代码插桩,生成所述源代码对应的中间代码;所述过渡中间代码由所述编译器对工程代码进行编译得到,所述工程代码为所述源代码中除了所述目标注解之外的代码。
其中,更新单元131的具体功能实现方式可以参见上述图4所对应实施例中的步骤S204,转译单元132的具体功能实现方式可以参见上述图4所对应实施例中的步骤S205,这里不再进行赘述。
本申请可以通过获取源代码中的目标注解,并通过编译器加载注解处理插件,进而可以通过注解处理插件对目标注解进行分析和匹配,获取目标注解对应的目标注解代码,进一步可以根据目标注解代码生成目标注解列表,并对目标注解列表进行转译处理,同时还可以检测源代码中的错误,从而可以生成源代码对应的中间代码,并通过编译器生成中间代码对应的目标文件,最终生成可执行程序。由此可见,本申请提供的方法可以通过提供编译器级别的注解以及纠错机制,丰富了支持的注解参数的类型,从而可以完善注解功能,并扩展注解的能力,且通过编译器自动生成包含有注解的业务逻辑的中间代码,而无需额外的代码支持,也无需引入第三方依赖框架以及头文件,极大提升了开发效率。
请参见图7,是本申请提供的另一种基于编译器的数据处理装置的结构示意图。如图7所示,该基于编译器的数据处理装置1000可以包括:处理器1001,网络接口1004和存储器1005,此外,上述基于编译器的数据处理装置1000还可以包括:用户接口1003,和至少一个通信总线1002。其中,通信总线1002用于实现这些组件之间的连接通信。其中,用户接口1003可以包括显示屏(Display)、键盘(Keyboard),可选用户接口1003还可以包括标准的有线接口、无线接口。网络接口1004可选的可以包括标准的有线接口、无线接口(如WI-FI接口)。存储器1004可以是高速RAM存储器,也可以是非不稳定的存储器(non-volatilememory),例如至少一个磁盘存储器。存储器1005可选的还可以是至少一个位于远离前述处理器1001的存储装置。如图7所示,作为一种计算机可读存储介质的存储器1005中可以包括操作系统、网络通信模块、用户接口模块以及设备控制应用程序。
在如图7所示的基于编译器的数据处理装置1000中,网络接口1004可提供网络通讯功能;而用户接口1003主要用于为用户提供输入的接口;而处理器1001可以用于调用存储器1005中存储的设备控制应用程序,以实现上述图3、图4任一个所对应实施例中对所述基于编译器的数据处理方法的描述,这里不再进行赘述。另外,对采用相同方法的有益效果描述,也不再进行赘述。
应当理解,本发明实施例中所描述的基于编译器的数据处理装置1000可执行前文图3、图4任一个所对应实施例中对所述基于编译器的数据处理方法的描述,也可执行前文图6所对应实施例中对所述基于编译器的数据处理装置1的描述,在此不再赘述。另外,对采用相同方法的有益效果描述,也不再进行赘述。
此外,这里需要指出的是:本发明实施例还提供了一种计算机可读存储介质,且所述计算机可读存储介质中存储有前文提及的基于编译器的数据处理装置1所执行的计算机程序,且所述计算机程序包括程序指令,当所述处理器执行所述程序指令时,能够执行前文图3、图4任一个所对应实施例中对所述基于编译器的数据处理方法的描述,因此,这里将不再进行赘述。另外,对采用相同方法的有益效果描述,也不再进行赘述。对于本发明所涉及的计算机可读存储介质实施例中未披露的技术细节,请参照本发明方法实施例的描述。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储存储器(Read-Only Memory,ROM)或随机存储存储器(Random AccessMemory,RAM)等。
以上所揭露的仅为本发明较佳实施例而已,当然不能以此来限定本发明之权利范围,因此依本发明权利要求所作的等同变化,仍属本发明所涵盖的范围。

Claims (10)

1.一种基于编译器的数据处理方法,其特征在于,包括:
获取源代码中的目标注解;
通过编译器加载注解处理插件,获取所述注解处理插件中与所述目标注解对应的目标注解代码;
根据所述目标注解代码生成用于描述所述目标注解的数据结构的目标注解列表,对所述目标注解列表进行转译处理,生成所述源代码对应的中间代码;
通过所述编译器生成所述中间代码对应的目标文件。
2.根据权利要求1所述的方法,其特征在于,所述获取所述注解处理插件中与所述目标注解对应的目标注解代码,包括:
通过所述注解处理插件对所述目标注解进行分析,生成初始注解列表;所述初始注解列表包括所述目标注解的基础描述标识;
根据所述初始注解列表,在所述注解处理插件中的注解库中,查找与所述基础描述标识相匹配的注解代码,作为目标注解代码;所述注解库中的注解代码为针对注解的实现代码。
3.根据权利要求2所述的方法,其特征在于,所述根据所述目标注解代码生成用于描述所述目标注解的数据结构的目标注解列表,对所述目标注解列表进行转译处理,生成所述源代码对应的中间代码,包括:
根据所述目标注解代码对所述初始注解列表进行更新,得到目标注解列表;所述目标注解列表包括携带有所述目标注解的详情信息的数据结构;
对所述目标注解列表中的所述数据结构进行转译处理,生成所述目标注解的业务逻辑;
在过渡中间代码中对所述业务逻辑进行代码插桩,生成所述源代码对应的中间代码;所述过渡中间代码由所述编译器对工程代码进行编译得到,所述工程代码为所述源代码中除了所述目标注解之外的代码。
4.根据权利要求1所述的方法,其特征在于,还包括:
调用所述注解处理插件对所述目标注解进行错误检测,若检测到所述目标注解不满足注解协议,则调用所述编译器进行报错处理。
5.根据权利要求4所述的方法,其特征在于,所述调用所述注解处理插件对所述目标注解进行错误检测,包括:
当所述注解处理插件检测到所述目标注解的编写格式不满足所述注解协议中的编写格式,或者,所述注解处理插件检测到所述目标注解存在错误拼写,或者,所述注解处理插件检测到所述目标注解中的注解参数的类型错误时,确定所述目标注解不满足所述注解协议。
6.根据权利要求1所述的方法,其特征在于,还包括:
若从所述目标注解中获取到服务信息,则根据所述服务信息生成描述文件;所述服务信息用于描述目标组件提供的开放服务;
当所述目标组件被集成到应用工程时,根据所述描述文件将所述服务信息集成到资源锁定文件中,调用命令行工具将所述资源锁定文件中的所述服务信息转换成服务代码,将所述服务代码插入到所述应用工程中;
通过所述服务代码调用业务框架,在运行时注册所述开放服务。
7.根据权利要求1所述的方法,其特征在于,所述目标注解包括目标应用程序的界面颜色属性;所述界面颜色属性是通过所述目标注解对所述源代码中的初始界面颜色属性进行修改所得到的;所述方法还包括:
通过链接器获取所述目标文件,在所述链接器中将所述目标文件转换为可执行程序;
运行所述可执行程序,根据所述界面颜色属性,更新所述目标应用程序的界面颜色。
8.一种基于编译器的数据处理装置,其特征在于,包括:
注解获取模块,用于获取源代码中的目标注解;
代码获取模块,用于通过编译器加载注解处理插件,获取所述注解处理插件中与所述目标注解对应的目标注解代码;
代码生成模块,用于根据所述目标注解代码生成用于描述所述目标注解的数据结构的目标注解列表,对所述目标注解列表进行转译处理,生成所述源代码对应的中间代码;
文件生成模块,用于通过所述编译器生成所述中间代码对应的目标文件。
9.一种基于编译器的数据处理装置,其特征在于,包括:处理器和存储器;
所述处理器和存储器相连,其中,所述存储器用于存储计算机程序,所述处理器用于调用所述计算机程序,以执行如权利要求1-7任一项所述的方法。
10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储有计算机程序,所述计算机程序包括程序指令,所述程序指令当被处理器执行时,执行如权利要求1-7任一项所述的方法。
CN202011166281.XA 2020-10-27 2020-10-27 基于编译器的数据处理方法、装置以及可读存储介质 Pending CN114489653A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202011166281.XA CN114489653A (zh) 2020-10-27 2020-10-27 基于编译器的数据处理方法、装置以及可读存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202011166281.XA CN114489653A (zh) 2020-10-27 2020-10-27 基于编译器的数据处理方法、装置以及可读存储介质

Publications (1)

Publication Number Publication Date
CN114489653A true CN114489653A (zh) 2022-05-13

Family

ID=81470640

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202011166281.XA Pending CN114489653A (zh) 2020-10-27 2020-10-27 基于编译器的数据处理方法、装置以及可读存储介质

Country Status (1)

Country Link
CN (1) CN114489653A (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN117032467B (zh) * 2023-10-08 2024-01-09 成都卓拙科技有限公司 与聊天机器人交互的方法、装置、电子设备和存储介质

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN117032467B (zh) * 2023-10-08 2024-01-09 成都卓拙科技有限公司 与聊天机器人交互的方法、装置、电子设备和存储介质

Similar Documents

Publication Publication Date Title
AU2012203071B2 (en) Computer-implemented method, system and computer program product for displaying a user interface component
US7478366B2 (en) Debugger and method for debugging computer programs across multiple programming languages
US8954939B2 (en) Extending a development environment
US7526755B2 (en) Plug-in pre- and postconditions for static program analysis
US8099721B2 (en) Parsing of declarations in all branches of preprocessor conditionals
US8352926B2 (en) Method and apparatus for a cross-platform translator from VB.net to java
US6901579B1 (en) Generation of source code from classes and maintaining the comment that indicates the role of the class in the generated source code
US10331425B2 (en) Automated source code adaption to inject features between platform versions
US8122440B1 (en) Method and apparatus for enumerating external program code dependencies
US8850414B2 (en) Direct access of language metadata
US20130055223A1 (en) Compiler with Error Handling
US20060080647A1 (en) Attempting runtime retranslation of unresolvable code
CN107704382B (zh) 面向Python的函数调用路径生成方法和系统
CN110673837B (zh) 代码修复方法及装置、电子设备、计算机可读存储介质
CN107643893B (zh) 一种程序检测方法及装置
US20070142929A1 (en) Specifying optional and default values for method parameters
CN114443041A (zh) 抽象语法树的解析方法及计算机程序产品
US20080141230A1 (en) Scope-Constrained Specification Of Features In A Programming Language
CN114489653A (zh) 基于编译器的数据处理方法、装置以及可读存储介质
US9747085B2 (en) Source code generation from prototype source
CN111796832B (zh) 热补丁文件生成方法、装置、设备及存储介质
CN114610364A (zh) 应用程序更新、应用程序开发方法、装置及计算机设备
Lopez-Rojas OMCCp: A MetaModelica Based Parser Generator Applied to Modelica
JPH11272475A (ja) 非リエントラントプログラムの自動リエントラント化方法及びシステム
US20240012625A1 (en) Non-transitory computer-readable storage medium with executable development program stored thereon, information processing system, information processing apparatus, and information processing method

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination