CN111708539B - 一种应用程序代码转换方法、装置、电子设备和存储介质 - Google Patents

一种应用程序代码转换方法、装置、电子设备和存储介质 Download PDF

Info

Publication number
CN111708539B
CN111708539B CN202010553150.0A CN202010553150A CN111708539B CN 111708539 B CN111708539 B CN 111708539B CN 202010553150 A CN202010553150 A CN 202010553150A CN 111708539 B CN111708539 B CN 111708539B
Authority
CN
China
Prior art keywords
target
class
code file
source code
data structure
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
Application number
CN202010553150.0A
Other languages
English (en)
Other versions
CN111708539A (zh
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 CN202010553150.0A priority Critical patent/CN111708539B/zh
Publication of CN111708539A publication Critical patent/CN111708539A/zh
Application granted granted Critical
Publication of CN111708539B publication Critical patent/CN111708539B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code

Landscapes

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

Abstract

本申请涉及计算机技术领域,尤其涉及一种应用程序代码转换方法、装置、电子设备和存储介质,用以提高应用程序跨平台开发效率,其中,方法包括:获取待转换的应用程序的源代码文件中各语法元素的数据结构,以及源代码文件中各语法元素之间的上下文关联关系;获得源代码文件中的语法元素的数据结构与目标语言系统中语法元素的数据结构之间的映射关系;基于映射关系,将源代码文件中的各语法元素翻译为目标语言,获得各语法元素对应的目标代码;将各语法元素对应的目标代码按照上下文关联关系进行整合,获得转换后的目标代码文件。由于本申请是源代码级别的转换,只需开发一次应用程序源代码,基于语法元素进行翻译即可,提高了开发效率。

Description

一种应用程序代码转换方法、装置、电子设备和存储介质
技术领域
本申请涉及计算机技术领域,尤其涉及一种应用程序代码转换方法、装置、电子设备和存储介质。
背景技术
移动应用程序开发,是基于不同的平台进行开发的。现有的平台很多,例如ios平台、Android(安卓)平台、Blackberry(黑莓)平台、WebOS平台、Symbian(塞班)平台等。由于不同平台其底层和终端硬件有很大不同,因此开发者开发移动应用程序需要针对每个平台进行开发,需要耗费大量的资源。
针对上述情况,出现了移动应用程序跨平台开发的方法,目前主要的框架是J2objc,然而J2objc不支持转换语言指定,只支持翻译为OC语言,并且转换时需要引入底层framework(框架)和lib(library)库,包体积增加较大,开发难度大,效率低。
发明内容
本申请实施例提供一种应用程序代码转换方法、装置、电子设备和存储介质,用以提供一种指定语言的应用程序代码转换方法,提高应用程序的跨平台开发效率。
本申请实施例提供的第一种应用程序代码转换方法,包括:
获取待转换的应用程序的源代码文件中各语法元素的数据结构,以及所述源代码文件中各语法元素之间的上下文关联关系;
获得所述源代码文件中的语法元素的数据结构与目标语言系统中语法元素的数据结构之间的映射关系;
基于所述映射关系,将所述源代码文件中的各语法元素翻译为目标语言,获得各语法元素对应的目标代码;
将各语法元素对应的目标代码按照所述上下文关联关系进行整合,获得所述源代码文件进行代码转换后的目标代码文件。
本申请实施例提供的第一种应用程序代码转换装置,包括:
分析单元,用于获取待转换的应用程序的源代码文件中各语法元素的数据结构,以及所述源代码文件中各语法元素之间的上下文关联关系;
映射单元,用于获得所述源代码文件中的语法元素的数据结构与目标语言系统中语法元素的数据结构之间的映射关系;
翻译单元,用于基于所述映射关系,将所述源代码文件中的各语法元素翻译为目标语言,获得各语法元素对应的目标代码;
转换单元,用于将各语法元素对应的目标代码按照所述上下文关联关系进行整合,获得所述源代码文件进行代码转换后的目标代码文件。
可选的,所述转换单元具体用于:
基于各语法元素之间的上下文关联关系,对各语法元素对应的目标代码进行上下文关联,获得所述源代码文件中的每条语句对应的目标代码;
对所述每条语句对应的目标代码进行归类处理,得到所述目标代码文件。
可选的,所述转换单元在对所述每条语句对应的目标代码进行归类处理之前,还用于:
对所述每条语句对应的目标代码中的变量类型和方法返回值进行类型推断,确定所述每条语句对应的目标代码所属的类;
通过所述每条语句对应的目标代码中的各个类进行签名校验,获取各个类的调用方法。
可选的,所述转换单元具体用于:
根据每条语句对应的目标代码中语法元素的属性描述,对所述每条语句对应的目标代码进行文档归类处理;
将进行文档归类处理后的目标代码按照与所述目标语言对应的文件输出格式,以文件流的方式输出得到所述目标代码文件,其中与所述目标语言对应的文件输出格式是根据目标语言模板库确定的。
本申请实施例提供的一种电子设备,包括处理器和存储器,其中,所述存储器存储有程序代码,当所述程序代码被所述处理器执行时,使得所述处理器执行上述任意一种应用程序代码转换方法的步骤。
本申请实施例提供一种计算机可读存储介质,其包括程序代码,当所述程序产品在电子设备上运行时,所述程序代码用于使所述电子设备执行上述任意一种应用程序代码转换方法的步骤。
本申请有益效果如下:
本申请实施例提供了一种应用程序代码转换方法、装置、电子设备和存储介质,由于本申请实施例通过翻译的方式实现应用程序的代码转换,给跨平台开发带来了极大的便利性,极大地提高开发效率,只需要开发一次应用程序的源代码,其他端的代码实现可以同步生成,开发效率可以得到极大提升。并且,本申请实施例中的代码转换方法是源代码级别的转换,语法元素的翻译过程可控可调试,并且翻译后的目标代码,和对应目标平台运行的代码风格和设计模式完全一致。同时基于本申请中的应用程序代码转换方法,是直接对应用程序的源代码进行翻译,没有增加任何包体积大小,相比于其他方式的跨平台方案,开发难度更低,开发效率更高。
本申请的其它特征和优点将在随后的说明书中阐述,并且,部分地从说明书中变得显而易见,或者通过实施本申请而了解。本申请的目的和其他优点可通过在所写的说明书、权利要求书、以及附图中所特别指出的结构来实现和获得。
附图说明
此处所说明的附图用来提供对本申请的进一步理解,构成本申请的一部分,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:
图1为本申请实施例中的一种应用场景的一个可选的示意图;
图2为本申请实施例中的一种应用程序代码转换方法的一个可选的流程图;
图3为本申请实施例中的一种跨平台开发框架的一个可选的示意图;
图4为本申请实施例中的一种应用程序代码转换方法的另一个可选的示意图;
图5为本申请实施例中的一种应用程序代码转换方法的另一个可选的流程图;
图6为本申请实施例中的一种应用程序代码转换装置的组成结构示意图;
图7为本申请实施例中的一种电子设备的组成结构示意图。
具体实施方式
为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请的技术方案进行清楚、完整地描述,显然,所描述的实施例是本申请技术方案的一部分实施例,而不是全部的实施例。基于本申请文件中记载的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本申请技术方案保护的范围。
下面对本申请实施例中涉及的部分概念进行介绍。
语法元素:指代码的基本组成单元,在本申请实施例中,若应用程序的源代码文件为Java语言,则源代码文件中的语言元素具体可以指类、属性、方法(类中有方法和属性,其中属性用于记录状态,方法用于记录行为)、代码块、注解、注释等。
数据结构:是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。
词法分析:是计算机科学中将字符序列转换为标记(token)序列的过程。从输入字符流中生成标记的过程叫作标记化(tokenization),在这个过程中,词法分析器还会对标记进行分类。
语法解析:在计算机科学和语言学中,语法解析是根据某种给定的形式文法对由单词序列构成的输入文本进行分析并确定其语法结构的一种过程。语法解析器(parser)通常是作为编译器或解释器的组件出现的,它的作用是进行语法检查、并构建由输入的单词组成的数据结构(一般是语法解析树、抽象语法树等层次化的数据结构)。语法解析器通常使用一个独立的词法分析器从输入字符流中分离出一个个的单词,并将单词流作为其输入。实际开发中,语法解析器可以手工编写,也可以使用工具(半)自动生成。
抽象语法树(Abstract Syntax Tree,AST):是源代码语法结构的一种抽象表示。它以树状的形式表现编程语言的结构,树的每个节点ASTNode都表示源代码中的一个结构。抽象语法树就像是Java文件的dom(Document Object Model,文档对象模型)。AST把Java中的各种语法元素定义成相应的对象,树的每个节点表示在源代码中出现的构造。语法是抽象的,因为它不代表真实语法中出现的每个细节,而只是结构,内容相关的细节。例如,分组括号在树结构中是隐式的,并且可以通过具有三个分支的单个节点来表示类似于if-condition-then表达式的句法结构。通常由解析器在源应用程序代码转换和编译过程中构建。一旦构建,通过后续处理(例如,上下文分析)将附加信息添加到AST中。
Java类文件:就是通常用Javac(Java compiler,Java语言编译器)产生的.class(类)文件。这些文件具有严格定义的格式。Java源文件经过Javac编译器编译之后,将会生成对应的二进制文件。每个合法的Java类文件都具备精确的定义,而正是这种精确的定义,才使得Java虚拟机得以正确读取和解释所有的Java类文件。Java类文件是8位字节的二进制流。数据项按顺序存储在class文件中,相邻的项之间没有间隔,这使得class文件变得紧凑,减少存储空间。在Java类文件中包含了许多大小不同的项,由于每一项的结构都有严格规定,这使得class文件能够从头到尾被顺利地解析。
闭包:包含自由(未绑定到特定对象)变量;这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义(局部变量)。闭包一词来源于以下两者的结合:要执行的代码块(由于自由变量被包含在代码块中,这些自由变量以及它们引用的对象没有被释放)和为自由变量提供绑定的计算环境(作用域)。
第三方SDK(software development kit,软件开发工具包):SDK即“软体开发工具包”,一般是一些被软件工程师用于为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件的开发工具的集合。通俗点是指由第三方服务商提供的实现软件产品某项功能的工具包。通常SDK是由专业性质的公司提供专业服务的集合,比如提供安卓开发工具、或者基于硬件开发的服务等。也有针对某项软件功能的SDK,如推送技术、图像识别技术、移动支付技术等,同时资源优势类的公司也提供资源共享的SDK,如一些广告SDK提供盈利渠道,分发SDK提供产品下载渠道。开发者不再需要对产品每个功能进行开发,选择合适、稳定的SDK服务并花费很少的精力即可在产品中集成某项功能。
Java对象:Java对象是类的一个个体,它是一种具体的概念,是具体的、实实在在存在的事物,它有自己的生命周期,由类可以创建出对象,对象也会消亡。
类:是具备某些共同特征的实体的集合,它是一种抽象的概念,用程序设计的语言来说,类是一种抽象的数据类型,它是对所具有相同特征实体的抽象。类一旦被建立后,就可以用这个类创建出任意个对象,然后去操作这些对象;类是抽象的,对象是具体的。另外,对象也可以称为实例,是一个真实的实体。其中,类是指具有相同的属性和功能的事物的抽象的集合,在面向对象程序设计中,通常把一类事物的静态属性和动态可以执行的操作组合在一起就能够得到类。类是个抽象的概念,用来模拟一类事物,一旦定义了一个类,这个类就永远存在。
内部类:面向对象程序设计中,可以在一个类的内部定义另一个类。嵌套类分为两种,即静态嵌套类和非静态嵌套类。静态嵌套类使用很少,最重要的是非静态嵌套类,也即是被称作为内部类(inner)。内部类是JAVA语言的主要附加部分。内部类几乎可以处于一个类内部任何位置,可以与实例变量处于同一级,或处于方法之内,甚至是一个表达式的一部分。
类与对象的关系:类是对象的集合,对象是类的实例;例如可以用一个例子说明类与对象的关系:比如“人类”是一个类,那么具体的某个人“张三”就是“人类”这个类的对象,而“名字、年龄”等信息就是对象的属性,人的动作比如“吃饭、穿衣”等就是对象的方法。
接口:是一组方法的集中定义,但是在接口中只定义方法本身,不定义的方法的实现过程。类是生成实例对象的模板。它和接口的关系是,类是接口实现的载体,即引入接口的类负责接口方法的实现。接口文档是指API(Application Program Interface,应用程序接口)的使用说明,是用于查询类、方法的功能、参数的。其中类是用于描述其类型对象支持的行为或状态的模板。对象具有状态和行为。例如狗有状态:颜色,名称,品种以及如摇尾巴,吠叫,吃东西等行为。对象是类的实例。而方法是指一种行为,一个类可以包含许多方法。它用于写入逻辑,操纵数据并执行所有操作。
下面对本申请实施例的设计思想进行简要介绍:
在计算机软件发展过程中,开发软件所用的程序语言不断更新换代,常见的程序语言有C语言,C++,OC,Swift和Java等等。然而,移动应用程序开发,是基于不同的平台进行开发的。不同平台所使用的程序语言可能不同,基于此出现了应用程序的跨平台开发框架中,可通过代码转换实现跨平台的应用程序开发。其中,J2ObjC是一个开源命令行工具,用于将Java代码转成iOS平台上的OC代码,基于该工具能够完成大部分Java语言转OC语言的实现。但是,J2objc不支持转换语言指定,只支持翻译为OC语言,并且转换时需要引入底层framework和lib库,包体积增加较大,大概7M左右。
有鉴于此,本申请实施例提供一种应用程序代码转换方法、装置、电子设备和存储介质,本申请设计的跨平台开发框架,通过翻译的方式实现,给应用程序的跨平台开发带来了极大的便利性,极大地提高开发效率,只需要开发一次应用程序的源代码,其他端的代码实现可以同步生成,开发效率可以得到极大提升。此外,基于本申请实施例提供的跨平台开发框架对源代码进行翻译过程的可控可调试,并且翻译后的目标代码,和对应目标平台运行的代码风格和设计模式完全一致,对于开发者而言,不需要有任何理解成本。同时对于使用该框架的应用来说,没有增加任何包体积大小,和原生开发编码的效果一样,相比于其他方式的跨平台方案,如混合流的React Native,编译流的Xamarin,虚拟机流的Flutter等,开发难度和产品体验上都很大优势。
以下结合说明书附图对本申请的优选实施例进行说明,应当理解,此处所描述的优选实施例仅用于说明和解释本申请,并不用于限定本申请,并且在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。
如图1所示,其为本申请实施例的应用场景示意图。该应用场景图中包括两个终端设备110和一个服务器130,可通过终端设备110登录应用程序的相关界面120。终端设备110与服务器130之间可以通过通信网络进行通信。其中,每个终端设备110对应一个用户,例如图1中的用户A和用户B分别对应一个终端设备110为例,实际上不限制终端设备的数量。在某些情况下,各终端设备110之间可以先通过服务器130进行通信,终端设备110到终端设备110之间可以建立直接通信,终端设备110到终端设备110之间直接通信的方式可以称为点到点通信,在这情况下,各终端设备110之间的某些交互过程可能并不需要服务器130的中转。
在一种可选的实施方式中,通信网络是有线网络或无线网络。
在本申请实施例中,终端设备110为用户使用的电子设备,该电子设备可以是个人计算机、手机、平板电脑、笔记本、电子书阅读器等具有一定计算能力并且运行有即时通讯类软件及网站或者社交类软件及网站的计算机设备。各终端设备110通过无线网络与服务器130连接,服务器130可以是独立的物理服务器,也可以是多个物理服务器构成的服务器集群或者分布式系统,还可以是提供云服务、云数据库、云计算、云函数、云存储、网络服务、云通信、中间件服务、域名服务、安全服务、CDN(Content Delivery Network,内容分发网络)、以及大数据和人工智能平台等基础云计算服务的云服务器。终端可以是智能手机、平板电脑、笔记本电脑、台式计算机、智能音箱、智能手表等,但并不局限于此。终端以及服务器可以通过有线或无线通信方式进行直接或间接地连接,本申请在此不做限制。
需要说明的是,上述两个终端设备只是举例说明,在本申请实施例中实际一般可涉及若干终端设备。并且,终端设备110上可以安装有各种通讯客户端应用,例如软件开发类应用、购物类应用、搜索类应用、即时通信工具、邮箱客户端、社交平台软件等。
需要说明的是,本申请实施例所提供的应用程序代码转换方法可以由服务器130执行,相应地,应用程序代码转换装置一般设置于服务器130中。可选的,本申请实施例所提供的应用程序代码转换方法还可以由终端设备110执行,相应地,应用程序代码转换装置一般设置于终端设备110中。此外,需要说明的是,本申请实施例所提供的应用程序代码转换方法,还可以通过服务器130和终端设备110共同执行,例如,“获取待转换的应用程序的源代码文件中各语法元素的数据结构,以及所述源代码文件中各语法元素之间的上下文关联关系”的步骤可以由服务器执行,其余步骤可以由终端设备执行。本申请对此不做限定。
参阅图2所示,其为本申请实施例提供的一种应用程序代码转换方法的实施流程图,该方法的具体实施流程如下:
S21:获取待转换的应用程序的源代码文件中各语法元素的数据结构,以及源代码文件中各语法元素之间的上下文关联关系;
其中,待转换的应用程序的源代码文件可以是任意一种语言的源代码文件,目标语言也可以是指定的任意一种语言,例如Java语言、C语言、C++、OC等,本申请实施例可以将待转换的应用程序的源代码文件转换为任意一种目标语言,实现应用程序的跨平台开发。
在一种可选的实施方式中,通过对源代码文件进行词法分析和语法解析,构建抽象语法树,即可获取源代码文件中各语法元素之间的数据结构,以及源代码文件中的各语法元素之间的上下文关联关系。
以待转换的源代码文件为Java语言为例,语法元素是指Java源代码中的类、对象、属性、方法等。源代码文件中的代码的主要组成即类、对象、属性、方法等语法元素。
S22:获得源代码文件中的语法元素的数据结构与目标语言系统中语法元素的数据结构之间的映射关系;
在本申请实施例中,对源代码文件进行转换之前,首先需要建立源代码文件中的语法元素的数据结构与目标语言系统中语言元素的数据结构之间的映射关系。
例如,源代码文件为Java语言,目标语言为OC语言,此时,则需要建立源代码文件中的各个类、方法等语法元素在Java语言与OC语言之间的映射关系。假设在Java语言中,i类用于实现A功能,而在OC语言中,c类用于实现A功能,此时即可确定Java语言中的i类与OC中的c类具有映射关系,进一步地,Java中的i类i方法可以实现+1的功能,而OC语言中的c类c方法也可以实现+1的功能,此时即可确定Java中的i类i方法与OC语言中的c类c方法具有映射关系等。
基于上述过程,即可建立起源代码文件中的语法元素的数据结构与目标语言系统中语言元素的数据结构之间的映射关系。
需要说明的是,在本申请实施例中建立的语法元素之间的映射关系主要包括常用的系统类和第三方类在Java语言与OC语言之间的映射,其中,Java常用的系统类包括:字符串类、输入输出流类、数学函数类、日期类、随机数类以及向量类等。而第三方类是指第三方SDK中定义的类,例如用于实现支付功能、推送功能等的类。下文中会结合本申请实施例中给出的一种跨平台开发框架对上述过程进行详细介绍。
S23:基于映射关系,将源代码文件中的各语法元素翻译为目标语言,获得各语法元素对应的目标代码;
S24:将各语法元素对应的目标代码按照上下文关联关系进行整合,获得源代码文件进行代码转换后的目标代码文件。
在本申请实施例中,获取到源代码文件中的语法元素与目标语言系统的语法元素之间的映射关系之后,即可对源代码文件中的各语法元素进行翻译,例如将源代码文件中的i类i方法翻译为OC语言的c类c方法等。进而基于之前获得的各语法元素之间的上下文关联关系,对翻译后得到的目标代码进行整合获得目标代码文件。其中,目标代码文件即将源代码文件翻译为目标语言后得到的代码文件。
在上述实施方式中,并建立Java语言与目标语言的数据结构之间的映射关系,将待转换的源代码翻译为目标语言源代码,通过翻译的方式实现,给跨平台开发带来了极大的便利性,极大地提高开发效率,只需要开发一次Java版本的应用,其他端的代码实现可以同步生成,开发效率可以得到极大提升。
参阅图3所示,其为本申请实施例提供的一种跨平台开发框架,下面结合图3所示的框架对本申请实施例中的应用程序代码转换方法进行详细介绍:
如图3所示,该框架从下到上主要包含:语法解析引擎、语法树构建、最小子系统、第三方SDK类型推断、语法翻译、模版替换、目标语言输出七大部分。
在本申请实施例中,可通过对待转换的源代码文件进行词法分析和语法解析的方式构建抽象语法树,基于抽象语法树来表示待转换的源代码文件中的各语法元素的数据结构,以及各语法元素之间的上下文关联关系可通过抽象语法树表示。通过图3所示的语法解析引擎、语法树构建这两部分即可实现抽象语法树的构建。
进一步地,在构建抽象语法树之后,即可获取源代码文件中的语法元素的数据结构与目标语言系统中的语法元素的数据结构之间的映射关系时,语法元素主要包括两部分:源代码文件中常用的系统类,以及第三方SDK中定义的第三方类。基于图3所示的框架中的最小子系统和第三方SDK类型推断这两大部分即可建立源代码文件中的语法元素的数据结构与目标语言系统中的语法元素的数据结构之间的映射关系。
最后,基于语法翻译、模版替换、目标语言输出这三大部分即可实现图2所示的步骤S23以及S24,获得最终的目标代码文件。
下面结合图3对上述过程进行详细说明:
在本申请实施例中,首先通过对待转换的源代码文件进行词法分析和语法解析,构建抽象语法树,该过程主要分为以下两个步骤:
步骤一、通过图3所示的语法解析引擎对源代码进行词法分析和语法解析。
在执行该步骤的过程中,主要是基于ANTLRInputStream翻译流模块、Java8Lexer词法分析器模块、Java8Parser语法解析器模块和ParserTreeWalker语法树遍历模块这四个模块实现的,下面对各个模块的功能分别进行详细介绍:
a)ANTLRInputStream翻译流模块:
该模块用于将Java源代码文件转换为文件流,其中文件流是后续词法分析的数据来源。在Java中,文件的输入和输出是通过流来实现的。
b)Java8Lexer(Lexical analyzer)词法分析器模块:
该模块用于对Java类文件进行词法分析,生成各种对应的Token(标记)序列。在本申请实施例中,进行词法分析的程序或者函数叫作词法分析器。如图3所示,在对源代码文件进行词法分析时,采用的词法分析器为Java8Lexer,基于该词法分析器可将字符串形式的应用程序源代码转换为Token序列,在此可将Token看作是一个扁平的语法片段数组,通常代表关键字,变量名,语法符号等。
c)Java8Parser语法解析器模块:
该模块用于使用Token中的信息,将Token序列串联成一个AST的树结构。如图3所示,在对源代码文件进行语法解析时,采用的语法解析器为Java8Parser。基于该语法解析器,可在词法分析的基础上将单词序列组合成各类语法短语,如程序、语句、表达式等等。
d)ParserTreeWalker语法树遍历模块:
该模块用于根据AST规则,对源代码文件中的代码逐行进行解析,生成对应的内存模型。在本申请实施例中,Java内存模型(Java Memory Model,JMM)是Java虚拟机规范定义的,用来屏蔽掉Java程序在各种不同的硬件和操作系统对内存的访问的差异,这样就可以实现Java程序在各种不同的平台上都能达到内存访问的一致性。
步骤二、进行语法树构建。该步骤主要用于声明抽象语法树中的各种对象模型,其中主要包括Declaration(声明)、Statement(语句)和Expression(表达式)三部分,这些对象模型都属于本申请实施例中所列举的源代码文件中的语法元素,下面对这几个部分进行详细说明:
a)Declaration:主要声明在抽象语法树中,各种对象模型的数据结构定义。
在本申请实施例中,抽象语法树中的各种对象模型包括但不限于下列的部分或全部:
PackageDeclaration(包声明),ImportDeclaration(导入声明),ClassrinterfaceDeclaration(类/接口声明),EnumDeclaration(枚举声明),InitalizerDeclaration(初始化声明),ConstructorDeclaration(构造函数声明),MethodDeclaration(方法声明),FieldDeclaration(变量声明)等。
b)Statement:在抽象语法树中,各种闭包结构的定义,主要语句结构定义。
其中,抽象语法树中的各种语句结构包括但不限于下列的部分或全部:
AssertStatement(断言语句),BlockStatement(闭包语句),BreakStatement(Break语句),CatchStatement(Catch语句),ExpressionStatement(枚举语句),ForEachStatement(循环语句),IfStatement(条件语句),LocalClassDeclarationStatement(内部类语句),SwitchStatement(Switch语句),TryStatement(Try语句),WhileStatement(While语句)等。
c)Expression:在抽象语法树中,各种变量、方法操作定义,主要数据结构定义。
AnnotationExpression(注解表达式),ArrayCreationExpression(数组创建表达式),AssignExpression(赋值表达式),BinaryExpression(二次元表达式),CastExpression(类型构造表达式),ConditionExpression(条件表达式),EnclosedExpression(闭包表达式),InstanceOfExpression(实例判断表达式),LambdaExpression(Lambda表达式),ObjectCreationExpression(对象创建表达式),SuperExpression(Super调用表达式),ThisExpression(This引用表达式),VariableDeclarationExpression(变量声明表达式)等。
在本申请实施例中,通过语法解析引擎和语法树构建两部分之后,即可获取源代码文件中各语法元素的数据结构,以及各语法元素之间的上下文关联关系。接下来,主要是基于最小子系统和第三方SDK类型推断两部分,建立源代码文件中的语法元素的数据结构与目标语言系统中语法元素的数据结构之间的映射关系。其中,基于最小子系统可获得源代码文件中的系统类的数据结构与目标语言系统中的系统类的数据结构之间的映射关系。然后,通过类解析的方式,对第三方SDK中定义的第三方类进行类型推断和方法映射,可得到源代码文件中包含的第三方类的数据结构与目标语言系统中的第三方类的数据结构之间的映射关系。
下面结合图3对这两部分进行详细介绍:
其中,最小子系统主要分为三个模块,SkeletonGenerator系统接口模块、MappingProperties属性映射集模块和AbsNodeProcessor节点处理器模块。
在基于最小子系统对源代码文件中的常用系统类进行语法映射,获取源代码文件中的系统类的数据结构与目标语言系统中的系统类的数据结构之间的映射关系时,首先根据SkeletonGenerator系统接口模块将最小子系统中定义的类接口翻译为目标语言。
在本申请实施例中,SkeletonGenerator系统接口模块主要用于实现对Jvm(JavaVirtual Machine,Java虚拟机)系统内接口进行目标语言自动转换,保持不同语言间类接口定义的一致性。
在基于SkeletonGenerator系统接口模块对系统类接口进行目标语言自动转换之后,即可基于Mapping Properties属性映射集模块进行语法映射,来获取源代码文件中包含的系统类的数据结构与目标语言系统中的系统类的数据结构的之间映射关系。
在本申请实施例中,Mapping Properties属性映射集模块主要用于对Jvm系统内常用系统类数据结构进行目标语言系统数据结构映射,保持不同语言间类行为实现的一致性。
此外,图3所示的最小子系统部分还包括AbsNodeProcessor节点处理器模块,该模块用于支持外部按照该框架设计的翻译模型,进行外部实现翻译,然后注入到框架内,作为最小系统的补充,有利于功能扩展。
在上述实施方式中,针对系统底层库常用的系统类的数据结构,基于最小子系统可通过封装内部类进行语法映射,实现各平台的类型、方法、变量的打通,对于常用的系统接口,通过动态生产骨架代码,保证目标语言实现的一致性。此外,对于外部使用方开发实现接口,其语法映射不在最小子系统范围内,本申请实施例将节点处理器用于最小子系统的扩展,实现按照统一标准由外部注册实现的方式,因此对于本申请实施例给出的跨平台框架内部没有支持的转换类型,支持外部实现后注入。
接下来,即可基于第三方SDK推断部分,建立源代码中的第三方类和目标语言系统中的第三方类之间的映射关系,保证第三方接口翻译的准确性。具体实现方式为:通过类解析的方式,对第三方SDK中定义的第三方类进行类型推断和方法映射,得到源代码文件中包含的第三方类的数据结构与目标语言系统中的第三方类的数据结构之间的映射关系。下面结合图3对该过程进行详细介绍:
参阅图3所示,第三方SDK推断部分主要分为以下三个模块:Java Assist类解析模块、Java Transform类型表模块以及TypeInjector类型注入模块。
其中,Java Assist类解析模块,用于通过Java Assist方式,对第三方SDK中的Class文件池进行表达式推断,判定对应变量和方法返回类型。进一步地,在通过JavaAssist类解析模块对第三方SDK中定义的第三方类进行类型推断之后,可基于JavaTransform类型表模块,用于根据Java Assist推断的结构,生成对应的类型映射文件,存放在对应工程目录下,用于后面翻译过程中的类型判定。其中,TypeInjector类型注入模块,用于在开始目标语言转换时,读取工程目录下的类型映射文件,进行属性表注入,进而在后续翻译过程中即可基于属性表进行映射。
在上述实施方式中,对于指定的与应用程序相关联的第三方SDK库目录,通过JavaAssist方式进行类型推断之后,可通过APT(Automatically Programmed Tools,自动编程工具)方式生成对应的属性表,该属性表中详细记录了源代码文件和目标语言系统之间的第三方类的类型映射关系,可用于目标代码翻译时注入。
通过上述实施方式,即可建立源代码文件中的语法元素的数据结构与目标语言系统中的语法元素的数据结构之间的映射关系。如表1所示,为本申请实施例中所列举的一种映射关系的示例:
表1
Java语言 目标语言(OC语言)
i类 c类
j类 b类
k类 a类
在表1中,记录了应用程序的源代码文件中的语法元素的数据结构与目标语言系统的语法元素的数据结构之间的映射关系。其中源代码文件采用的是Java语言,而目标语言系统采用的目标语言是OC语言。由表1可知,Java语言中的i类、j类、k类,分别与OC语言中的c类、b类、a类具有映射关系。进一步的,映射表中还可进一步显示类中的方法、属性等之间的映射关系,其中属性用于记录对象的状态,方法用于记录对象的行为。例如Java语言中的i类i方法与OC语言中的c类c方法之间具有映射关系等等,在此不做具体限定。
在本申请实施例中,基于上述实施方式建立源代码文件与目标语言之间的映射关系后,下面即可基于映射关系对源代码文件进行翻译。首先基于映射关系,将源代码文件中的各语法元素翻译为目标语言,获得各语法元素对应的目标代码。也就是将抽象语法树中的各个节点进行翻译转换。之后即可基于各语法元素之间的上下文关联关系,将各语法元素对应的目标代码进行整合得到转换后的目标代码文件。
一种可选的实施方式为,可以按照如图4所示的流程图实施步骤S24,具体包括以下步骤:
S41:基于各语法元素之间的上下文关联关系,对各语法元素对应的目标代码进行上下文关联,获得源代码文件中的每条语句对应的目标代码;
在步骤S23中,主要是基于上述实施例中建立的映射关系对源代码文件中的各语法元素进行目标语言的翻译,最终得到各语法元素对应的目标代码,但是这一部分是指对抽象语法树的各个节点进行翻译,在翻译之后,还需要结合个语法元素之间的上下文关联关系,来生成目标代码文件。此时,首先需要对各语法元素进行上下文关系,获得源代码文件中的每条语句对应的目标代码。
S42:对每条语句对应的目标代码中的变量类型和方法返回值进行类型推断,确定每条语句对应的目标代码所属的类;
S43:通过每条语句对应的目标代码中的各个类进行签名校验,获取各个类的调用方法;
S44:对每条语句对应的目标代码进行归类处理,得到目标代码文件。
进一步地,通过步骤S42和步骤S43对每条语句对应的目标代码进行分析进行类型推断和方法签名。其中,步骤S41至步骤S43可基于图3所示的语法翻译部分实现。之后,通过步骤S44对每条语句对应的目标代码进行归类处理,最终可获得目标代码文件,其中归类处理的过程主要是基于图3所示的模板替换和目标语言输出部分来实现的。
下面结合图3对本申请实施例中的翻译过程进行详细介绍,参阅图3所示,在本申请实施例中,对源代码文件进行翻译时,主要分为两个过程,语法翻译以及模板替换。
其中,语法翻译过程主要分为4个模块:AbsTranslator语法转换模块、NodeTracerAST追踪器模块、TypeInfer类型推断模块和方法签名模块。
在本申请实施例中,AbsTranslator语法转换模块用于处理各种类、变量、方法、匿名内部类、内部类、静态常量、枚举、范型模版等语法元素的翻译转换,也就是抽象语法树中各节点的翻译转换。在本申请实施例中,主要的Abs Translator语法转换定义包括:Declaration声明、Statement语句和Expression表达式这三部分。
其中,Declaration声明转换包括但不限于下列的部分或全部:
PackageDeclarationOcTranslator(包管理转换);
ImportDeclarationOcTranslator(引用类转换);
ClassOrInterfaceDeclarationOcTranslator(类/接口声明转换);
MethodDeclarationOcTranslator(方法声明转换);
VariableDeclarationOcTranslator(变量声明转换)等。
其中,Statement语句转换包括但不限于下列的部分或全部:
BlockStatementOcTranslator(代码块语句转换);
ConstructorInvocationStatementOcTranslator(构造方法语句转换);
ContinueStatementOcTranslator(Continue语句转换);
ForStatementOcTranslator(For循环语句转换);
SwitchStatementOcTranslator(Switch语句转换)等。
其中,Expression表达式转换包括但不限于下列的部分或全部:
ArrayInitializerExpressionOcTranslator(数组初始化语句转换);
ConditionalExpressionOcTranslator(条件表达式转换);
FieldAccessExpressionOcTranslator(变量访问表达式转换);
MethodCallExpressionOcTranslator(方法调用表达式转换);
SwitchExpressionOcTranslator(Switch表达式转换)等。
基于上述过程,即可实现对源代码文件中各语法元素的翻译,得到各语法元素对应的目标代码。
接下来,基于NodeTracer AST追踪器模块可用于对各语法元素进行上下文关系,其中该模型主要用于存储当前转换时,对应的顶级声明(Class/Enum枚举)所有信息维护,基于NodeTracer AST追踪器中存储的这些顶级声明所有信息可确定各语法元素之间的上下文关联关系,进而即可对各语法元素进行上下文关联,获得源代码文件中每条语句对应的目标代码。
之后,可基于TypeInfer类型推断模块和Method Signature方法签名模块对对每条语句对应的目标代码进行分析进行类型推断和方法签名。
其中,TypeInfer类型推断模块主要用于变量类型,方法返回值的类型判定。在本申请实施例中,进行TypeInfer类型推断时主要的分类定义包括但不限于下列的部分或全部:
ArrayAccessExprTypeCalculator(数组类型推断);
AssignExprTypeCalculator(赋值类型推断);
BinaryExprTypeCalculator(二元表达式类型推断);
ConditionalExprTypeCalculator(条件表达式类型推断);
ClassExprTypeCalculator(类类型推断);
LambdaExprTypeCalculator(Lambda表达式类型推断);
FieldExprTypeCalculator(变量类型推断);
ObjectCreationExprTypeCalculator(对象创建类型推断);
StringLiteralTypeCalculator(字符串类型推断)等。
通过TypeInfer类型推断模块,对翻译后的每条语句进行上述类型推断,确定各语句中涉及的变量类型或是方法返回值的类型。
进一步地,基于Method Signature方法签名模块,即可对目标代码中的各个类进行签名校验,获取各个类的调用方法。具体的,Method Signature方法签名模块主要用于确认各个类的真实调用的方法,主要是根据类+方法名+参数类型+返回值来进行签名校验的。
基于上述过程实现源代码文件的翻译之后,通过图3所示的模板替换部分,可将翻译后的目标代码转换为与目标语言匹配的形式,具体过程为:根据每条语句对应的目标代码中语法元素的属性描述,对每条语句对应的目标代码进行文档归类处理。其中,模板替换部分主要包括SpecManager文档模型管理模块和Target Language Template目标语言模版库两部分。
在本申请实施例中,SpecManager文档模型管理模块,用于对翻译为目标语言的目标代码进行归类处理,这里的目标代码可以是字符串的形式,具体的,SpecManager文档模型管理包括三部分:Classspec(类属性描述)、MethodSpec(方法属性描述)和FieldSpec(变量属性描述)。
其中,Classspec包括但不限于下列的部分或全部:
addImport(导入文件文本)、addSuperType(超类文本)、addInterface(接口文本)、addChildSpec(方法/变量文本)、outputSource(输出类文本)等。
其中,MethodSpec包括但不限于下列的部分或全部:
setName(方法名文本)、addReturnType(方法类型文本)、addParameters(方法参数文本)、addModifiers(方法修饰文本)、outputSource(输出方法文本)等。
其中,FieldSpec包括但不限于下列的部分或全部:
addModifiers修饰文本、addReturnType变量文本、setSpecScope作用域文本、outputSource输出变量文本等。
在上述实施例中,对于翻译为目标语言的目标代码,需要进行文档归类处理,具体可依据上述列举的方法属性描述、类属性描述和变量属性描述几部分,依据目标代码中的语法元素进一步归类,判断目标代码所属的文档类型,并进行划分,其中文档类型可分为上述实施例中列举的导入文件文本、方法类型文本、变量文本等等。
进一步地,基于Target Language Template目标语言模版库,可以确定最终目标代码文件的输出格式,即目标语言模版库与目标语言对应的文件输出格式,其中TargetLanguage Template目标语言模版库中包含根据不同目标语言的语法特性和代码风格,定义的不同的输出格式,可以保证转换文件符合目标代码规范,使得翻译后的目标代码,和对应目标平台运行的代码风格和设计模式完全一致。
最终,依据图3所示的目标语言输出部分,将进行文档归类处理后的目标代码按照与目标语言对应的文件输出格式,以文件流的方式输出,即可得到最终的目标代码文件。
其中,目标语言输出部分主要用于实现目标代码文件的输出,这里就是根据图3所示的上述六个部分的处理后,采用文件流的方式,进行目标语言的本地文件生成,即可得到目标代码文件。
在上述实施方式中,直接运行图3所示的跨平台框架提供的Build任务或者Bat(Batch,批处理)脚本即可实现目标代码的翻译转换,可支持翻译为任意目标语言,并且不增加任何与目标翻译无关的文件。在源代码文件转换前后,代码以源码的形式提供,因此可以看到源码,转换过程可控可调试。对于引入的第三方SDK,支持类型推断和方法映射,可以极大地提高应用程序的跨平台开发效率。
在一种可选的实施方式中,还可在检测到源代码文件更新后,更新源代码文件中的语法元素的数据结构与目标语言系统中的语法元素的数据结构之间的映射关系;进一步地,更新映射关系后,即可基于更新后的映射关系,重新将源代码文件中的各语法元素翻译为目标语言,重新获得各语法元素对应的目标代码;基于各语法元素之间的上下文关联关系,将重新获得的各语法元素对应的目标代码进行整合得到转换后的新的目标代码文件。
例如开发人员想要为当前的应用程序增加一些新的功能时,对源代码文件进行了更新,此时即可基于上述方式,重新建立更新后的源代码文件中的语法元素的数据结构与目标语言系统中的语法元素的数据结构之间的映射关系,进而在重新建立映射关系后,即可基于新的映射关系重新对源代码文件进行翻译,更新目标代码文件。
在上述实施方式中,可以在源代码文件更新之后,基于本申请实施例中列举的跨平台开发框架,对目标代码文件进行实时更新。并且,其中的目标语言可以是任意一种指定的语言,因此可以将应用程序的源代码文件转换为任意一种目标语言,给跨平台开发带来了极大的便利性,极大地提高开发效率。
参阅图5所示,为本申请实施例中的另一种应用程序代码转换方法的流程图。该方法的具体实施流程如下:
步骤S51:获取待转换的应用程序的源代码文件;
步骤S52:对源代码文件进行词法分析和语法解析,获得源代码文件中各语法元素的数据结构,以及源代码文件中各语法元素之间的上下文关联关系;
步骤S53:基于最小子系统对源代码文件中的系统类进行语法映射,获得源代码文件中的常用系统类的数据结构与目标语言系统中的常用系统类的数据结构之间的映射关系;
步骤S54:通过类解析的方式,对第三方SDK中定义的第三方类进行类型推断和方法映射,得到源代码文件中包含的第三方类的数据结构与目标语言系统中的第三方类的数据结构之间的映射关系;
步骤S55:基于映射关系将所述源代码文件中的各语法元素翻译为目标语言,获得各语法元素对应的目标代码;
步骤S56:基于各语法元素之间的上下文关联关系,对各语法元素对应的目标代码进行上下文关联,获得源代码文件中的每条语句对应的目标代码;
步骤S57:对每条语句对应的目标代码中的变量类型和方法返回值进行类型推断,确定每条语句对应的目标代码所属的类;
步骤S58:通过每条语句对应的目标代码中的各个类进行签名校验,获取各个类的调用方法;
步骤S59:根据每条语句对应的目标代码中语法元素的属性描述,对每条语句对应的目标代码进行文档归类处理;
步骤S510:将进行文档归类处理后的目标代码按照与目标语言对应的文件输出格式,以文件流的方式输出得到目标代码文件。
基于相同的发明构思,本申请实施例还提供一种应用程序代码转换装置。如图6所示,其为本申请实施例中的一种应用程序代码转换装置600的结构示意图,可以包括:
分析单元601,用于获取待转换的应用程序的源代码文件中各语法元素的数据结构,以及源代码文件中各语法元素之间的上下文关联关系;
映射单元602,用于获得源代码文件中的语法元素的数据结构与目标语言系统中语法元素的数据结构之间的映射关系;
翻译单元603,用于基于映射关系,将源代码文件中的各语法元素翻译为目标语言,获得各语法元素对应的目标代码;
转换单元604,用于将各语法元素对应的目标代码按照上下文关联关系进行整合,获得源代码文件进行代码转换后的目标代码文件。
可选的,语法元素包括最小子系统中定义的系统类;
映射单元602具体用于:
基于最小子系统对源代码文件中的系统类进行语法映射,获得源代码文件中的系统类的数据结构与目标语言系统中的系统类的数据结构之间的映射关系。
可选的,最小子系统包括系统接口和预设的属性映射集;
映射单元602具体用于:
根据系统接口,将最小子系统中定义的类接口翻译为目标语言后,根据属性映射集对系统类进行语法映射,获得源代码文件中包含的系统类的数据结构与目标语言系统中的系统类的数据结构的之间映射关系。
可选的,语法元素还包括与应用程序相关联的第三方SDK中定义的第三方类;
映射单元602还用于:
通过类解析的方式,对第三方SDK中定义的第三方类进行类型推断和方法映射,得到源代码文件中包含的第三方类的数据结构与目标语言系统中的第三方类的数据结构之间的映射关系。
可选的,转换单元604具体用于:
基于各语法元素之间的上下文关联关系,对各语法元素对应的目标代码进行上下文关联,获得源代码文件中的每条语句对应的目标代码;
对每条语句对应的目标代码进行归类处理,得到目标代码文件。
可选的,转换单元604在对每条语句对应的目标代码进行归类处理之前,还用于:
对每条语句对应的目标代码中的变量类型和方法返回值进行类型推断,确定每条语句对应的目标代码所属的类;
通过每条语句对应的目标代码中的各个类进行签名校验,获取各个类的调用方法。
可选的,转换单元604具体用于:
根据每条语句对应的目标代码中语法元素的属性描述,对每条语句对应的目标代码进行文档归类处理;
将进行文档归类处理后的目标代码按照与目标语言对应的文件输出格式,以文件流的方式输出得到目标代码文件,其中与目标语言对应的文件输出格式是根据目标语言模板库确定的。
可选的,装置还包括:
更新单元605,用于在检测到源代码文件更新后,更新源代码文件中的语法元素的数据结构与目标语言系统中的语法元素的数据结构之间的映射关系;
基于更新后的映射关系,重新将源代码文件中的各语法元素翻译为目标语言,重新获得各语法元素对应的目标代码;
基于各语法元素之间的上下文关联关系,将重新获得的各语法元素对应的目标代码进行整合得到转换后的新的目标代码文件。
由于本申请实施例通过翻译的方式实现应用程序的代码转换,给跨平台开发带来了极大的便利性,极大地提高开发效率,只需要开发一次应用程序的源代码,其他端的代码实现可以同步生成,开发效率可以得到极大提升。并且,本申请实施例中的代码转换是源代码级别的转换,语法元素的翻译过程可控可调试,并且翻译后的目标代码,和对应目标平台运行的代码风格和设计模式完全一致。同时基于本申请中的应用程序代码转换方法,是直接对应用程序的源代码进行翻译,没有增加任何包体积大小,相比于其他方式的跨平台方案,开发难度更低,开发效率更高。
为了描述的方便,以上各部分按照功能划分为各模块(或单元)分别描述。当然,在实施本申请时可以把各模块(或单元)的功能在同一个或多个软件或硬件中实现。
在介绍了本申请示例性实施方式的应用程序代码转换方法和装置之后,接下来,介绍根据本申请的另一示例性实施方式的用于应用程序代码转换的电子设备。
所属技术领域的技术人员能够理解,本申请的各个方面可以实现为系统、方法或程序产品。因此,本申请的各个方面可以具体实现为以下形式,即:完全的硬件实施方式、完全的软件实施方式(包括固件、微代码等),或硬件和软件方面结合的实施方式,这里可以统称为“电路”、“模块”或“系统”。
图7是根据一示例性实施例示出的一种电子设备700的框图,该电子设备700可以指图1所示的终端设备110或服务器130,该电子设备包括:
处理器710;
用于存储处理器710可执行指令的存储器720;
其中,处理器710被配置为执行指令,以实现本申请实施例中的应用程序代码转换方法。
在示例性实施例中,还提供了一种包括指令的存储介质,例如包括指令的存储器720,上述指令可由电子设备700的处理器710执行以完成上述方法。可选地,存储介质可以是非临时性计算机可读存储介质,例如,非临时性计算机可读存储介质可以是ROM、随机存取存储器(RAM)、CD-ROM、磁带、软盘和光数据存储设备等。
在一些可能的实施方式中,本申请提供的应用程序代码转换方法的各个方面还可以实现为一种程序产品的形式,其包括程序代码,当程序产品在计算机设备上运行时,程序代码用于使计算机设备执行本说明书上述描述的根据本申请各种示例性实施方式的应用程序代码转换方法中的步骤,例如,计算机设备可以执行如图2中所示的步骤。
程序产品可以采用一个或多个可读介质的任意组合。可读介质可以是可读信号介质或者可读存储介质。可读存储介质例如可以是但不限于电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。
本申请的实施方式的程序产品可以采用便携式紧凑盘只读存储器(CD-ROM)并包括程序代码,并可以在计算装置上运行。然而,本申请的程序产品不限于此,在本文件中,可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被命令执行系统、装置或者器件使用或者与其结合使用。
可读信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了可读程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。可读信号介质还可以是可读存储介质以外的任何可读介质,该可读介质可以发送、传播或者传输用于由命令执行系统、装置或者器件使用或者与其结合使用的程序。
可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于无线、有线、光缆、RF等等,或者上述的任意合适的组合。
可以以一种或多种程序设计语言的任意组合来编写用于执行本申请操作的程序代码,程序设计语言包括面向对象的程序设计语言—诸如Java、C++等,还包括常规的过程式程序设计语言—诸如“C”语言或类似的程序设计语言。程序代码可以完全地在用户计算装置上执行、部分地在用户设备上执行、作为一个独立的软件包执行、部分在用户计算装置上部分在远程计算装置上执行、或者完全在远程计算装置或服务器上执行。在涉及远程计算装置的情形中,远程计算装置可以通过任意种类的网络包括局域网(LAN)或广域网(WAN)连接到用户计算装置,或者,可以连接到外部计算装置(例如利用因特网服务提供商来通过因特网连接)。
尽管已描述了本申请的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例做出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本申请范围的所有变更和修改。
显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本申请的精神和范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。

