CN114327415B - 一种用于编译java文件的编译方法及装置 - Google Patents
一种用于编译java文件的编译方法及装置 Download PDFInfo
- Publication number
- CN114327415B CN114327415B CN202210261455.3A CN202210261455A CN114327415B CN 114327415 B CN114327415 B CN 114327415B CN 202210261455 A CN202210261455 A CN 202210261455A CN 114327415 B CN114327415 B CN 114327415B
- Authority
- CN
- China
- Prior art keywords
- compiling
- java
- file
- information
- class
- 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
Landscapes
- Devices For Executing Special Programs (AREA)
Abstract
本发明公开一种用于编译java文件的编译方法及装置,方法包括以下:获取待编译的java文件包;解析所述java文件包,得到解析信息,所述解析信息为所述java文件包中各个基础单元组成信息;对所述java文件包进行等同格式转化,在所述等同格式转化中对所述解析信息加入自定义标识并排序,以得到改造信息;将所述改造信息通过对应编译器进行编译。本发明有益效果是:能够直接对java文件进行编译转换,转换的效率高适配性强,且能克服java转换过程中的关系继承难点。
Description
技术领域
本发明涉及文件编译领域,尤其涉及一种用于编译java文件的编译方法及装置。
背景技术
目前,传统的对java程序编译的方法都是在本地编译成Java字节码,由平台上的Java虚拟机将字节码翻译成与平台相关的指令运行在平台上。但目前存在的一种无法使用Java而只能使用C语言的现实情景,在该背景下,必须要将java文件转换为C文件才可进行正常的指令运行。但目前尚缺少一种高效有效的手段能实现这一转换。
因此,现在亟需一种用于编译java文件的编译方法来解决上述问题。
发明内容
为了解决以上技术问题,针对以上的需求,本发明提出一种用于编译java文件的编译方法及装置。
本申请提供的一种用于编译java文件的编译方法,包括以下:
S1、获取待编译的java文件包;
S2、解析所述java文件包,得到解析信息,所述解析信息为所述java文件包中各个基础单元组成信息;
S3、对所述java文件包进行等同格式转化,在所述等同格式转化中对所述解析信息加入自定义标识并排序,以得到改造信息;
S4、将所述改造信息通过对应编译器进行编译。
进一步地,步骤S3中,对所述解析信息加入自定义标识并排序,具体指:对解析信息中的接口和类进行排序;在排序过程中对接口和类中的方法添加自定义标识。
进一步地,对接口和类进行排序,均按照从顶至底的等同格式转换进行排序。
进一步地,java文件中的每一个类被改造为一个.C文件和一个.H文件;java文件中的每一个接口被改造为1个.H文件。
进一步地,在改造过程中,还采用差异格式转换对方法中的基本函数和成员进行改造。
所述基本函数包括:构造函数、静态函数、虚函数和接口函数。
一种用于编译java文件的编译装置,所述装置包括:
文件获取模块:获取待编译的java文件包;
文件解析模块:解析所述java文件包,得到解析信息,所述解析信息为所述java文件包中各个基础单元组成信息;
文件转换模块:对所述java文件包进行等同格式转化,在所述等同格式转化中对所述解析信息加入自定义标识并排序,以得到改造信息;
文件编译模块:将所述改造信息通过对应编译器进行编译。
一种计算机设备,包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现所述用于编译java文件的编译方法的步骤。
一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现所述用于编译java文件的编译方法的步骤。
与现有技术相比,本发明的有益效果包括:能够直接对java文件进行编译转换,转换的效率高适配性强,且能克服java转换过程中的关系继承难点。
附图说明
图1是本发明提供的一种用于编译java文件的编译方法的流程示意图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
本发明提供了一种用于编译java文件的编译方法。请参考图1,图1是本发明的架构示意图;包括以下:
本申请提供的一种用于编译java文件的编译方法,包括以下:
S1、获取待编译的java文件包;
需要说明的是,java文件包由一个或多个java文件组成;java文件为java语言语法所规定的格式的标准格式文件;
S2、解析所述java文件包,得到解析信息,所述解析信息为所述java文件包中各个基础单元组成信息;
需要说明的是,各个基础单元包括:接口、类、方法、函数、成员;从java文件包中解析,即对应解析出不同java文件中的这些基础单元信息;
S3、对所述java文件包进行等同格式转化,在所述等同格式转化中对所述解析信息加入自定义标识并排序,以得到改造信息;
需要说明的是,等同格式转换,指,在整体层面,对java文件整体本身进行相同标准意义上的格式转换;另外,在文件中不同部分,对应于不同基础单元信息,本申请会进行一些差异格式转换,在后文进行具体说明;
首先,本申请对等同格式转换的概念,具体进行说明。
对于java语言而言,由于其存在类、接口、方法以及继承关系,而在C语言中是不存在这些定义的,那么在将java转换为C的过程中,核心问题即为如何将类、接口、方法进行表示,以及如何对他们的继承关系进行说明,从而在编译时能够有效查找到。
在步骤S3中,等同格式转换,即对所述解析信息加入自定义标识并排序,具体指:
(1)对解析信息中的接口和类进行排序;
(2)在排序过程中对接口和类中的方法添加自定义标识。
关于第(1)点,采用的是一种从顶至底的索引方式;其中对java文件中接口的排序,按照以下顺序,依次为:接口标识、父接口索引;作为一种实施例而言,可以表示如下:
INTERFACE1...N:
接口标识->父接口索引1-N
文件中的接口描述是对整个java包中定义的接口的声明,用于接口方法查找链接使用。
关于第(1)点中,对类的排序,采用以下顺序,依次为:类标识、父类索引、父类的方法数、本类的方法数、类实现的接口的描述;作为一种实施例,可以表示如下:
CLASS:
类标识->父类索引->父类方法数->本类方法数->类实现的接口描述;
其中,所述类实现的接口描述,又按照以下顺序排序:类对应的接口索引、类对应接口方法个数、接口方法地址;也即采用下述形式:
接口索引->接口方法个数->接口方法地址;
文件中的类描述是对整个java包中定义的类的声明,用于类方法查找链接使用。
通过第(1)点的转换形式,每个java类文件转换为一个.c和一个.h文件,而接口由于不存在具体实现,因此只生成一个.h文件,里面的所有方法以在原始文件中的声明顺序在.h文件中排列。
另外,每个方法都附带有自定义标识,下面对第(2)点进行阐明;
关于第(2)点,在排序过程中对接口和类中的方法添加自定义标识(下文用MID标识表示),具体的说,其规则如下:
如果当前类到最顶层类中没有重载任何方法,用MID_BASE表示父类的所有虚方法个数,MID表示当前虚方法的个数;
如果当前类到最顶层类中有重载的方法,则MID_BASE为0,MID表示所有类方法的个数(重载只算1个);
生成的.C文件中按父类到子类的顺序将所有方法排序,如果当前类中有重载的方法则使用当前类的方法替换父类中的方法。子类中会按照父类的方法顺序列举出来,并将重载的构造方法<init>和m2替换到对应的位置,所有方法的标识按照该顺序排列。
需要进一步进行说明的是,在改造过程中,还采用差异格式转换对方法中的基本函数和成员进行改造;
差异格式转换的概念,主要是针对java文件方法中不同的基本函数和成员所提出的;基本函数包括了:构造函数、静态函数、虚函数和接口函数。而成员则包括:类的非静态成员field、Final static变量、基础数据类型成员;下面本申请对其转换的具体过程进行具体说明。
作为一种实施例,本申请对于构造函数的转换过程具体如下:
构造函数,对于java中的构造函数,对每一个类都声明一个结构体。
在Java中对于类的构造分两种情况:new class和API返回构造函数,所有类都有类默认的初始化函数,该函数是用于调用父类的<init>初始化函数,以及执行本类的类成员初始化。
对于new class来创建类对象,首先需要构造类的结构体变量:
查找java代码中new对应的类以及生成的.c和.h文件;
创建类的头文件中的结构体变量。
然后又分两种情况,第一种是java类中没有自定义构造函数,那么直接调用默认的类初始化函数;第二种是如果有自定义构造函数,则调用对应的初始化函数。
而对于通过API返回构造函数,直接常规处理,做API处理即可。
作为一种实施例,本申请对于静态函数的转换过程具体如下:
对于java中的静态函数,生成静态函数的方法时采用包名+类名+函数名(参数)来生成唯一标识,然后用函数名_标识来表示该方法,转换出的静态函数通过函数名直接访问。
作为一种实施例,本申请对于虚函数的转换过程具体如下:
对于java中的虚函数,生成虚函数的方法时采用包名+类名+函数名(参数)来生成唯一标识,然后用函数名_标识来表示该方法;
转换出来的类文件由.c和.h文件组成,在头文件中声明本文件是JAVA类,并且声明其父类的名称标识,所有的虚方法都是对象所在类的方法,所以方法在原有参数基础上增加一个对象参数,其他参数不变。子类的方法重载时,同一个方法在子类和父类中实际是不同的函数名,调用重载的函数时直接调用目标类中的重载方法。
由于java中类的继承和虚方法重载的原因,编译器无法确定要调用的虚方法所在的类,因此本方案使用API的方式将对象和虚方法标识交给虚拟机平台处理。
具体的编译过程:
如java中调用object.fun(i1,i2):
将虚方法转换为对应的虚方法查找函数API,如*(fun*)findvirtual(objet,MID)(object,i1,i2);
此时函数调用分为2部分进行:
第一步,调用API函数findvirtual,其返回值为函数指针,参数object对应java中的类对象,编译器编译时根据object声明的类类型去查找要调用的方法在该类中的标识号MID,然后做为参数传递给API。
第二步,调用函数指针*(fun*)(object,i1,i2)。
相应的对于虚拟机平台,在处理findvirtual时先获取object对应的类,然后在其类信息里面查找标识对应的方法,返回方法的索引值。
作为一种实施例,本申请对于接口函数的转换过程具体如下:
对于java中的接口函数,接口只提供接口函数声明而类中提供函数实现,在接口函数调用时依赖于具体的接口实现类,因此不能直接通过访问函数名的方式进行调用。
接口文件转换出来的文件只有.h文件,在头文件中声明本文件是JAVA接口文件,并且声明其父接口的名称标识。
转换出来的接口文件中接口函数使用包名+接口名+函数名(参数)生成唯一标识值,然后用函数名_标识来表示该接口函数。所有接口方法最终都是对象所在类的方法,所以方法在原有参数基础上增加一个对象参数,其他参数不变。
具体的编译过程:
如java中调用object.interfacefun(i1,i2):
将接口方法转换为对于的接口方法查找函数API,如*(fun*)findinterface(object,MID1,MID2)(object,i1,i2);
此时函数调用分为2部分进行:
第一步,调用API函数findinterface,其返回值为函数指针,参数object对应java中的实现该接口的类对象,编译器编译时先根据object声明的接口类型去查找该接口所在的程序包,以及接口在程序包中的标识MID1,然后查找要调用的方法在该接口中的标识号MID2,最后将MID1和MID2做为参数传递给API。
第二步,调用函数指针*(fun*)(object,i1,i2)。
相应的虚拟机平台处理findinterface时先获取object对应的类,然后在类对应的程序包中查找MID1对应的接口,在对象的类信息里面查找MID1对应的接口实现表,最后通过MID2查找接口方法对应的类实现方法。
最后,作为一种实施例,本申请对除去基本函数以外的其它,包括:数组访问和存储;类成员;Final static变量;不同类之间的强转等,其转换过程具体如下:
数组访问和存储中,Java中可以通过如下2种方式创建数组:
1、全局的有初值的数组声明,声明是在类的init函数中创建,不需要额外处理。
2、通过new关键字进行创建,那么先将该操作转换成对应的API,数组的访问和存储时转换工具转换为(type*)array[]的方式,type对应c语言中的char,short,int。对于对象类型的数组,转换为结构体变量数组,在字节码中构造时传入结构体对应的常量池ID。
类成员:类的非静态成员field,转换工具生成时直接使用in_class_struct{}中的成员表示;
Final static变量:对于java中声明为fianl statci的变量:
1、如果是基础类型如byte,short,int类型则不需要处理,java字节码中已经处理为立即数,直接使用即可。
2、如果是数组类型则需要通过字节码来生成对应数组,并且赋值。
不同类之间的强转:类和接口之间的强转涉及到相互之间的继承关系,在java应用中是某个对象强转为某个类或者接口,由于编译器无法准确知道对象的具体类型,因此该处由COS使用API来进行强转判断。
一种用于编译java文件的编译装置,所述装置包括:
文件获取模块:获取待编译的java文件包;
文件解析模块:解析所述java文件包,得到解析信息,所述解析信息为所述java文件包中各个基础单元组成信息;
文件转换模块:对所述java文件包进行等同格式转化,在所述等同格式转化中对所述解析信息加入自定义标识并排序,以得到改造信息;
文件编译模块:将所述改造信息通过对应编译器进行编译。
一种计算机设备,包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现所述用于编译java文件的编译方法的步骤。
一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现所述用于编译java文件的编译方法的步骤。
应理解,上述实施例中各步骤的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本申请实施例的实施过程构成任何限定。
本发明的有益效果是:能够直接对java文件进行编译转换,转换的效率高适配性强,且能克服java转换过程中的关系继承难点。
以上所述本发明的具体实施方式,并不构成对本发明保护范围的限定。任何根据本发明的技术构思所做出的各种其他相应的改变与变形,均应包含在本发明权利要求的保护范围内。
Claims (6)
1.一种用于编译java文件的编译方法,其特征在于:包括以下步骤:
S1、获取待编译的java文件包;
S2、解析所述java文件包,得到解析信息,所述解析信息为所述java文件包中各个基础单元组成信息;
S3、对所述java文件包进行等同格式转化,在所述等同格式转化中对所述解析信息加入自定义标识并排序,以得到改造信息;
步骤S3中,对所述解析信息加入自定义标识并排序,具体指:对解析信息中的接口和类进行排序;在排序过程中对接口和类中的方法添加自定义标识;
对接口和类进行排序,均按照从顶至底的等同格式转换进行排序;
在改造过程中,还采用差异格式转换对方法中的基本函数和成员进行改造;
S4、将所述改造信息通过对应编译器进行编译。
2.如权利要求1所述的一种用于编译java文件的编译方法,其特征在于:所述改造信息,具体为:每一个类被改造为一个.C文件和一个.H文件;每一个接口被改造为1个.H文件。
3.如权利要求1所述的一种用于编译java文件的编译方法,其特征在于:所述基本函数包括:构造函数、静态函数、虚函数和接口函数。
4.一种用于编译java文件的编译装置,其特征在于,所述装置包括:
文件获取模块:获取待编译的java文件包;
文件解析模块:解析所述java文件包,得到解析信息,所述解析信息为所述java文件包中各个基础单元组成信息;
文件转换模块:对所述java文件包进行等同格式转化,在所述等同格式转化中对所述解析信息加入自定义标识并排序,以得到改造信息;
文件转换模块中,对所述解析信息加入自定义标识并排序,具体指:对解析信息中的接口和类进行排序;在排序过程中对接口和类中的方法添加自定义标识;
对接口和类进行排序,均按照从顶至底的等同格式转换进行排序;
在改造过程中,还采用差异格式转换对方法中的基本函数和成员进行改造;
文件编译模块:将所述改造信息通过对应编译器进行编译。
5.一种计算机设备,其特征在于,包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现如权利要求1至3任一项所述用于编译java文件的编译方法的步骤。
6.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现如权利要求1至3任一项所述用于编译java文件的编译方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210261455.3A CN114327415B (zh) | 2022-03-17 | 2022-03-17 | 一种用于编译java文件的编译方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210261455.3A CN114327415B (zh) | 2022-03-17 | 2022-03-17 | 一种用于编译java文件的编译方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN114327415A CN114327415A (zh) | 2022-04-12 |
CN114327415B true CN114327415B (zh) | 2022-05-31 |
Family
ID=81033748
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210261455.3A Active CN114327415B (zh) | 2022-03-17 | 2022-03-17 | 一种用于编译java文件的编译方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114327415B (zh) |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108829405A (zh) * | 2018-06-04 | 2018-11-16 | 网易(杭州)网络有限公司 | 渠道包的生成方法及装置、存储介质、电子装置 |
CN112558984A (zh) * | 2020-12-29 | 2021-03-26 | Oppo广东移动通信有限公司 | 代码编译的方法、装置、电子设备以及服务器 |
CN112882718A (zh) * | 2021-02-26 | 2021-06-01 | 百果园技术(新加坡)有限公司 | 编译处理方法、装置、设备及存储介质 |
Family Cites Families (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101968736A (zh) * | 2010-09-13 | 2011-02-09 | 杭州元睿信息技术有限公司 | 一种应用于Java到C++语言程序翻译中外部引用的翻译方法 |
US10324693B2 (en) * | 2015-11-24 | 2019-06-18 | Nvidia Corporation | Optimizing multiple invocations of graphics processing unit programs in Java |
US10095511B1 (en) * | 2017-02-23 | 2018-10-09 | Amdocs Development Limited | System, method, and computer program for converting a current Java project to a Maven project |
CN109086147B (zh) * | 2018-07-31 | 2022-02-22 | 深圳市元征科技股份有限公司 | 应用程序的服务接口调用方法、装置及存储介质 |
CN110162335A (zh) * | 2019-04-26 | 2019-08-23 | 深圳壹账通智能科技有限公司 | 代码重构方法、装置、计算机设备及介质 |
CN113836495A (zh) * | 2021-09-25 | 2021-12-24 | 上海蛮犀科技有限公司 | 一种将Java代码等价转换成C++代码的方法 |
-
2022
- 2022-03-17 CN CN202210261455.3A patent/CN114327415B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108829405A (zh) * | 2018-06-04 | 2018-11-16 | 网易(杭州)网络有限公司 | 渠道包的生成方法及装置、存储介质、电子装置 |
CN112558984A (zh) * | 2020-12-29 | 2021-03-26 | Oppo广东移动通信有限公司 | 代码编译的方法、装置、电子设备以及服务器 |
CN112882718A (zh) * | 2021-02-26 | 2021-06-01 | 百果园技术(新加坡)有限公司 | 编译处理方法、装置、设备及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN114327415A (zh) | 2022-04-12 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108920133B (zh) | 跨语言编程方法、装置、电子设备及存储介质 | |
US5590331A (en) | Method and apparatus for generating platform-standard object files containing machine-independent code | |
CN110149800B (zh) | 一种用于处理与源程序的源代码相关联的抽象语法树的装置 | |
US20080222616A1 (en) | Software translation | |
US8464232B2 (en) | Compiler compiler system with syntax-controlled runtime and binary application programming interfaces | |
CN110245467B (zh) | 基于Dex2C与LLVM的Android应用程序保护方法 | |
US20090138847A1 (en) | Optimized code generation by eliminating unused virtual function | |
EP0528028A1 (en) | Automatic flowgraph generation for program analysis and translation | |
AU2892200A (en) | Automatic stub/adapter generator | |
CN111506314B (zh) | 项目开发的方法、装置、服务器及介质 | |
CN111427583A (zh) | 组件的编译方法、装置和电子设备及计算机可读存储介质 | |
CN112379917A (zh) | 浏览器兼容性提升方法、装置、设备及存储介质 | |
US7458071B2 (en) | Compilation method, compiler apparatus and compiler | |
CN113703779B (zh) | 一种跨平台的多语言编译方法和超轻量物联网虚拟机 | |
CN111008067A (zh) | 一种在虚拟机中执行功能模块的方法和装置 | |
MXPA03004411A (es) | Sistema y metodo para definir y utilizar subclases declarativamente por marcas. | |
CN114327415B (zh) | 一种用于编译java文件的编译方法及装置 | |
CN112905271A (zh) | 一种应用程序接口api的调用方法、装置及电子设备 | |
US7207036B2 (en) | Preprocessing of interfaces to allow fast call through | |
JP2022522880A (ja) | プログラム論理の表現を生成する方法、逆コンパイル装置、再コンパイルシステムおよびコンピュータプログラム製品 | |
CN113835688B (zh) | 一种科学计算语言解释器的对象封装方法 | |
CN116594622A (zh) | 基于类型推导与数据流分析的Python程序编译方法及系统 | |
CN115357251A (zh) | 一种移动端iOS开发数据转模型的方法 | |
Troger et al. | Analysis of virtual method invocation for binary translation | |
EP2122464A1 (en) | A computer implemented translation 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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |