编译方法、解释方法、装置及用户设备的制作方法

文档序号:6503114阅读:150来源:国知局
编译方法、解释方法、装置及用户设备的制作方法
【专利摘要】本发明涉及一种编译方法、解释方法、装置及用户设备,该方法包括:解析第一源代码对应的字节码;根据解析结果生成抽象语法树;遍历所述抽象语法树,将所述第一源代码对应的字节码转换为第二源代码对应的字节码。编译方法、解释方法、装置及用户设备通过对源代码对应的字节码进行解析,并基于解析结果生成抽象语法树,从而根据抽象语法树转换为另一源代码对应的字节码或执行该源代码对应的字节码,执行效率快,无需中间层转换,使得整个系统的性能得以提升。
【专利说明】编译方法、解释方法、装置及用户设备

【技术领域】
[0001]本发明涉及编译、解释【技术领域】,尤其是编译方法、解释方法、装置(包括编译器和解释器)及用户设备。

【背景技术】
[0002]在现有的编译(Compiling)/解释(Interpreting)【技术领域】,存在若干编译器(Compiler)/ 解释器(Interpreter)Jn:针对 Javascript 语言的 Google V8 引擎,其内嵌在浏览器(Web Browser)中,将Javascript脚本进行动态翻译/执行;针对Perl语言的解释器,其运行于x86平台,将Perl脚本进行动态翻译/执行;其它动态语言,如Lua、Tcl/Tk、Ruby,均有运行于x86平台的编译器/解释器,供动态翻译/执行对应的程序。这些技术仅针对特定的语言和特定的平台。
[0003]Dalvik虚拟机仅支持原生Dalvik Java编程语言,而Python程序(.py)默认被位于主机端(Host、x86平台)的Python编译器(python)进行编译,其生成的Python字节码基于栈方式设计,不同于Davlvik的基于寄存器的字节码设计,且两者的字节码指令完全不同。因此,现有的Python程序无法被Dalvik虚拟机执行。
[0004]另外,在运行时(Runtime)层面,可通过脚本层(Scripting Layer,如Android的脚本架构层(Scripting Layer for Android, SL4A)支持 Python 编程语言。该 ScriptingLayer被设计为通过JSON(Javascript Object Notat1n,—种数据格式)数据格式,在SL4A RPC(Remote Procedure Call Protocol,远程过程调用协议)的服务器端(Server)和用户端(Client)中间进行消息(Messages)和数据(Data)交换(见图1)。该方式以Dalvik Java应用程序编程接口(Applicat1n Programming Interface,API)调用形式,使Python程序可被Dalvik虚拟机执行。由于其增加了 Scripting Layer,使得Python程序无法直接被Dalvik虚拟机执行,与Java程序直接编译为Dalvik字节码执行相比,Python程序执行效率较低。
[0005]上述各种方式,无论编译/解释过程,还是运行时层面,它们均无法对Python编程语言从字节码上支持,导致Python编程语言无法被Dalvik虚拟机编译/解释,系统性能低下。


【发明内容】

[0006]本发明要解决的技术问题是提供一种编译方法、解释方法、装置及用户设备,以解决现有编译或解释方法导致的系统性能低下的技术问题。
[0007]为解决上述技术问题,本发明提供了一种编译方法,该方法包括:
[0008]解析第一源代码对应的字节码;
[0009]根据解析结果生成抽象语法树;
[0010]遍历所述抽象语法树,将所述第一源代码对应的字节码转换为第二源代码对应的字节码。
[0011]进一步地,转换为第二源代码对应的字节码后,该方法还包括:
[0012]编译所述第二源代码对应的字节码为所述第二源代码对应的应用程序。
[0013]进一步地,所述解析所述第一源代码对应的字节码前,该方法还包括:基于所述第一源代码生成所述第一源代码对应的字节码。
[0014]为解决上述技术问题,本发明还提供了一种解释方法,该方法包括:
[0015]解析某一源代码对应的字节码;
[0016]根据解析结果生成抽象语法树;
[0017]基于所述抽象语法树,执行所述字节码。
[0018]进一步地,所述解析所述字节码前,该方法还包括:基于所述源代码生成字节码。
[0019]为解决上述技术问题,本发明还提供了一种编译器,该编译器包括:
[0020]解析单元,用于解析第一源代码对应的字节码;
[0021]语法树生成单元,用于根据解析结果生成抽象语法树;
[0022]代码转换单元,用于遍历所述抽象语法树,将所述第一源代码对应的字节码转换为第二源代码对应的字节码。
[0023]进一步地,所述编译器还包括:
[0024]字节码生成单元,用于基于所述第一源代码生成所述第一源代码对应的字节码;
[0025]程序编译单元,用于编译所述第二源代码对应的字节码为所述第二源代码对应的应用程序。
[0026]为解决上述技术问题,本发明还提供了一种解释器,该解释器包括:
[0027]字节码解析单元,用于解析某一源代码对应的字节码;
[0028]语法树生成单元,用于根据解析结果生成抽象语法树;
[0029]代码执行单元,用于基于所述抽象语法树,执行所述字节码。
[0030]进一步地,所述解释器还包括字节码生成单元,用于基于所述源代码生成所述字节码。
[0031]为解决上述技术问题,本发明提供了一种用户设备,所述用户设备包括如上任一项所述的编译器或如上所述的解释器。
[0032]相较于现有技术,本发明编译方法、解释方法、装置及用户设备通过对源代码对应的字节码进行解析,并基于解析结果生成抽象语法树,从而根据抽象语法树转换为另一源代码对应的字节码或执行该源代码对应的字节码,执行效率快,无需中间层转换,使得整个系统的性能得以提升。

【专利附图】

【附图说明】
[0033]图1为现有Dalvik虚拟机在运行时层面支持Python的示意图;
[0034]图2为本发明编译方法实施例1的示意图;
[0035]图3为本发明编译方法实施例2的示意图;
[0036]图4、5为本发明应用实例的示意图;
[0037]图6为本发明编译装置实施例的模块结构示意图;
[0038]图7为本发明解释方法实施例的示意图;
[0039]图8为本发明解释装置实施例的模块结构示意图。

【具体实施方式】
[0040]实施例1
[0041]本发明编译方法实施例1,如图2所示,该方法包括:
[0042]步骤201:解析第一源代码对应的字节码;
[0043]步骤202:根据解析结果生成抽象语法树;
[0044]步骤203:遍历所述抽象语法树,将所述第一源代码对应的字节码转换为第二源代码对应的字节码。
[0045]实施例2
[0046]本发明编译方法实施例2,如图3所示,该方法包括:
[0047]步骤301:基于第一源代码对应的应用程序生成所述第一源代码对应的字节码;
[0048]步骤302:解析第一源代码对应的字节码;
[0049]步骤303:根据解析结果生成抽象语法树;
[0050]步骤304:遍历所述抽象语法树,将所述第一源代码对应的字节码转换为第二源代码对应的字节码;
[0051]可理解地,所述第一源代码与第二源代码不同,本发明中,所述第一源代码与所述第二源代码为以下源代码之一:
[0052]Dalvik 虚拟机运行的代码、Python、Javascript、PHP> Lua> Tcl/Tk、Perl、Ruby。
[0053]其中,Dalvik虚拟机是Google Android Java虚拟机,基于寄存器架构,适合内存和处理器速度有限的系统;Python是一种面向对象、直译式动态语言Javascript是一种用于客户端网页开发的脚本语言;PHP,是一种HTML内嵌式的语言,全称为超级文本预处理(Hypertext Preprocessor)语言;Lua是一种轻量、可扩展的脚本语言;Tcl/Tk是一种用于快速原型开发脚本语言;Perl市一种高阶、通用、直译式、动态的程序语言;Ruby是一种简单快捷、面向对象编程的脚本语言。
[0054]步骤305:编译所述第二源代码对应的字节码为所述第二源代码对应的应用程序。
[0055]应用实例
[0056]该应用实例中将Python字节码编译为Dalvik字节码,实现Dalvik虚拟机对Python编程语言的原生支持,使得Python程序可直接被Dalvik虚拟机执行,也避免了Scripting Layer对消息/数据的额外转换,提升了 Python程序在Dalvik虚拟机中的运行性能。
[0057]图4中,Python源代码sample.Py被编译为Python字节码,如sample, pyc,解析该sample, pyc生成抽象语法树,进而将Python字节码转换为Dalvik字节码,并生成Dalvik可执行程序sample, dex。
[0058]如图5所示,
[0059]步骤501:将Python程序(如Sample.Py)采用Python编译器生成Python字节码,如Sample, pyc文件;
[0060]运行Python编译器,将sample.Py编译为sample, pyc,编译命令如下:
[0061]python-m py_compile sample, py
[0062]该文件为二进制代码文件,按Python对象进行布局,包含如:整数(int)、字符串(string)、列表(list)、代码(code)等Python Object信息。其中,代码部分存储了 Python
字节码。
[0063]步骤502:解析上述 sample, pyc ;
[0064]解析sample, pyc包括读取标示码(magic)、时间戳(timestamp)以及Python对象(Python Object)
[0065]步骤503:根据解析结果生成抽象语法树(Abstract Syntax Tree, AST);
[0066]Python抽象语法树的具体内容包括加载常量(L0AD_C0NST)、导入名称aMP0RT_NAME)、调用函数(CALL_FUNCT10N)、弹出堆栈顶层元素(Ρ0Ρ_Τ0Ρ)、前向跳转(JUMP_FORWARD)、返回值(RETURN_VALUE)。
[0067]步骤504:遍历抽象语法树,将Python字节码转换为Dalvik字节码(如sample,dex);
[0068]遍历抽象语法树的各个节点,其中,各个节点包含相应的Python字节码指令,将读取的Python字节码指令直接映射为Dalvik字节码指令,或转换为具备相同功能的Dalvik字节码指令段,供后续进一步处理。
[0069]步骤505:按照 Dalvik 二进制格式(.dex),生成 Dalvik 程序(如 sample, apk);
[0070]运行sample, dex,例如:如可在主机端编写具备图形显示功能的Python应用程序sample.PyJn⑶I交互程序,2D/3D显示程序等,通过本发明上述方式将Python应用程序sample.Py编译为Dalvik字节码,进而生成sample, dex后,可在目标端(手机)运行sample, dex,即可看到相应的图形显示效果。
[0071]该应用实例中通过将Python基于栈的字节码(Stack-based Bytecode)静态编译为Dalvik基于寄存器的字节码(Register-based Bytecode),可实现Dalvik虚拟机对Python编程语言从字节码(Bytecode)上的支持。
[0072]为实现上述编译方法实施例,本发明还提供了一种编译器,如图6所示,该编译器包括:
[0073]解析单元,用于解析第一源代码对应的字节码;
[0074]语法树生成单元,用于根据解析结果生成抽象语法树;
[0075]代码转换单元,用于遍历所述抽象语法树,将所述第一源代码对应的字节码转换为第二源代码对应的字节码。
[0076]为了实现上述编译方法实施例2,可选地,所述编译器还包括:
[0077]字节码编译单元,用于基于所述第一源代码生成所述第一源代码对应的字节码;
[0078]程序编译单元,用于编译所述第二源代码对应的字节码为所述第二源代码对应的应用程序。
[0079]如上文所述,所述第一源代码与第二源代码不同,所述第一源代码与所述第二源代码为以下源代码之一:
[0080]Dalvik 虚拟机运行的代码、Python、Javascript、PHP> Lua> Tcl/Tk、Perl、Ruby。
[0081]另外,本发明还提供了一种用户设备,所述用户设备包括如上所述的编译器。
[0082]实施例3
[0083]基于相同的构思,本发明还提出了一种解释方法,如图7所示,该方法包括:
[0084]步骤701:解析某一源代码对应的字节码;
[0085]步骤702:根据解析结果生成抽象语法树;
[0086]步骤703:基于所述抽象语法树,执行所述字节码。
[0087]可选地,所述解析所述字节码前,该方法还包括:基于所述源代码生成所述字节码。
[0088]解释方法实施例3中的源代码包括但不限于以下源代码:
[0089]Dalvik 虚拟机运行的代码、Python、Javascript、PHP> Lua> Tcl/Tk、Perl、Ruby。
[0090]应用实例:
[0091]将Python程序采用Python编译器生成.pyc文件,该文件为二进制代码文件,按Python Object进行布局,包含如:整数(int)、字符串(string),列表(list)、代码(code)等Python Object信息。其中,代码部分存储了 Python字节码。
[0092]上述.pyc文件中的字节码为Python原生字节码,可被Python解释器(python)在主机端直接执行,或在目标端(Target,ARM平台)直接解释/运行.pyc字节码。
[0093]例如:可在主机端编写具备图形显示的Python应用程序sample.Py,如⑶I交互程序,2D/3D显示程序等,无需编译sample.Py,如采用本发明解释方法,则可直接将sample.Py拷贝至目标端(手机),并运行sample.Py,即可看到相应的图形显示效果。
[0094]为了实现上述解释方法,本发明还提供了一种解释器,如图8所示,该解释器包括:
[0095]字节码解析单元,用于解析某一源代码对应的字节码;
[0096]语法树生成单元,用于根据解析结果生成抽象语法树;
[0097]代码执行单元,用于基于所述抽象语法树,执行所述某一源代码对应的字节码。
[0098]优选地,所述解释器还包括字节码生成单元,用于基于同一源代码生成所述字节码。
[0099]如上所述,该解释器适用的源代码包括但不限于=Dalvik虚拟机运行的代码、Python、Javascript、PHP> Lua> Tcl/Tk、Perl、Ruby。
[0100]另外,本发明还提供了一种用户设备,所述用户设备包括如上所述的解释器。
[0101 ] 本发明编译方法和解释方法不仅可应用于Python程序,也可扩展为其它静态/动态编程语言,如Javascript、PHP、Lua、Tcl/Tk、Perl、Ruby,使其由源代码编译为Dalvik字节码执行,或直接由Dalvik解释器执行。例如Javascript语言默认在主机端被内嵌浏览器的Javascript引擎解释执行,通过本发明编译方法可将其转换为Dalvik字节码,使其可在目标端(手机)直接执行,无需再依赖内嵌浏览器的Javascript引擎。
[0102]相较于现有技术,本发明编译方法、解释方法、装置及用户设备通过对源代码对应的字节码进行解析,并基于解析结果生成抽象语法树,从而根据抽象语法树转换为另一源代码对应的字节码或执行该源代码对应的字节码,执行效率快,无需中间层转换,使得整个系统的性能得以提升。
[0103]应该注意的是上述实施例对本发明进行说明而不是对本发明进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。本发明的各个部件实施例可以以硬件实现,或者以在一个或者多个处理器上运行的软件模块实现,或者以它们的组合实现。本领域的技术人员应当理解,可以在实践中使用微处理器或者数字信号处理器(DSP)来实现根据本发明实施例的装置中的一些或者全部部件的一些或者全部功能。本发明还可以实现为用于执行这里所描述的方法的一部分或者全部的设备或者装置程序(例如,计算机程序和计算机程序产品)。这样的实现本发明的程序可以存储在计算机可读介质上,或者可以具有一个或者多个信号的形式。这样的信号可以从因特网网站上下载得到,或者在载体信号上提供,或者以任何其他形式提供。
[0104]本领域技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。不可否认地,以上变换方式均在本申请保护范围之内。
【权利要求】
1.一种编译方法,其特征在于,该方法包括: 解析第一源代码对应的字节码; 根据解析结果生成抽象语法树; 遍历所述抽象语法树,将所述第一源代码对应的字节码转换为第二源代码对应的字节码。
2.如权利要求1所述的方法,其特征在于:转换为第二源代码对应的字节码后,该方法还包括: 编译所述第二源代码对应的字节码为所述第二源代码对应的应用程序。
3.如权利要求1所述的方法,其特征在于:所述解析所述第一源代码对应的字节码前,该方法还包括:基于所述第一源代码生成所述第一源代码对应的字节码。
4.一种解释方法,其特征在于,该方法包括: 解析某一源代码对应的字节码; 根据解析结果生成抽象语法树; 基于所述抽象语法树,执行所述字节码。
5.如权利要求4所述的方法,其特征在于:所述解析所述字节码前,该方法还包括:基于所述源代码生成字节码。
6.一种编译器,其特征在于,该编译器包括: 解析单元,用于解析第一源代码对应的字节码; 语法树生成单元,用于根据解析结果生成抽象语法树; 代码转换单元,用于遍历所述抽象语法树,将所述第一源代码对应的字节码转换为第二源代码对应的字节码。
7.如权利要求6所述的编译器,其特征在于:所述编译器还包括: 字节码生成单元,用于基于所述第一源代码生成所述第一源代码对应的字节码;程序编译单元,用于编译所述第二源代码对应的字节码为所述第二源代码对应的应用程序。
8.—种解释器,其特征在于,该解释器包括: 字节码解析单元,用于解析某一源代码对应的字节码; 语法树生成单元,用于根据解析结果生成抽象语法树; 代码执行单元,用于基于所述抽象语法树,执行所述字节码。
9.如权利要求8所述的解释器,其特征在于:所述解释器还包括字节码生成单元,用于基于所述源代码生成所述字节码。
10.一种用户设备,其特征在于:所述用户设备包括如权利要求6或7所述的编译器或如权利要求8或9所述的解释器。
【文档编号】G06F9/45GK104182267SQ201310191139
【公开日】2014年12月3日 申请日期:2013年5月21日 优先权日:2013年5月21日
【发明者】贾嘉 申请人:中兴通讯股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1