Claims (13)

1.一种应用程序代码转换方法,其特征在于,该方法包括:
获取待转换的应用程序的源代码文件中各语法元素的数据结构,以及所述源代码文件中各语法元素之间的上下文关联关系;
获得所述源代码文件中的语法元素的数据结构与目标语言系统中语法元素的数据结构之间的映射关系;
基于所述映射关系,将所述源代码文件中的各语法元素翻译为目标语言,获得各语法元素对应的目标代码;
将各语法元素对应的目标代码按照所述上下文关联关系进行整合,获得所述源代码文件进行代码转换后的目标代码文件;
其中,所述方法还包括:
在检测到所述源代码文件更新后,更新所述源代码文件中的语法元素的数据结构与所述目标语言系统中的语法元素的数据结构之间的映射关系;
基于更新后的所述映射关系,重新将所述源代码文件中的各语法元素翻译为目标语言,重新获得各语法元素对应的目标代码;
基于各语法元素之间的上下文关联关系,将重新获得的各语法元素对应的目标代码进行整合得到转换后的新的目标代码文件。
2.如权利要求1所述的方法,其特征在于,所述语法元素包括最小子系统中定义的系统类;
所述获得所述源代码文件中的语法元素的数据结构与目标语言系统中语法元素的数据结构之间的映射关系,具体包括:
基于最小子系统对所述源代码文件中的系统类进行语法映射,获得所述源代码文件中的系统类的数据结构与所述目标语言系统中的系统类的数据结构之间的映射关系。
3.如权利要求2所述的方法,其特征在于,所述最小子系统包括系统接口和预设的属性映射集;
所述基于最小子系统对所述源代码文件中的系统类进行语法映射,获得所述源代码文件中的系统类的数据结构与所述目标语言系统中的系统类的数据结构之间的映射关系,具体包括:
根据所述系统接口,将所述最小子系统中定义的类接口翻译为目标语言后,根据所述属性映射集对所述系统类进行语法映射,获得所述源代码文件中包含的系统类的数据结构与所述目标语言系统中的系统类的数据结构的之间映射关系。
4.如权利要求2所述的方法,其特征在于,所述语法元素还包括与所述应用程序相关联的第三方软件开发工具包SDK中定义的第三方类;
所述获得所述源代码文件中的语法元素的数据结构与目标语言系统中语法元素的数据结构之间的映射关系,还包括:
通过类解析的方式,对第三方SDK中定义的第三方类进行类型推断和方法映射,得到所述源代码文件中包含的第三方类的数据结构与目标语言系统中的第三方类的数据结构之间的映射关系。
5.如权利要求1所述的方法,其特征在于,所述将各语法元素对应的目标代码按照所述上下文关联关系进行整合,获得所述源代码文件进行代码转换后的目标代码文件,具体包括:
基于各语法元素之间的上下文关联关系,对各语法元素对应的目标代码进行上下文关联,获得所述源代码文件中的每条语句对应的目标代码;
对所述每条语句对应的目标代码进行归类处理,得到所述目标代码文件。
6.如权利要求5所述的方法,其特征在于,在所述对所述每条语句对应的目标代码进行归类处理之前,还包括:
对所述每条语句对应的目标代码中的变量类型和方法返回值进行类型推断,确定所述每条语句对应的目标代码所属的类;
通过所述每条语句对应的目标代码中的各个类进行签名校验,获取各个类的调用方法。
7.如权利要求5所述的方法,其特征在于,所述对所述每条语句对应的目标代码进行归类处理,得到所述目标代码文件,具体包括:
根据每条语句对应的目标代码中语法元素的属性描述,对所述每条语句对应的目标代码进行文档归类处理;
将进行文档归类处理后的目标代码按照与所述目标语言对应的文件输出格式,以文件流的方式输出得到所述目标代码文件,其中与所述目标语言对应的文件输出格式是根据目标语言模板库确定的。
8.一种应用程序代码转换装置,其特征在于,该装置包括:
分析单元,用于获取待转换的应用程序的源代码文件中各语法元素的数据结构,以及所述源代码文件中各语法元素之间的上下文关联关系;
映射单元,用于获得所述源代码文件中的语法元素的数据结构与目标语言系统中语法元素的数据结构之间的映射关系;
翻译单元,用于基于所述映射关系,将所述源代码文件中的各语法元素翻译为目标语言,获得各语法元素对应的目标代码;
转换单元,用于将各语法元素对应的目标代码按照所述上下文关联关系进行整合,获得所述源代码文件进行代码转换后的目标代码文件;
其中,所述装置还包括:
更新单元,用于在检测到所述源代码文件更新后,更新所述源代码文件中的语法元素的数据结构与所述目标语言系统中的语法元素的数据结构之间的映射关系;
基于更新后的所述映射关系,重新将所述源代码文件中的各语法元素翻译为目标语言,重新获得各语法元素对应的目标代码;
基于各语法元素之间的上下文关联关系,将重新获得的各语法元素对应的目标代码进行整合得到转换后的新的目标代码文件。
9.如权利要求8所述的装置,其特征在于,所述语法元素包括最小子系统中定义的系统类;
所述映射单元具体用于:
基于最小子系统对所述源代码文件中的系统类进行语法映射,获得所述源代码文件中的系统类的数据结构与所述目标语言系统中的系统类的数据结构之间的映射关系。
10.如权利要求9所述的装置,其特征在于,所述最小子系统包括系统接口和预设的属性映射集;
所述映射单元具体用于:
根据所述系统接口,将所述最小子系统中定义的类接口翻译为目标语言后,根据所述属性映射集对所述系统类进行语法映射,获得所述源代码文件中包含的系统类的数据结构与所述目标语言系统中的系统类的数据结构的之间映射关系。
11.如权利要求9所述的装置,其特征在于,所述语法元素还包括与所述应用程序相关联的第三方SDK中定义的第三方类;
所述映射单元还用于:
通过类解析的方式,对第三方SDK中定义的第三方类进行类型推断和方法映射,得到所述源代码文件中包含的第三方类的数据结构与目标语言系统中的第三方类的数据结构之间的映射关系。
12.一种电子设备,其特征在于,其包括处理器和存储器,其中,所述存储器存储有程序代码,当所述程序代码被所述处理器执行时,使得所述处理器执行权利要求1~7中任一所述方法的步骤。
13.一种计算机可读存储介质,其特征在于,其包括程序代码,当程序产品在电子设备上运行时,所述程序代码用于使所述电子设备执行权利要求1~7中任一所述方法的步骤。
CN202010553150.0A 2020-06-17 2020-06-17 一种应用程序代码转换方法、装置、电子设备和存储介质 Active CN111708539B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202010553150.0A CN111708539B (zh) 2020-06-17 2020-06-17 一种应用程序代码转换方法、装置、电子设备和存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202010553150.0A CN111708539B (zh) 2020-06-17 2020-06-17 一种应用程序代码转换方法、装置、电子设备和存储介质

Publications (2)

Publication Number Publication Date
CN111708539A CN111708539A (zh) 2020-09-25
CN111708539B true CN111708539B (zh) 2021-07-06

Family

ID=72541109

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202010553150.0A Active CN111708539B (zh) 2020-06-17 2020-06-17 一种应用程序代码转换方法、装置、电子设备和存储介质

Country Status (1)

Country Link
CN (1) CN111708539B (zh)

Families Citing this family (24)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN114327497A (zh) * 2020-09-30 2022-04-12 华为技术有限公司 一种代码处理方法、装置及设备
CN112199962A (zh) * 2020-09-30 2021-01-08 京东数字科技控股股份有限公司 代码处理方法、装置、计算机设备及存储介质
CN112230934B (zh) * 2020-10-27 2023-08-29 北京人大金仓信息技术股份有限公司 一种转换代码语言的方法及装置
CN112270176B (zh) 2020-11-09 2022-05-03 北京百度网讯科技有限公司 深度学习框架中模式转换的方法、装置和计算机存储介质
CN112416365B (zh) * 2020-11-18 2024-05-24 中信银行股份有限公司 文件转换方法、装置及存储介质
CN112416303B (zh) * 2020-11-19 2023-06-27 抖音视界有限公司 软件开发工具包热修复方法、装置及电子设备
CN112394936B (zh) * 2020-11-26 2024-06-25 中信银行股份有限公司 数据库操作指令转换方法、装置、设备及存储介质
CN112631644A (zh) * 2020-11-27 2021-04-09 贝壳技术有限公司 Flutter构造函数初始化式的修改方法及装置
CN112506489B (zh) * 2020-11-30 2024-06-18 广州市智能软件产业研究院 一种安全协议建模端与验证端的跨平台方法、计算机及存储介质
CN112698813B (zh) * 2020-12-29 2021-11-12 智慧神州(北京)科技有限公司 系统开发的方法、装置、计算机可读存储介质与处理器
CN112667223A (zh) * 2021-01-05 2021-04-16 北京城市网邻信息技术有限公司 组件配置表的生成方法、装置、电子设备及存储介质
TWI801836B (zh) * 2021-04-01 2023-05-11 台達電子工業股份有限公司 將程式碼於不同程式語言間進行轉換及優化的方法
CN113157257B (zh) * 2021-04-12 2024-03-29 山东省城市商业银行合作联盟有限公司 针对银行系统的快速开发装置
CN113138767B (zh) * 2021-04-25 2024-04-30 中国工商银行股份有限公司 代码语言转换方法、装置、电子设备及存储介质
CN113110873A (zh) * 2021-05-10 2021-07-13 中国建设银行股份有限公司 统一系统编码规范的方法和装置
CN113254027B (zh) * 2021-05-20 2024-05-14 西安华讯科技有限责任公司 一种半导体设备控制程序转换方法、系统、设备和存储介质
CN113360184B (zh) * 2021-06-04 2024-06-18 曙光信息产业(北京)有限公司 多生态间的软件迁移方法、装置、计算机设备及存储介质
CN113312057B (zh) * 2021-06-17 2023-10-03 上海小熊星教育科技有限公司 一种代码处理方法、编程辅助方法、介质及电子设备
CN113590129B (zh) * 2021-07-17 2024-05-17 西北工业大学 一种基于同步反应式构件的代码自动生成方法
CN113608748B (zh) * 2021-07-19 2024-04-30 上海浦东发展银行股份有限公司 C语言转换Java语言的数据处理方法、装置及设备
CN114610317A (zh) * 2022-03-16 2022-06-10 北京字节跳动网络技术有限公司 代码转换方法、装置、设备及存储介质
WO2023245344A1 (zh) * 2022-06-20 2023-12-28 北京小米移动软件有限公司 一种应用程序处理方法、装置、终端及存储介质
CN115237392B (zh) * 2022-09-21 2023-01-13 中国电子信息产业集团有限公司 数据流通系统中数据库代码生成、更新方法及系统
CN116126347B (zh) * 2023-04-17 2023-07-07 函子科技(杭州)有限公司 一种低代码应用程序的文件编译系统和方法

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2019155462A1 (en) * 2018-02-08 2019-08-15 Valid Network Ltd Code conversion method and system
CN110471666A (zh) * 2019-07-18 2019-11-19 五八有限公司 代码自动转换方法和装置、代码转换器及介质
CN110554875A (zh) * 2018-05-30 2019-12-10 北京三快在线科技有限公司 代码转换方法及装置、电子设备、存储介质
CN111209004A (zh) * 2019-12-30 2020-05-29 北京健康之家科技有限公司 代码转换方法及装置

Family Cites Families (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8656503B2 (en) * 2006-09-11 2014-02-18 Microsoft Corporation Security language translations with logic resolution
CN109352663B (zh) * 2018-09-28 2020-11-20 航天材料及工艺研究所 一种面向复合材料舱段的机器人自动精确定位制孔装置及方法
CN111177184A (zh) * 2019-12-24 2020-05-19 深圳壹账通智能科技有限公司 基于自然语言的结构化查询语言转换方法、及其相关设备

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2019155462A1 (en) * 2018-02-08 2019-08-15 Valid Network Ltd Code conversion method and system
CN110554875A (zh) * 2018-05-30 2019-12-10 北京三快在线科技有限公司 代码转换方法及装置、电子设备、存储介质
CN110471666A (zh) * 2019-07-18 2019-11-19 五八有限公司 代码自动转换方法和装置、代码转换器及介质
CN111209004A (zh) * 2019-12-30 2020-05-29 北京健康之家科技有限公司 代码转换方法及装置

Also Published As

Publication number Publication date
CN111708539A (zh) 2020-09-25

Similar Documents

Publication Publication Date Title
CN111708539B (zh) 一种应用程序代码转换方法、装置、电子设备和存储介质
CN108885545B (zh) 用于实时数据流编程语言的工具和方法
US10705943B2 (en) Automating identification of test cases for library suggestion models
CN103164249B (zh) 用于脚本语言编译器的扩展机制
US11531529B2 (en) Method and electronic device for deploying operator in deep learning framework
CN109739494B (zh) 一种基于Tree-LSTM的API使用代码生成式推荐方法
CN109375899A (zh) 一种形式验证Solidity智能合约的方法
Moldovan et al. AG: Imperative-style Coding with Graph-based Performance
US20150242194A1 (en) System for Translating Diverse Programming Languages
KR101213890B1 (ko) 강한 데이터 유형을 이용하여 소프트웨어 프로그램에서음성 인식 문법을 나타내기 위한 방법
CN108595171B (zh) 对象的模型生成方法、装置、设备及存储介质
CN112748914A (zh) 一种应用程序开发方法、装置、电子设备和存储介质
CN114153459A (zh) 接口文档生成方法及装置
CN114625349A (zh) 前端页面生成方法、装置、终端设备及存储介质
Irwin et al. Object oriented metrics: Precision tools and configurable visualisations
CN113778897A (zh) 接口的自动测试方法、装置、设备及存储介质
Cohl et al. Semantic preserving bijective mappings of mathematical formulae between document preparation systems and computer algebra systems
CN116755669A (zh) 一种基于dsl语言操作模型的低代码开发方法和工具
Martinez et al. Migrating c/c++ software to mobile platforms in the adm context
Wille et al. Identifying variability in object-oriented code using model-based code mining
CN110737431B (zh) 软件开发方法、开发平台、终端设备及存储介质
US8997035B2 (en) Extensible template-based code generator builder
Bergmayr et al. Leveraging annotation-based modeling with JUMP
CN113971028B (zh) 数据处理方法、装置、设备、存储介质及计算机程序产品
CN104657162A (zh) 一种服务环境修改方法和装置

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
REG Reference to a national code

Ref country code: HK

Ref legal event code: DE

Ref document number: 40028072

Country of ref document: HK

GR01 Patent grant
GR01 Patent grant