CN111880806A - 应用执行方法与应用执行系统 - Google Patents
应用执行方法与应用执行系统 Download PDFInfo
- Publication number
- CN111880806A CN111880806A CN202010715987.0A CN202010715987A CN111880806A CN 111880806 A CN111880806 A CN 111880806A CN 202010715987 A CN202010715987 A CN 202010715987A CN 111880806 A CN111880806 A CN 111880806A
- Authority
- CN
- China
- Prior art keywords
- bytecode
- stack
- global
- virtual machine
- variable
- 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.)
- Granted
Links
- 238000000034 method Methods 0.000 title claims abstract description 320
- 230000001343 mnemonic effect Effects 0.000 claims description 111
- 230000002159 abnormal effect Effects 0.000 claims description 30
- 230000006870 function Effects 0.000 claims description 26
- 238000004590 computer program Methods 0.000 claims description 7
- 230000008569 process Effects 0.000 abstract description 25
- 238000010586 diagram Methods 0.000 description 14
- 239000000872 buffer Substances 0.000 description 11
- 101100322249 Caenorhabditis elegans lev-1 gene Proteins 0.000 description 4
- HCHKCACWOHOZIP-UHFFFAOYSA-N Zinc Chemical compound [Zn] HCHKCACWOHOZIP-UHFFFAOYSA-N 0.000 description 4
- 102000057710 Coatomer Human genes 0.000 description 3
- 101710199837 Terminal uridylyltransferase 1 Proteins 0.000 description 3
- 101000642183 Trypanosoma brucei brucei Terminal uridylyltransferase 2 Proteins 0.000 description 3
- 101150012243 ret3 gene Proteins 0.000 description 3
- 238000005538 encapsulation Methods 0.000 description 2
- 230000004807 localization Effects 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000003068 static effect Effects 0.000 description 2
- 101710179734 6,7-dimethyl-8-ribityllumazine synthase 2 Proteins 0.000 description 1
- 102100036508 Elongin BC and Polycomb repressive complex 2-associated protein Human genes 0.000 description 1
- 101000852151 Homo sapiens Elongin BC and Polycomb repressive complex 2-associated protein Proteins 0.000 description 1
- 101710186609 Lipoyl synthase 2 Proteins 0.000 description 1
- 101710122908 Lipoyl synthase 2, chloroplastic Proteins 0.000 description 1
- 101710101072 Lipoyl synthase 2, mitochondrial Proteins 0.000 description 1
- 101100396933 Pseudomonas aeruginosa (strain ATCC 15692 / DSM 22644 / CIP 104116 / JCM 14847 / LMG 12228 / 1C / PRS 101 / PAO1) imm2 gene Proteins 0.000 description 1
- 101100396930 Pseudomonas aeruginosa imm1 gene Proteins 0.000 description 1
- 101100078188 Saccharomyces cerevisiae (strain ATCC 204508 / S288c) MST27 gene Proteins 0.000 description 1
- 238000003491 array Methods 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 238000004891 communication Methods 0.000 description 1
- 230000006872 improvement Effects 0.000 description 1
- 239000004973 liquid crystal related substance Substances 0.000 description 1
- 238000012545 processing Methods 0.000 description 1
- 238000013519 translation Methods 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45504—Abstract machines for programme code execution, e.g. Java virtual machine [JVM], interpreters, emulators
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明实施例公开了一种应用执行方法与应用执行系统,涉及计算机技术领域。其中,执行方法包括:将使用C语言编写的应用程序的源代码编译为指令字节码;将指令字节码发送给虚拟机,以供虚拟机参考预先设置的基于C语言的指令字节码集合解释并执行指令字节码。根据本发明实施例,解决了方法调用过多时,控制指令字节码执行的堆栈的操作数栈的栈顶指针和帧栈的栈顶指针重叠的问题,简化了指令字节码的解释、执行过程,提高了指令字节码的执行效率和虚拟机的运行效率。
Description
技术领域
本发明涉及计算机技术领域,具体涉及一种应用执行方法与应用执行系统。
背景技术
Java卡是一种可以运行应用程序的接触式微处理器智能卡,它的基本思想就是在智能卡的ROM中保持一个Java卡虚拟机,在这个Java卡虚拟机上运行Java应用程序。Java应用程序经过编译生成class文件,Java卡虚拟机负责解释执行class文件。class文件中的每个方法都有代码段,这些代码段包含了一系列的指令字节码,格式如下:
opcode(1byte)operand1(optional)operand2(optional)……
指令字节码是由一个一字节的操作码opcode和零个或若干个操作数operand组成的,operand包含了要被操作的数据。在当前执行方法的栈帧里,一条指令字节码可以将值在操作数栈中入栈或出栈,可以在本地变量数组中加载或者存储值。指令字节码的执行效率很大程度上影响整个系统的执行效率。在本领域技术人员中存在技术偏见:运行在Java卡虚拟机的应用程序必须是使用Java语言编写的应用程序。然而,Java语言是面向对象编程的,有继承、封装、接口等对象的概念,Java语言对应的指令字节码的解释、执行过程比较复杂,这降低了指令字节码的执行效率。在Java卡虚拟机中堆栈控制Java语言对应的指令字节码执行。当调用方法时压两个栈,一个是操作数栈,一个是帧栈。如果方法调用过多,操作数栈的栈顶指针SP和帧栈的栈顶指针TOP就会重叠,Java卡虚拟机需要花费额外的时间来处理堆栈混乱,这进一步降低了指令字节码的执行效率。
发明内容
为了克服相关技术中存在的问题,本发明实施例提供了一种应用执行方法与应用执行系统,克服了运行在Java卡虚拟机的应用程序必须是使用Java语言编写的应用程序的技术偏见,解决了方法调用过多时,控制指令字节码执行的堆栈的操作数栈的栈顶指针SP和帧栈的栈顶指针TOP重叠的问题,简化了指令字节码的解释、执行过程,提高了指令字节码的执行效率和虚拟机的运行效率。
根据本发明实施例的第一方面,提供一种应用执行方法,包括:
将使用C语言编写的应用程序的源代码编译为指令字节码;
将所述指令字节码发送给虚拟机,以供所述虚拟机参考预先设置的基于C语言的指令字节码集合解释并执行所述指令字节码。
可选地,所述指令字节码集合包括:
不带返回值的方法返回字节码,所述方法返回字节码包括:助记符和字节数参数,
其中,所述字节数参数表示所述方法中的局部变量占用堆栈的内存大小,当所述虚拟机解释并执行完所述方法返回字节码之后,所述局部变量出栈。
可选地,所述指令字节码集合包括:
不带返回值的方法返回字节码,所述方法返回字节码包括:助记符,
其中,所述助记符中包括表示所述方法中的局部变量占用堆栈的内存大小的标记,当所述虚拟机解释并执行完所述方法返回字节码之后,所述局部变量出栈。
可选地,所述指令字节码集合包括:
带返回值的方法返回字节码,所述方法返回字节码包括:助记符和字节数参数,
其中,所述字节数参数表示所述方法中的局部变量占用堆栈的内存大小,当所述虚拟机解释并执行完所述方法返回字节码之后,所述返回值和所述局部变量出栈。
可选地,所述指令字节码集合包括:
带返回值的方法返回字节码,所述方法返回字节码包括:助记符,
其中,所述助记符中包括表示所述方法中的局部变量占用堆栈的内存大小的标记,当所述虚拟机解释并执行完所述方法返回字节码之后,所述返回值和所述局部变量出栈。
可选地,所述指令字节码集合包括:
方法调用字节码,所述方法调用字节码包括:助记符、字节数参数和全局跳转偏移量,
其中,所述字节数参数表示所述方法中的局部变量占用内存的大小,所述全局跳转偏移量表示所述方法在内存中的地址偏移量。
可选地,所述指令字节码集合包括:
方法调用字节码,所述方法调用字节码包括:助记符、字节数参数和地址参数,
其中,所述字节数参数表示所述方法中的局部变量占用内存的大小,所述地址参数表示所述方法在内存中的地址。
可选地,所述指令字节码集合包括:
变量赋值字节码,所述变量赋值字节码包括:助记符、源操作数和目的操作数的类型参数、目的操作数索引和源操作数索引。
可选地,所述指令字节码集合包括:
变量赋值字节码,所述变量赋值字节码包括:助记符、源操作数和目的操作数的类型参数以及源操作数索引,
其中,所述助记符中包括表示目的操作数索引的标记。
可选地,所述指令字节码集合包括:
全局变量运算字节码,所述全局变量运算字节码包括:助记符和常数参数,
其中,所述虚拟机解释、执行所述全局变量运算字节码,使得全局变量自加所述常数参数,所述全局变量包括以下变量中的一个:char型全局变量、short型全局变量和int型全局变量。
可选地,所述指令字节码集合包括:
全局变量装载字节码,所述全局变量装载字节码包括:助记符和全局地址偏移量,
其中,所述虚拟机解释并执行所述全局变量装载字节码,以将所述全局地址偏移量处存储的数据装载到全局变量,所述全局变量包括以下变量中的一个:char型全局变量、short型全局变量和int型全局变量。
可选地,所述指令字节码集合包括:
全局变量存储字节码,所述全局变量存储字节码包括:助记符和全局地址偏移量,
其中,所述虚拟机解释并执行所述全局变量存储字节码,以将全局变量存储到所述全局地址偏移量所表示的内存中,所述全局变量包括以下变量中的一个:char型全局变量、short型全局变量和int型全局变量。
可选地,所述指令字节码集合包括:
全局变量装载字节码,所述全局变量装载字节码包括:助记符,
其中,所述助记符中包括表示全局变量待装载的数据的全局地址偏移量的标记,所述虚拟机解释并执行所述全局变量装载字节码,将所述全局地址偏移量处存储的数据装载到所述全局变量,所述全局变量包括以下变量中的一个:char型全局变量、short型全局变量和int型全局变量。
可选地,所述指令字节码集合包括:
全局变量存储字节码,所述全局变量存储字节码包括:助记符,
其中,所述助记符中包括表示待存储全局变量的内存的全局地址偏移量的标记,所述虚拟机解释并执行所述全局变量存储字节码,以将所述全局变量存储到所述全局地址偏移量所表示的内存中,所述全局变量包括以下变量中的一个:char型全局变量、short型全局变量和int型全局变量。
可选地,所述指令字节码集合包括:
指针变量入栈字节码,所述指针变量入栈字节码包括:助记符,
其中,所述虚拟机解释并执行所述指针变量入栈字节码,以将指针变量读取到堆栈中,所述指针变量包括以下变量中的一个:char型指针变量、short型指针变量和int型指针变量。
可选地,所述指令字节码集合包括:
指针变量赋值字节码,所述指针变量赋值字节码包括:助记符,
其中,所述虚拟机解释并执行所述指针变量赋值字节码,以对指针变量赋值,所述指针变量包括以下变量中的一个:char型指针变量、short型指针变量和int型指针变量。
可选地,所述指令字节码集合包括:
比较跳转字节码,所述比较跳转字节码包括:助记符、待比较参数和全局地址偏移量,
其中,所述虚拟机解释、执行所述比较跳转字节码,如果所述待比较参数指定的两个比较数据的比较结果为“相等”,则将布尔值“1”或“0”压入堆栈,否则,将布尔值“0”或“1”压入堆栈并跳转至所述全局地址偏移量所指定的内存;或者
所述虚拟机解释、执行所述比较跳转字节码,如果所述待比较参数指定的两个比较数据的比较结果为“相等”,则将布尔值“1”或“0”压入堆栈并跳转至所述全局地址偏移量所指定的内存,否则,将布尔值“0”或“1”压入堆栈。
可选地,所述指令字节码集合包括:
比较跳转字节码,所述比较跳转字节码包括:助记符、待比较参数和全局地址偏移量,
其中,所述虚拟机解释、执行所述比较跳转字节码,如果所述待比较参数指定的两个比较数据的比较结果为“不相等”,则将布尔值“1”或“0”压入堆栈,否则,将布尔值“0”或“1”压入堆栈并跳转至所述全局地址偏移量所指定的内存;或者
所述虚拟机解释、执行所述比较跳转字节码,如果所述待比较参数指定的两个比较数据的比较结果为“不相等”,则将布尔值“1”或“0”压入堆栈并跳转至所述全局地址偏移量所指定的内存,否则,将布尔值“0”或“1”压入堆栈。
可选地,所述指令字节码集合包括:
比较跳转字节码,所述比较跳转字节码包括:助记符、待比较参数和全局地址偏移量,
其中,所述虚拟机解释、执行所述比较跳转字节码,如果所述待比较参数指定的两个比较数据的比较结果为“小于”,则将布尔值“1”或“0”压入堆栈,否则,将布尔值“0”或“1”压入堆栈并跳转至所述全局地址偏移量所指定的内存;或者
所述虚拟机解释、执行所述比较跳转字节码,如果所述待比较参数指定的两个比较数据的比较结果为“小于”,则将布尔值“1”或“0”压入堆栈并跳转至所述全局地址偏移量所指定的内存,否则,将布尔值“0”或“1”压入堆栈。
可选地,所述指令字节码集合包括:
比较跳转字节码,所述比较跳转字节码包括:助记符、待比较参数和全局地址偏移量,
其中,所述虚拟机解释、执行所述比较跳转字节码,如果所述待比较参数指定的两个比较数据的比较结果为“大于”,则将布尔值“1”或“0”压入堆栈,否则,将布尔值“0”或“1”压入堆栈并跳转至所述全局地址偏移量所指定的内存;或者
所述虚拟机解释、执行所述比较跳转字节码,如果所述待比较参数指定的两个比较数据的比较结果为“大于”,则将布尔值“1”或“0”压入堆栈并跳转至所述全局地址偏移量所指定的内存,否则,将布尔值“0”或“1”压入堆栈。
可选地,所述指令字节码集合包括:
比较跳转字节码,所述比较跳转字节码包括:助记符、待比较参数和全局地址偏移量,
其中,所述虚拟机解释、执行所述比较跳转字节码,如果所述待比较参数指定的两个比较数据的比较结果为“小于等于”,则将布尔值“1”或“0”压入堆栈,否则,将布尔值“0”或“1”压入堆栈并跳转至所述全局地址偏移量所指定的内存;或者
所述虚拟机解释、执行所述比较跳转字节码,如果所述待比较参数指定的两个比较数据的比较结果为“小于等于”,则将布尔值“1”或“0”压入堆栈并跳转至所述全局地址偏移量所指定的内存,否则,将布尔值“0”或“1”压入堆栈。
可选地,所述指令字节码集合包括:
比较跳转字节码,所述比较跳转字节码包括:助记符、待比较参数和全局地址偏移量,
其中,所述虚拟机解释、执行所述比较跳转字节码,如果所述待比较参数指定的两个比较数据的比较结果为“大于等于”,则将布尔值“1”或“0”压入堆栈,否则,将布尔值“0”或“1”压入堆栈并跳转至所述全局地址偏移量所指定的内存;或者
所述虚拟机解释执行所述比较跳转字节码,如果所述待比较参数指定的两个比较数据的比较结果为“大于等于”,则将布尔值“1”或“0”压入堆栈并跳转至所述全局地址偏移量所指定的内存,否则,将布尔值“0”或“1”压入堆栈。
可选地,所述指令字节码集合包括:
特殊功能区引用字节码,所述特殊功能区引用字节码包括:助记符,
其中,所述虚拟机解释、执行所述特殊功能区引用字节码,以将特殊功能区的地址压入堆栈。
可选地,所述指令字节码集合包括:
异常表入栈字节码,所述异常表入栈字节码包括:助记符、待捕获的异常分支的个数参数和所述异常分支的入口的索引-偏移对,
其中,所述虚拟机解释、执行所述异常表入栈字节码,以将待捕获的所述异常分支压入堆栈,构建异常表。
可选地,所述指令字节码集合包括:
异常分支查找字节码,所述异常分支查找字节码包括:助记符,
其中,所述虚拟机解释、执行所述异常分支查找字节码,以根据捕获的异常值在异常表中查找得到异常分支的全局地址偏移量。
可选地,所述指令字节码集合包括:
异常表出栈字节码,所述异常表出栈字节码包括:助记符,
其中,所述虚拟机解释、执行所述异常表出栈字节码,将异常表出栈。
可选地,在所述虚拟机中,堆栈控制所述指令字节码执行,所述堆栈为单向堆栈结构。
可选地,在所述虚拟机初始化状态下,堆栈指针指向堆栈的栈底;
所述虚拟机在调用一个方法时会做压栈操作,压一个栈,所述堆栈中依次存储方法的局部变量、当前调用的方法的堆栈指针、上下文和程序计数器,所述堆栈指针向上移动;
当调用方法返回时,所述堆栈中存储的所述方法的局部变量、当前调用的方法的堆栈指针、上下文和程序计数器会一起出栈,所述堆栈指针向下移动。
根据本发明实施例的第二方面,提供一种应用执行系统,包括:
编译单元,被配置为执行将使用C语言编写的应用程序的源代码编译为指令字节码;
执行单元,被配置为执行将所述指令字节码发送给虚拟机,以供所述虚拟机参考预先设置的基于C语言的指令字节码集合解释并执行所述指令字节码。
根据本发明实施例的第三方面,提供一种应用执行控制装置,包括:
处理器;
用于存储所述处理器可执行指令的存储器;
其中,所述处理器被配置为执行上述任意一项所述的应用执行方法。
根据本发明实施例的第四方面,提供一种计算机可读存储介质,所述计算机可读存储介质存储有计算机指令,所述计算机指令被执行时实现如上任一项所述的应用执行方法。
根据本发明实施例的第五方面,提供一种计算机程序产品,包括计算机程序,所述计算机程序包括程序指令,当所述程序指令被移动终端执行时,使所述移动终端执行如上任一项所述的应用执行方法的步骤。
本发明的实施例具有以下优点或有益效果:
对于不带返回值的方法返回字节码和带返回值的方法返回字节码,当方法返回时堆栈弹出的大小在指令字节码中给出。对于方法调用字节码,一种是非native方法调用,通过全局地址偏移量找到方法地址,一种是native方法调用,通过地址参数(方法id)找到native方法。变量赋值字节码中包括源操作数和目的操作数的类型参数、目的操作数索引和源操作数索引,可以一次性完成变量的赋值。全局变量运算字节码、全局变量装载字节码和全局变量存储字节码中包括全局变量在内存中的全局地址偏移量,操作简单,节省了查找全局变量的对象和去除对象头的过程。指针变量入栈字节码和指针变量赋值字节码解决了C代码转换为指令字节码或者汇编中间代码时,指针变量内容装载和赋值无对应字节码的问题。比较跳转字节码比较完之后将比较结果压入堆栈,特殊功能区引用字节码的地址提前压入堆栈。异常表入栈字节码、异常分支查找字节码和异常表出栈字节码解决了C语言中无法使用精炼的语句进行异常捕获的问题,增加了C语言没有的关键字和语法,使得基于虚拟机的嵌入式系统应用开发更方便和灵活,代码结构更清晰。本发明实施例中的独创的指令字节码简化了指令字节码的解释、执行过程,提高了指令字节码的执行效率和虚拟机的运行效率。
附图说明
通过以下参照附图对本发明实施例的描述,本发明的上述以及其他目的、特征和优点将更为清楚,在附图中:
图1示出相关技术中堆栈的结构示意图。
图2示出本发明实施例的应用执行方法的结构示意图。
图3示出本发明实施例中堆栈的结构示意图。
图4示出本发明实施例中应用程序的源代码以及对应的指令字节码。
图5示出本发明实施例中应用程序的源代码以及对应的指令字节码。
图6示出本发明实施例中应用程序的源代码以及对应的指令字节码。
图7示出本发明实施例中应用程序的源代码以及对应的指令字节码。
图8示出本发明实施例中应用程序的源代码以及对应的指令字节码。
图9示出本发明实施例的应用执行系统的结构示意图。
图10示出本发明实施例的应用执行控制装置的结构图。
具体实施方式
以下基于实施例对本发明进行描述,但是本发明并不仅仅限于这些实施例。在下文对本发明的细节描述中,详尽描述了一些特定的细节部分。对本领域技术人员来说没有这些细节部分的描述也可以完全理解本发明。为了避免混淆本发明的实质,公知的方法、过程、流程没有详细叙述。另外附图不一定是按比例绘制的。
计算机高级程序领域有很多语言都是通过具体的字节码解释执行的,如Java语言和Python语言,每一种语言都有其独特的指令字节码集合,而字节码的执行效率很大程度上影响整个系统的执行效率,因此一套高效的指令字节码集合尤其重要。高级语言的很多特性对于嵌入式处理器应用场景是用不上的,Java卡平台就去掉了一些Java语言的功能,比如,动态类下载、安全管理器、多线程、Finalization、Clone等等。Java卡平台不支持一些数据类型,例如,char型数据、double型数据、float型数据、long型数据和超过一维的数组。
图1示出相关技术中堆栈的结构示意图。图1具体表示的是Java卡虚拟机在调用一个方法时,堆栈的运行结构图。如图1所示,堆栈110是Java卡虚拟机在初始化状态下堆栈的结构。堆栈120是Java卡虚拟机在调用一个方法时堆栈的结构。在Java卡虚拟机初始化状态下,指向栈顶的是TOP指针(TOP指针是帧栈Frame stack的栈顶指针),指向栈底的是SP指针(SP指针是操作数栈Operand stack的栈顶指针)。Java卡虚拟机在调用一个方法时会做压栈操作,压两个栈,一个是操作数栈,另一个是帧栈。操作数栈中存的是方法的局部变量,该局部变量包括:方法参数和方法变量。其中,方法参数例如为:Parameter1、Parameter2和Parameter3,每一个参数占用操作数栈的内存大小为2byte,方法变量例如为:Local1和Local2。帧栈中依次存的是当前调用方法的帧栈指针(FP)、上下文(CC)、程序计数器(PC)和局部变量大小(param_local)。帧栈指针用以区分不同方法的局部变量,指向当前方法的第一个局部变量。当前调用的帧栈指针(FP)、上下文(CC)、程序计数器(PC)和局部变量大小(param_local)占用帧栈的内存大小分别为2byte。操作数栈压栈时,SP指针会向上移动,帧栈压栈时,TOP指针会向下移动。当再次调用一个方法时,就会在当前的栈的基础上,SP指针继续向上移动,TOP指针继续向下移动,因此,当方法调用的足够多,SP指针和TOP指针就会打架,这个时候Java卡虚拟机如果不加以判断,就会出现堆栈混乱的情况,而Java卡虚拟机对SP指针和TOP指针进行判断会消耗额外的时间,造成性能下降。当调用方法返回时,操作数栈和帧栈会出栈,SP指针会向下移动,TOP指针会向上移动。显然,如果方法调用过多,操作数栈的栈顶指针SP和帧栈的栈顶指针TOP就会重叠,Java卡虚拟机需要花费额外的时间来处理堆栈混乱,这降低了指令字节码的执行效率。
Java语言是面向对象编程的,有继承、封装、接口等对象的概念,比较复杂。方法返回时,堆栈需要出栈,需要在帧栈中找出该方法的局部变量(方法参数和方法变量)大小,消耗了额外的时间。方法调用时,区分为虚方法调用、静态方法调用、接口方法调用、特殊方法调用等等,每种方法调用时,需要根据token、方法表、查找父类方法等找到方法在内存中的地址,查找缓慢、查找过程复杂。Java语言编写的应用程序是面向对象的,变量没有全局变量和局部变量之分,类似全局变量,有域变量和静态变量的概念,但是这两种变量都需要先查找对象,然后去除对象头,再对变量操作。使用Java语言编写的应用程序的源代码对应的指令字节码是针对堆栈的设计,对于变量的赋值,需要反复的做堆栈的入栈、出栈的操作。比如使用常数对一个局部变量赋值,需要先将该常数入栈,再将该局部变量地址入栈,再将该常数出栈,再对该局部变量赋值,再将该值入栈。基于Java语言的指令字节码集合中只有数组变量,无指针变量。有些比较的语句,需要存储中间比较结果,而基于Java语言的指令字节码集合中对此类情况的处理过程比较复杂。对于一些经常要引用的特殊功能缓冲区,需要先调用获得特殊功能缓冲区对象的方法,然后再将对象压栈。显然,Java语言对应的指令字节码的解释、执行过程比较复杂,这降低了指令字节码的执行效率。
容易理解的是,在Java卡虚拟机中运行的指令字节码是一种二进制数据流,而指令字节码是不区分编写语言的。所以本发明人想到,可以通过C语言来编写应用程序,将使用C语言编写的应用程序的源代码编译为对应的指令字节码,将该应用程序对应的指令字节码加载至虚拟机中解释并执行。
基于此,本发明实施例提供一种应用执行方法与应用执行系统。
图2示出本发明实施例的应用执行方法的结构示意图。具体包括以下步骤:
在步骤S210中,将使用C语言编写的应用程序的源代码编译为指令字节码。
在步骤S220中,将所述指令字节码发送给虚拟机,以供所述虚拟机参考预先设置的基于C语言的指令字节码集合解释并执行所述指令字节码。
在本发明实施例的应用执行方法中,预先设置的基于C语言的指令字节码集合是一种基于C语言的独创的字节码指令集合。这里的虚拟机是基于该独创的字节码指令集合的字节码解释器而重新构建的一种虚拟机。该预先设置的基于C语言的指令字节码集合如下所示:
·0号字节码:NOP
·1号字节码:DUP
·2号字节码:DUP2
·3号字节码:DUP_X
·4号字节码:LEV
·5号字节码:LEV0
·6号字节码:LEV1
·7号字节码:LEV2
·8号字节码:LEV3
·9号字节码:LEV4
·10号字节码:LEV5
·11号字节码:RET
·12号字节码:RET0
·13号字节码:RET1
·14号字节码:RET2
·15号字节码:RET3
·16号字节码:RET4
·17号字节码:RET5
·18号字节码:JMP_C
·19号字节码:BZ_C
·20号字节码:BNZ_C
·21号字节码:JMP_S
·22号字节码:BZ_S
·23号字节码:BNZ_S
·24号字节码:JSR
·25号字节码:CALL
·26号字节码:MOV
·27号字节码:MOV0
·28号字节码:MOV1
·29号字节码:MOV2
·30号字节码:MOV3
·31号字节码:MOV4
·32号字节码:MOV5
·33号字节码:TABLE_SWITCH
·34号字节码:LOOKUP_SWITCH
·35号字节码:L_CINC
·36号字节码:L_SINC
·37号字节码:L_IINC
·38号字节码:G_CINC
·39号字节码:G_SINC
·40号字节码:G_IINC
·41号字节码:LCA
·42号字节码:LSA
·43号字节码:LIA
·44号字节码:SCA
·45号字节码:SSA
·46号字节码:SIA
·47号字节码:IMM_C
·48号字节码:IMM_S
·49号字节码:IMM_I
·50号字节码:IMM0
·51号字节码:IMM1
·52号字节码:IMM2
·53号字节码:IMM3
·54号字节码:IMM4
·55号字节码:IMM5
·56号字节码:STACK_LC
·57号字节码:STACK_LS
·58号字节码:STACK_LI
·59号字节码:STACK_SC
·60号字节码:STACK_SS
·61号字节码:STACK_SI
·62号字节码:PUSH_LA
·63号字节码:PUSH_LAPUSH_GA
·64号字节码:L_LC
·65号字节码:L_LS
·66号字节码:L_LI
·67号字节码:G_LC
·68号字节码:G_LS
·69号字节码:G_LI
·70号字节码:L_SC
·71号字节码:L_SS
·72号字节码:L_SI
·73号字节码:G_SC
·74号字节码:G_SS
·75号字节码:G_SI
·76号字节码:L_LC0
·77号字节码:L_LC1
·78号字节码:L_LC2
·79号字节码:L_LC3
·80号字节码:L_LC4
·81号字节码:L_LC5
·82号字节码:L_LS0
·83号字节码:L_LS1
·84号字节码:L_LS2
·85号字节码:L_LS3
·86号字节码:L_LS4
·87号字节码:L_LS5
·88号字节码:L_LI0
·89号字节码:L_LI1
·90号字节码:L_LI2
·91号字节码:L_LI3
·92号字节码:L_LI4
·93号字节码:L_LI5
·94号字节码:G_LC0
·95号字节码:G_LC1
·96号字节码:G_LC2
·97号字节码:G_LC3
·98号字节码:G_LC4
·99号字节码:G_LC5
·100号字节码:G_LS0
·101号字节码:G_LS1
·102号字节码:G_LS2
·103号字节码:G_LS3
·104号字节码:G_LS4
·105号字节码:G_LS5
·106号字节码:G_LI0
·107号字节码:G_LI1
·108号字节码:G_LI2
·109号字节码:G_LI3
·110号字节码:G_LI4
·111号字节码:G_LI5
·112号字节码:L_SC0
·113号字节码:L_SC1
·114号字节码:L_SC2
·115号字节码:L_SC3
·116号字节码:L_SC4
·117号字节码:L_SC5
·118号字节码:L_SS0
·119号字节码:L_SS1
·120号字节码:L_SS2
·121号字节码:L_SS3
·122号字节码:L_SS4
·123号字节码:L_SS5
·124号字节码:L_SI0
·125号字节码:L_SI1
·126号字节码:L_SI2
·127号字节码:L_SI3
·128号字节码:L_SI4
·129号字节码:L_SI5
·130号字节码:G_SC0
·131号字节码:G_SC1
·132号字节码:G_SC2
·133号字节码:G_SC3
·134号字节码:G_SC4
·135号字节码:G_SC5
·136号字节码:G_SS0
·137号字节码:G_SS1
·138号字节码:G_SS2
·139号字节码:G_SS3
·140号字节码:G_SS4
·141号字节码:G_SS5
·142号字节码:G_SI0
·143号字节码:G_SI1
·144号字节码:G_SI2
·145号字节码:G_SI3
·146号字节码:G_SI4
·147号字节码:G_SI5
·148号字节码:OR
·149号字节码:XOR
·150号字节码:AND
·151号字节码:NOT
·152号字节码:EQ
·153号字节码:NE
·154号字节码:LT
·155号字节码:GT
·156号字节码:LE
·157号字节码:GE
·158号字节码:EQ_BZ
·159号字节码:EQ_BNZ
·160号字节码:NE_BZ
·161号字节码:NE_BNZ
·162号字节码:LT_BZ
·163号字节码:LT_BNZ
·164号字节码:GT_BZ
·165号字节码:GT_BNZ
·166号字节码:LE_BZ
·167号字节码:LE_BNZ
·168号字节码:GE_BZ
·169号字节码:GE_BNZ
·170号字节码:SHL
·171号字节码:SHR
·172号字节码:ADD
·173号字节码:SUB
·174号字节码:MUL
·175号字节码:DIV
·176号字节码:MOD
·177号字节码:ASB
·178号字节码:EPSH
·179号字节码:ETBL
·180号字节码:EPOP
需要说明的是,以上所示的字节码指令集合仅仅作为本发明实施例的预先设置的基于C语言的指令字节码集合的一个示例,不应对本发明构成任何限制。
图3示出本发明实施例中堆栈的结构示意图,具体表示的是虚拟机在调用一个方法时,堆栈的运行结构图。在虚拟机中,堆栈控制指令字节码执行,堆栈为单向堆栈结构。堆栈310是虚拟机在初始化状态下堆栈的结构。堆栈320是虚拟机在调用一个方法时堆栈的结构。在虚拟机初始化状态下,指向栈底的是SP指针,SP指针是堆栈指针。虚拟机在调用一个方法时会做压栈操作,压一个栈。栈中依次存的是方法的局部变量、当前调用的方法的堆栈指针(SP)、上下文(CC)和程序计数器(PC),该局部变量包括:方法参数Parameter和方法变量Local。堆栈指针用以区分不同方法的局部变量,指向当前方法的第一个局部变量。虚拟机在调用一个方法时对方法的局部变量、当前调用的方法的堆栈指针(SP)、上下文(CC)和程序计数器(PC)一起做压栈操作,SP指针向上移动。当再次调用一个方法时,SP指针在当前的栈的基础上继续向上移动。当调用方法返回时,栈中存储的方法的局部变量、当前调用的方法的堆栈指针(SP)、上下文(CC)和程序计数器(PC)会一起出栈,SP指针向下移动。
本发明实施例中的堆栈结构使用一个栈,虚拟机在调用一个方法时对方法的局部变量、当前调用的方法的堆栈指针、上下文和程序计数器一起做压栈操作,栈顶指针向上移动;当调用方法返回时,栈中存储的方法的局部变量、当前调用的方法的堆栈指针、上下文和程序计数器会一起出栈,栈顶指针向下移动。解决了方法调用过多时,控制指令字节码执行的堆栈的操作数栈的栈顶指针SP和帧栈的栈顶指针TOP重叠的问题,节省了虚拟机花费额外的时间来处理堆栈混乱的时间,这提高了指令字节码的执行效率。
表1示出本发明实施例中涉及到的指令字节码。如表1所示,不带返回值的方法返回字节码:LEV X,包括:助记符LEV和字节数参数X。其中,字节数参数X表示方法中的局部变量(包括方法的方法参数和方法变量)占用堆栈的内存大小,当虚拟机解释并执行完方法返回字节码之后,局部变量出栈,堆栈弹出X个字节。
不带返回值的方法返回字节码:LEV0,包括:助记符LEV0。其中,助记符LEV0中包括表示方法中的局部变量(包括方法的方法参数和方法变量)占用堆栈的内存大小的标记0,当虚拟机解释并执行完该方法返回字节码之后,局部变量出栈,堆栈弹出0个字节。
不带返回值的方法返回字节码:LEV1,包括:助记符LEV1。其中,助记符LEV1中包括表示方法中的局部变量(包括方法的方法参数和方法变量)占用堆栈的内存大小的标记1,当虚拟机解释并执行完该方法返回字节码之后,局部变量出栈,堆栈弹出1个字节。
不带返回值的方法返回字节码:LEV2,包括:助记符LEV2。其中,助记符LEV2中包括表示方法中的局部变量(包括方法的方法参数和方法变量)占用堆栈的内存大小的标记2,当虚拟机解释并执行完该方法返回字节码之后,局部变量出栈,堆栈弹出2个字节。
不带返回值的方法返回字节:LEV3,包括:助记符LEV3。其中,助记符LEV3中包括表示方法中的局部变量(包括方法的方法参数和方法变量)占用堆栈的内存大小的标记3,当虚拟机解释并执行完该方法返回字节码之后,局部变量出栈,堆栈弹出3个字节。
不带返回值的方法返回字节码:LEV4,包括:助记符LEV4。其中,助记符LEV4中包括表示方法中的局部变量(包括方法的方法参数和方法变量)占用堆栈的内存大小的标记4,当虚拟机解释并执行完该方法返回字节码之后,局部变量出栈,堆栈弹出4个字节。
不带返回值的方法返回字节码:LEV5,包括:助记符LEV5。其中,助记符LEV5中包括表示方法中的局部变量(包括方法的方法参数和方法变量)占用堆栈的内存大小的标记5,当虚拟机解释并执行完该方法返回字节码之后,局部变量出栈,堆栈弹出5个字节。
带返回值的方法返回字节码:RET X,包括:助记符RET和字节数参数X。其中,字节数参数X表示方法中的局部变量(包括方法的方法参数和方法变量)占用堆栈的内存大小,当虚拟机解释并执行完方法返回字节码之后,返回值和局部变量出栈,返回值占1个字,因此该操作执行后,堆栈弹出1个字+(X+1)个字节。
带返回值的方法返回字节码:RET0,包括:助记符RET0。其中,助记符RET0中包括表示方法中的局部变量(包括方法的方法参数和方法变量)占用堆栈的内存大小的标记0,当虚拟机解释并执行完方法返回字节码之后,返回值和局部变量出栈,返回值占1个字,因此该操作执行后,堆栈弹出1个字+1个字节。
带返回值的方法返回字节码:RET1,包括:助记符RET1。其中,助记符RET1中包括表示方法中的局部变量(包括方法的方法参数和方法变量)占用堆栈的内存大小的标记1,当虚拟机解释并执行完方法返回字节码之后,返回值和局部变量出栈,返回值占1个字,因此该操作执行后,堆栈弹出1个字+2个字节。
带返回值的方法返回字节码:RET2,包括:助记符RET2。其中,助记符RET2中包括表示方法中的局部变量(包括方法的方法参数和方法变量)占用堆栈的内存大小的标记2,当虚拟机解释并执行完方法返回字节码之后,返回值和局部变量出栈,返回值占1个字,因此该操作执行后,堆栈弹出1个字+3个字节。
带返回值的方法返回字节码:RET3,包括:助记符RET3。其中,助记符RET3中包括表示方法中的局部变量(包括方法的方法参数和方法变量)占用堆栈的内存大小的标记3,当虚拟机解释并执行完方法返回字节码之后,返回值和局部变量出栈,返回值占1个字,因此该操作执行后,堆栈弹出1个字+4个字节。
带返回值的方法返回字节码:RET4,包括:助记符RET4。其中,助记符RET4中包括表示方法中的局部变量(包括方法的方法参数和方法变量)占用堆栈的内存大小的标记4,当虚拟机解释并执行完方法返回字节码之后,返回值和局部变量出栈,返回值占1个字,因此该操作执行后,堆栈弹出1个字+5个字节。
带返回值的方法返回字节码:RET5,包括:助记符RET5。其中,助记符RET5中包括表示方法中的局部变量(包括方法的方法参数和方法变量)占用堆栈的内存大小的标记5,当虚拟机解释并执行完方法返回字节码之后,返回值和局部变量出栈,返回值占1个字,因此该操作执行后,堆栈弹出1个字+6个字节。
方法调用字节码:JSR localsize offset,包括:助记符JSR、字节数参数localsize和全局跳转偏移量offset。其中,字节数参数localsize表示方法中的局部变量(包括方法的方法参数和方法变量)占用内存的大小,全局跳转偏移量localsize表示方法在内存中的地址偏移量。方法调用字节码:JSR localsize offset表示非native函数调用,字节数参数localsize的长度为1字节,全局跳转偏移量offset的长度为2字节。
方法调用字节码:CALL localsize fun_id,包括:助记符CALL、字节数参数localsize和地址参数fun_id。其中,字节数参数localsize表示方法中的局部变量(包括方法的方法参数和方法变量)占用内存的大小,地址参数fun_id表示方法在内存中的地址。方法调用字节码:CALL localsize fun_id表示native函数调用。字节数参数localsize的长度为1字节。地址参数fun_id为native函数ID,其长度为2字节。
变量赋值字节码:MOV type dst src,包括:助记符MOV、源操作数和目的操作数的类型参数type、目的操作数索引dst和源操作数索引src。变量赋值字节码:MOV type dstsrc表示将常量或者变量赋值给常量,源操作数和目的操作数的类型参数type的长度为1字节,目的操作数索引dst的长度为1字节或2字节,源操作数索引src的长度为1字节或2字节。
变量赋值字节码:MOV0 type src,包括:助记符MOV0、源操作数和目的操作数的类型参数type以及源操作数索引src。其中,助记符MOV0中包括表示目的操作数索引的标记0。该变量赋值字节码表示将常量或者变量赋值给常量,源操作数和目的操作数的类型参数type的长度为1字节,源操作数索引src的长度为1字节或2字节,目的操作数索引为0。
变量赋值字节码:MOV1 type src,包括:助记符MOV1、源操作数和目的操作数的类型参数type以及源操作数索引src。其中,助记符MOV1中包括表示目的操作数索引的标记1。该变量赋值字节码表示将常量或者变量赋值给常量,源操作数和目的操作数的类型参数type的长度为1字节,源操作数索引src的长度为1字节或2字节,目的操作数索引为1。
变量赋值字节码:MOV2 type src,包括:助记符MOV2、源操作数和目的操作数的类型参数type以及源操作数索引src。其中,助记符MOV2中包括表示目的操作数索引的标记2。该变量赋值字节码表示将常量或者变量赋值给常量,源操作数和目的操作数的类型参数type的长度为1字节,源操作数索引src的长度为1字节或2字节,目的操作数索引为2。
变量赋值字节码:MOV3 type src,包括:助记符MOV3、源操作数和目的操作数的类型参数type以及源操作数索引src。其中,助记符MOV3中包括表示目的操作数索引的标记3。该变量赋值字节码表示将常量或者变量赋值给常量,源操作数和目的操作数的类型参数type的长度为1字节,源操作数索引src的长度为1字节或2字节,目的操作数索引为3。
变量赋值字节码:MOV4 type src,包括:助记符MOV4、源操作数和目的操作数的类型参数type以及源操作数索引src。其中,助记符MOV4中包括表示目的操作数索引的标记4。该变量赋值字节码表示将常量或者变量赋值给常量,源操作数和目的操作数的类型参数type的长度为1字节,源操作数索引src的长度为1字节或2字节,目的操作数索引为4。
变量赋值字节码:MOV5 type src,包括:助记符MOV5、源操作数和目的操作数的类型参数type以及源操作数索引src。其中,助记符MOV5中包括表示目的操作数索引的标记5。该变量赋值字节码表示将常量或者变量赋值给常量,源操作数和目的操作数的类型参数type的长度为1字节,源操作数索引src的长度为1字节或2字节,目的操作数索引为5。
表1
图4示出本发明实施例中应用程序的源代码以及对应的指令字节码。在基于虚拟机的嵌入式系统中,使用C语言编写的应用程序的源代码在经过编译后,都会在嵌入式系统的内存中线性分布,从内存中地址偏移0开始,一直向上增加。如图4所示,源代码410是使用C语言编写的应用程序的部分源代码,指令字节码420和指令字节码430是源代码410中部分源代码经过编译后得到的指令字节码。图4示出表1中的部分指令字节码。如图4举例有两个方法,一个是method1(),其在内存中的全局地址偏移量是‘0xaa’,一个是method2(),其在内存中的全局地址偏移量是‘0xcc’,当method1()中调用method2()时,其对应的指令字节码(JSR03cc)中第二个字段‘cc’表示method2()在内存中的全局地址偏移量为十六进制的‘0xcc’,其第一个字段‘03’表示method2()的局部变量(包括方法参数和方法变量)占用的内存大小,共3个字节,‘JSR’是助记符。method1()中最后一行源代码‘return’对应的指令字节码(LEV0)表示方法返回,‘LEV0’是助记符,助记符中的‘0’表示没有局部变量要出栈。method2()中有一行赋值语句,将常数01赋值给short型变量b,该赋值语句对应的指令字节码为:MOV0 07 01,‘MOV0’是助记符,助记符中的‘0’表示目的操作数索引是0,目的操作数是局部变量b,因为局部变量是在堆栈中存储,堆栈是后进先出,所以b的索引是‘0’,‘MOV0’后面紧跟的‘07’表示赋值类型,表示常数给short型变量赋值,再后面的‘01’表示赋值的大小。解释器碰到该指令字节码,先根据‘07’知道是常数对short型局部变量赋值,根据索引‘0’,找出堆栈中局部变量b的地址,对这个地址的内容直接用‘01’赋值,这样整个赋值过程,没有繁琐的入栈出栈操作,一次性就完成了对变量的赋值。method2()中最后一行源代码‘return’对应的指令字节码(LEV3)表示方法返回,‘LEV3’是助记符,助记符中的‘3’表示一共有3个字节局部变量要出栈。
在本发明实施例中,对于不带返回值的方法返回字节码和带返回值的方法返回字节码,当方法返回时堆栈弹出的大小在指令字节码中给出。对于方法调用字节码,一种是非native方法调用,通过全局地址偏移量找到方法地址,一种是native方法调用,通过地址参数(方法id)找到native方法。对于单纯的一般变量的赋值语句,发明了变量赋值字节码,变量赋值字节码中包括源操作数和目的操作数的类型参数、目的操作数索引和源操作数索引,可以一次性完成变量的赋值。本发明实施例中的独创的指令字节码简化了指令字节码的解释、执行过程,提高了指令字节码的执行效率和虚拟机的运行效率。
表2示出本发明实施例中涉及到的指令字节码。如表2所示,全局变量运算字节码:G_CINC X,全局变量运算字节码包括:助记符G_CINC和常数参数X,其中,虚拟机解释、执行全局变量运算字节码,使得char型全局变量自加常数参数X。
全局变量运算字节码:G_SINC X,全局变量运算字节码包括:助记符G_SINC和常数参数X,其中,虚拟机解释、执行全局变量运算字节码,使得short型全局变量自加常数参数X。
全局变量运算字节码:G_IINC X,全局变量运算字节码包括:助记符G_IINC和常数参数X,其中,虚拟机解释、执行全局变量运算字节码,使得int型全局变量自加常数参数X。
全局变量装载字节码:G_LC offset,全局变量装载字节码包括:助记符G_LC和全局地址偏移量offset,其中,虚拟机解释并执行全局变量装载字节码,以将全局地址偏移量处存储的数据装载到char型全局变量。
全局变量装载字节码:G_LS offset,全局变量装载字节码包括:助记符G_LS和全局地址偏移量offset,其中,虚拟机解释并执行全局变量装载字节码,以将全局地址偏移量处存储的数据装载到short型全局变量。
全局变量装载字节码:G_LI offset,全局变量装载字节码包括:助记符G_LI和全局地址偏移量offset,其中,虚拟机解释并执行全局变量装载字节码,以将全局地址偏移量处存储的数据装载到int型全局变量。
全局变量存储字节码:G_SC offset,全局变量存储字节码包括:助记符G_SC和全局地址偏移量offset,其中,虚拟机解释并执行全局变量存储字节码,以将char型全局变量存储到全局地址偏移量所表示的内存中。
全局变量存储字节码:G_SS offset,全局变量存储字节码包括:助记符G_SS和全局地址偏移量offset,其中,虚拟机解释并执行全局变量存储字节码,以将short型全局变量存储到全局地址偏移量所表示的内存中。
全局变量存储字节码:G_SI offset,全局变量存储字节码包括:助记符G_SI和全局地址偏移量offset,其中,虚拟机解释并执行全局变量存储字节码,以将int型全局变量存储到全局地址偏移量所表示的内存中。
全局变量装载字节码G_LC0或G_LC1或G_LC2或G_LC3或G_LC4或G_LC5,所述全局变量装载字节码包括:助记符G_LC0或G_LC1或G_LC2或G_LC3或G_LC4或G_LC5,其中,助记符中包括表示全局变量待装载的数据的全局地址偏移量的标记0或1或2或3或4或5,虚拟机解释并执行全局变量装载字节码,将全局地址偏移量0或1或2或3或4或5处存储的数据装载到char型全局变量。
全局变量装载字节码G_LS0或G_LS1或G_LS2或G_LS3或G_LS4或G_LS5,全局变量装载字节码包括:助记符G_LS0或G_LS1或G_LS2或G_LS3或G_LS4或G_LS5,其中,助记符中包括表示全局变量待装载的数据的全局地址偏移量的标记0或1或2或3或4或5,虚拟机解释并执行全局变量装载字节码,将全局地址偏移量0或1或2或3或4或5处存储的数据装载到short型全局变量。
全局变量装载字节码G_LI0或G_LI1或G_LI2或G_LI3或G_LI4或G_LI5,全局变量装载字节码包括:助记符G_LI0或G_LI1或G_LI2或G_LI3或G_LI4或G_LI5,其中,助记符中包括表示全局变量待装载的数据的全局地址偏移量的标记0或1或2或3或4或5,虚拟机解释并执行全局变量装载字节码,将全局地址偏移量0或1或2或3或4或5处存储的数据装载到int型全局变量。
全局变量存储字节码G_SC0或G_SC1或G_SC2或G_SC3或G_SC4或G_SC5,全局变量存储字节码包括:助记符G_SC0或G_SC1或G_SC2或G_SC3或G_SC4或G_SC5,其中,助记符中包括表示待存储全局变量的内存的全局地址偏移量的标记0或1或2或3或4或5,虚拟机解释并执行全局变量存储字节码,以将char型全局变量存储到全局地址偏移量0或1或2或3或4或5所表示的内存中。
全局变量存储字节码G_SS0或G_SS1或G_SS2或G_SS3或G_SS4或G_SS5,全局变量存储字节码包括:助记符G_SS0或G_SS1或G_SS2或G_SS3或G_SS4或G_SS5,其中,助记符中包括表示待存储全局变量的内存的全局地址偏移量的标记0或1或2或3或4或5,虚拟机解释并执行全局变量存储字节码,以将short型全局变量存储到全局地址偏移量0或1或2或3或4或5所表示的内存中。
全局变量存储字节码G_SI0或G_SI1或G_SI2或G_SI3或G_SI4或G_SI5,全局变量存储字节码包括:助记符码G_SI0或G_SI1或G_SI2或G_SI3或G_SI4或G_SI5,其中,助记符中包括表示待存储全局变量的内存的全局地址偏移量的标记0或1或2或3或4或5,虚拟机解释并执行全局变量存储字节码,以将int型全局变量存储到全局地址偏移量0或1或2或3或4或5所表示的内存中。
表2
图5示出本发明实施例中应用程序的源代码以及对应的指令字节码,表示对全局变量的运算、装载、存储等操作过程,包括数组变量的赋值和引用过程,示出表2中的部分指令字节码。如图5所示,源代码510是使用C语言编写的应用程序的部分源代码,指令字节码520是源代码510中部分源代码经过编译后得到的指令字节码。g_var[2]是一个全局数组变量,其在内存中的全局地址偏移量是‘xxyy’。源程序510中使用‘g_var[1]=4’语句赋值,则该赋值语句编译后,在虚拟机中先使用指令字节码‘PUSH_GA’将g_var[2]的全局地址偏移量‘xxyy’入栈,然后再对g_var[2]的内容做赋值。局部数组变量l_var在堆栈中的全局地址偏移量是‘00’,源程序510中使用‘l_var[0]=3’赋值,则该赋值语句编译后,在虚拟机中先使用指令字节码‘PUSH_LA’将l_var的全局地址偏移量‘00’入栈,然后再对l_var的内容做赋值。
本发明实施例中,全局变量运算字节码、全局变量装载字节码和全局变量存储字节码中包括全局变量在内存中的全局地址偏移量,操作简单,节省了查找全局变量的对象和去除对象头的过程,简化了指令字节码的解释、执行过程,提高了指令字节码的执行效率和虚拟机的执行效率。
表3示出本发明实施例中涉及到的指令字节码。如表3所示,指针变量入栈字节码STACK_LC,包括:助记符STACK_LC,其中,虚拟机解释并执行指针变量入栈字节码,以将char型指针变量读取到堆栈中。
指针变量入栈字节码STACK_LS,包括:助记符STACK_LS,其中,虚拟机解释并执行指针变量入栈字节码,以将short型指针变量读取到堆栈中。
指针变量入栈字节码STACK_LI,包括:助记符STACK_LI,其中,虚拟机解释并执行指针变量入栈字节码,以将int型指针变量读取到堆栈中。
指针变量赋值字节码STACK_SC,包括:助记符STACK_SC,其中,虚拟机解释并执行指针变量赋值字节码,以对char指针变量赋值。
指针变量赋值字节码STACK_SS,包括:助记符STACK_SS,其中,虚拟机解释并执行指针变量赋值字节码,以对short型指针变量赋值。
指针变量赋值字节码STACK_SI,包括:助记符STACK_SI,其中,虚拟机解释并执行指针变量赋值字节码,以对int型指针变量赋值。
表3
图6示出本发明实施例中应用程序的源代码以及对应的指令字节码,表示对指针变量内容的存储和指针变量内容的装载过程,示出表3中的部分指令字节码。如图6所示,源代码610是使用C语言编写的应用程序的部分源代码,指令字节码620是源代码610中部分源代码经过编译后得到的指令字节码。‘dst’是char型指针变量,在源代码610中使用‘*dst=value’语句对指针‘dst’的内容存储,该语句编译后,在虚拟机中先使用指令字节码‘L_LS2’装载其索引,‘L_LS’表示装载一个short型局部变量的地址到堆栈中,‘2’表示该short型局部变量的地址的索引,然后使用指令字节码‘L_LC1’装载‘value’的值,最后用‘STACK_SC’赋值,‘STACK’后的‘S’表示‘store’存储的意思,‘C’表示char型指针变量。‘src’也是char型指针变量,使用‘value=*src’语句对其内容装载时,该语句经过编译后,在虚拟机中先使用指令字节码‘L_LS4’装载指针‘src’的索引,然后使用指令字节码‘STACK_LC’装载指针变量‘src’的内容,最后用指令字节码‘L_SC1’对‘value’赋值。
本发明实施例中,指针变量入栈字节码和指针变量赋值字节码解决了C代码转换为指令字节码或者汇编中间代码时,指针变量内容装载和赋值无对应字节码的问题,简化了指令字节码的解释、执行过程,提供指令字节码的执行效率和虚拟机的执行效率。
表4示出本发明实施例中涉及到的指令字节码。如表4所示,比较跳转字节码:EQ_BZ type offset,包括:助记符EQ_BZ、待比较参数type和全局地址偏移量offset,其中,虚拟机解释、执行比较跳转字节码,如果待比较参数指定的两个比较数据的比较结果为“相等”,则将布尔值“1”或“0”压入堆栈,否则,将布尔值“0”或“1”压入堆栈并跳转至全局地址偏移量所指定的内存。
比较跳转字节码:EQ_BNZ type offset,包括:助记符EQ_BNZ、待比较参数type和全局地址偏移量offset,虚拟机解释、执行比较跳转字节码,如果待比较参数指定的两个比较数据的比较结果为“相等”,则将布尔值“1”或“0”压入堆栈并跳转至全局地址偏移量所指定的内存,否则,将布尔值“0”或“1”压入堆栈。
比较跳转字节码:NE_BZ type offset,包括:助记符NE_BZ、待比较参数type和全局地址偏移量offset,其中,虚拟机解释、执行比较跳转字节码,如果待比较参数指定的两个比较数据的比较结果为“不相等”,则将布尔值“1”或“0”压入堆栈,否则,将布尔值“0”或“1”压入堆栈并跳转至全局地址偏移量所指定的内存。
比较跳转字节码:NE_BNZ type offset,包括:助记符NE_BNZ、待比较参数type和全局地址偏移量offset,其中,虚拟机解释、执行比较跳转字节码,如果待比较参数指定的两个比较数据的比较结果为“不相等”,则将布尔值“1”或“0”压入堆栈并跳转至全局地址偏移量所指定的内存,否则,将布尔值“0”或“1”压入堆栈。
比较跳转字节码LT_BZ type offset,包括:助记符LT_BZ、待比较参数type和全局地址偏移量offset,其中,虚拟机解释、执行比较跳转字节码,如果待比较参数指定的两个比较数据的比较结果为“小于”,则将布尔值“1”或“0”压入堆栈,否则,将布尔值“0”或“1”压入堆栈并跳转至全局地址偏移量所指定的内存。
比较跳转字节码LT_BNZ type offset,包括:助记符LT_BNZ、待比较参数type和全局地址偏移量offset,其中,虚拟机解释、执行比较跳转字节码,如果待比较参数指定的两个比较数据的比较结果为“小于”,则将布尔值“1”或“0”压入堆栈并跳转至全局地址偏移量所指定的内存,否则,将布尔值“0”或“1”压入堆栈。
比较跳转字节码GT_BZ type offset,包括:助记符GT_BZ、待比较参数type和全局地址偏移量offset,其中,虚拟机解释、执行比较跳转字节码,如果待比较参数指定的两个比较数据的比较结果为“大于”,则将布尔值“1”或“0”压入堆栈,否则,将布尔值“0”或“1”压入堆栈并跳转至全局地址偏移量所指定的内存。
比较跳转字节码GT_BNZ type offset,包括:助记符GT_BNZ、待比较参数type和全局地址偏移量offset,其中虚拟机解释、执行比较跳转字节码,如果待比较参数指定的两个比较数据的比较结果为“大于”,则将布尔值“1”或“0”压入堆栈并跳转至全局地址偏移量所指定的内存,否则,将布尔值“0”或“1”压入堆栈。
比较跳转字节码LE_BZ type offset,包括:助记符LE_BZ、待比较参数type和全局地址偏移量offset,其中,虚拟机解释、执行比较跳转字节码,如果待比较参数指定的两个比较数据的比较结果为“小于等于”,则将布尔值“1”或“0”压入堆栈,否则,将布尔值“0”或“1”压入堆栈并跳转至全局地址偏移量所指定的内存。
比较跳转字节码LE_BNZ type offset,包括:助记符LE_BNZ、待比较参数type和全局地址偏移量offset,其中,虚拟机解释、执行比较跳转字节码,如果待比较参数指定的两个比较数据的比较结果为“小于等于”,则将布尔值“1”或“0”压入堆栈并跳转至全局地址偏移量所指定的内存,否则,将布尔值“0”或“1”压入堆栈。
比较跳转字节码GE_BZ type offset,包括:助记符GE_BZ、待比较参数type和全局地址偏移量offset,其中,虚拟机解释、执行比较跳转字节码,如果待比较参数指定的两个比较数据的比较结果为“大于等于”,则将布尔值“1”或“0”压入堆栈,否则,将布尔值“0”或“1”压入堆栈并跳转至全局地址偏移量所指定的内存。
比较跳转字节码GE_BNZ type offset,包括:助记符GE_BNZ、待比较参数type和全局地址偏移量offset,其中,虚拟机解释执行比较跳转字节码,如果待比较参数指定的两个比较数据的比较结果为“大于等于”,则将布尔值“1”或“0”压入堆栈并跳转至全局地址偏移量所指定的内存,否则,将布尔值“0”或“1”压入堆栈。
特殊功能区引用字节码ASB,包括:助记符ASB,其中,虚拟机解释、执行特殊功能区引用字节码,以将特殊功能区的地址压入堆栈。
表4
图7示出本发明实施例中应用程序的源代码以及对应的指令字节码表示带结果的比较语句跳转过程,示出表4中的部分指令字节码。如图7所示,源代码710是使用C语言编写的应用程序的部分源代码,指令字节码720是源代码710中部分源代码经过编译后得到的指令字节码。S_Buffer是特殊功能缓冲区,有些嵌入式系统中会反复的调用这个缓冲区,其地址分配有一定特殊性,一般来说如果要使用,需要先调用一个方法,将S_Buffer的地址找到,然后再将这个地址压栈,而本发明先将S_Buffer的地址在虚拟机运行之前就找到,然后对于此类缓冲区使用一个单独的指令字节码ASB,解释器在遇到这个指令字节码时,就可以直接将事先已经找到的地址装载到堆栈,解决了一些嵌入式系统中寻找、引用特殊功能缓冲区操作复杂的问题,减少了调用方法寻找特殊功能缓冲区地址的过程。
源代码710中if语句,有两个条件判断,第一个判断条件是大于,使用指令字节码‘GT_BNZ’,第二个判断条件是不为0,两个判断条件是‘且’的关系,意思是需要同时满足,用指令字节码‘AND’表示,因为需要第一个判断条件的判断结果,所以用指令字节码‘GT_BNZ20 000f 00’比较,在比较完之后将比较的结果压栈。这样‘AND’指令就可以直接取堆栈中的结果进行‘与’操作。然而,在基于Java语言的Java卡虚拟机中,在比较跳转指令比较完之后,还需要做一次对结果的压栈操作,因此,本发明实施例中的比较跳转字节码能够节省条件判断语句执行时间。
在本发明实施例中,比较跳转字节码比较完之后将比较结果压入堆栈,特殊功能区引用字节码的地址提前压入堆栈,简化了指令字节码的解释、执行过程,提高了指令字节码的执行效率和虚拟机执行效率。
表5示出本发明实施例中涉及到的指令字节码。如表5所示,异常表入栈字节码EPSH num expID_1-expValue_1…expID_n-expValue_n,包括:助记符EPSH、待捕获的异常分支的个数参数num和异常分支的入口的索引-偏移对expID_1-expValue_1…expID_n-expValue_n,其中,虚拟机解释、执行异常表入栈字节码,以将待捕获的异常分支压入堆栈,构建异常表。
异常分支查找字节码ETBL,包括:助记符ETBL,其中,虚拟机解释、执行异常分支查找字节码,以根据捕获的异常值在异常表中查找得到异常分支的全局地址偏移量。
异常表出栈字节码EPOP,包括:助记符EPOP,其中,虚拟机解释、执行异常表出栈字节码,将异常表出栈。
表5
图8示出本发明实施例中应用程序的源代码以及对应的指令字节码,表示方法抛异常和异常的捕获过程,示出表5中的部分指令字节码。如图8所示,源代码810是使用C语言编写的应用程序的部分源代码,指令字节码820是源代码810中部分源代码经过编译后得到的指令字节码。‘TestException()’中有一个‘try catch’语句对,‘try{}’中的语句表示一些可能发生异常的语句,比如其中调用了方法‘throw_method()’,这个方法里面抛出了一种‘ApduException’异常,在‘catch()’语句中,如果‘catch()’中小括号中正好有这个异常,就可以捕获到,捕获之后,就可以执行‘catch(){}’的大括号中的语句,比如接着抛异常‘0x3000’。其中‘catch()’语句是可以并列的,可以捕获很多种异常。捕获一种异常,对应的指令字节码是EPOP,这些异常捕获之后的语句地址,会在一个表中构建,使用指令字节码:EPSH来将这些异常分支入口构建成一个异常表,指令字节码:EPSH后第一个字段是这些异常分支的个数,第二个字段是这些异常分支的入口的索引-偏移对,该索引-偏移对是16进制的。使用指令字节码:ETBL来查寻异常表,就可以知道捕获之后执行语句的入口。
C语言中本身是没有抛异常和捕获异常的语句的,需要使用‘宏’调用等比较复杂的方式来模拟异常的捕获,本发明实施例直接发明了异常表入栈字节码、异常分支查找字节码和异常表出栈字节码,可以让C语言使用类似Java语言的‘try catch’语句对,解决了C语言中无法使用精炼的语句进行异常捕获的问题,增加了C语言没有的关键字和语法,使得基于虚拟机的嵌入式系统应用开发更方便和灵活,代码结构更清晰。
图9示出本发明实施例的应用执行系统的结构示意图。本发明实施例中的执行系统包括:编译单元910和执行单元920。
编译单元910,被配置为执行将使用C语言编写的应用程序的源代码编译为指令字节码。
执行单元920,被配置为执行将指令字节码发送给虚拟机,以供虚拟机参考预先设置的基于C语言的指令字节码集合解释并执行指令字节码。
图10示出本发明实施例的应用执行控制装置的结构图。图10示出的设备仅仅是一个示例,不应对本发明实施例的功能和使用范围构成任何限制。
参考图10,该装置包括通过总线连接的处理器1010、存储器1020和输入输出设备1030。存储器1020包括只读存储器(ROM)和随机访问存储器(RAM),存储器1020内存储有执行系统功能所需的各种计算机指令和数据,处理器1010从存储器1020中读取各种计算机指令以执行各种适当的动作和处理。输入输出设备包括键盘、鼠标等的输入部分;包括诸如阴极射线管(CRT)、液晶显示器(LCD)等以及扬声器等的输出部分;包括硬盘等的存储部分;以及包括诸如LAN卡、调制解调器等的网络接口卡的通信部分。存储器1020还存储有计算机指令以完成本发明实施例的应用执行方法规定的操作。
相应地,本发明实施例提供一种计算机可读存储介质,该计算机可读存储介质存储有计算机指令,所述计算机指令被执行时实现上述应用执行方法所规定的操作。
相应地,本发明实施例还提供了一种计算机程序产品,包括计算机程序,所述计算机程序包括程序指令,当所述程序指令被移动终端执行时,使所述移动终端执行上述应用执行方法的步骤。
附图中的流程图、框图图示了本发明实施例的系统、方法、装置的可能的体系框架、功能和操作,流程图和框图上的方框可以代表一个模块、程序段或仅仅是一段代码,所述模块、程序段和代码都是用来实现规定逻辑功能的可执行指令。也应当注意,所述实现规定逻辑功能的可执行指令可以重新组合,从而生成新的模块和程序段。因此附图的方框以及方框顺序只是用来更好的图示实施例的过程和步骤,而不应以此作为对发明本身的限制。
以上所述仅为本发明的一些实施例,并不用于限制本发明,对于本领域技术人员而言,本发明可以有各种改动和变化。凡在本发明的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (32)
1.一种应用执行方法,其特征在于,包括:
将使用C语言编写的应用程序的源代码编译为指令字节码;
将所述指令字节码发送给虚拟机,以供所述虚拟机参考预先设置的基于C语言的指令字节码集合解释并执行所述指令字节码。
2.根据权利要求1所述的执行方法,其特征在于,所述指令字节码集合包括:
不带返回值的方法返回字节码,所述方法返回字节码包括:助记符和字节数参数,
其中,所述字节数参数表示所述方法中的局部变量占用堆栈的内存大小,当所述虚拟机解释并执行完所述方法返回字节码之后,所述局部变量出栈。
3.根据权利要求1所述的执行方法,其特征在于,所述指令字节码集合包括:
不带返回值的方法返回字节码,所述方法返回字节码包括:助记符,
其中,所述助记符中包括表示所述方法中的局部变量占用堆栈的内存大小的标记,当所述虚拟机解释并执行完所述方法返回字节码之后,所述局部变量出栈。
4.根据权利要求1所述的执行方法,其特征在于,所述指令字节码集合包括:
带返回值的方法返回字节码,所述方法返回字节码包括:助记符和字节数参数,
其中,所述字节数参数表示所述方法中的局部变量占用堆栈的内存大小,当所述虚拟机解释并执行完所述方法返回字节码之后,所述返回值和所述局部变量出栈。
5.根据权利要求1所述的执行方法,其特征在于,所述指令字节码集合包括:
带返回值的方法返回字节码,所述方法返回字节码包括:助记符,
其中,所述助记符中包括表示所述方法中的局部变量占用堆栈的内存大小的标记,当所述虚拟机解释并执行完所述方法返回字节码之后,所述返回值和所述局部变量出栈。
6.根据权利要求1所述的执行方法,其特征在于,所述指令字节码集合包括:
方法调用字节码,所述方法调用字节码包括:助记符、字节数参数和全局跳转偏移量,
其中,所述字节数参数表示所述方法中的局部变量占用内存的大小,所述全局跳转偏移量表示所述方法在内存中的地址偏移量。
7.根据权利要求1所述的执行方法,其特征在于,所述指令字节码集合包括:
方法调用字节码,所述方法调用字节码包括:助记符、字节数参数和地址参数,
其中,所述字节数参数表示所述方法中的局部变量占用内存的大小,所述地址参数表示所述方法在内存中的地址。
8.根据权利要求1所述的执行方法,其特征在于,所述指令字节码集合包括:
变量赋值字节码,所述变量赋值字节码包括:助记符、源操作数和目的操作数的类型参数、目的操作数索引和源操作数索引。
9.根据权利要求1所述的执行方法,其特征在于,所述指令字节码集合包括:
变量赋值字节码,所述变量赋值字节码包括:助记符、源操作数和目的操作数的类型参数以及源操作数索引,
其中,所述助记符中包括表示目的操作数索引的标记。
10.根据权利要求1所述的执行方法,其特征在于,所述指令字节码集合包括:
全局变量运算字节码,所述全局变量运算字节码包括:助记符和常数参数,
其中,所述虚拟机解释、执行所述全局变量运算字节码,使得全局变量自加所述常数参数,所述全局变量包括以下变量中的一个:char型全局变量、short型全局变量和int型全局变量。
11.根据权利要求1所述的执行方法,其特征在于,所述指令字节码集合包括:
全局变量装载字节码,所述全局变量装载字节码包括:助记符和全局地址偏移量,
其中,所述虚拟机解释并执行所述全局变量装载字节码,以将所述全局地址偏移量处存储的数据装载到全局变量,所述全局变量包括以下变量中的一个:char型全局变量、short型全局变量和int型全局变量。
12.根据权利要求1所述的执行方法,其特征在于,所述指令字节码集合包括:
全局变量存储字节码,所述全局变量存储字节码包括:助记符和全局地址偏移量,
其中,所述虚拟机解释并执行所述全局变量存储字节码,以将全局变量存储到所述全局地址偏移量所表示的内存中,所述全局变量包括以下变量中的一个:char型全局变量、short型全局变量和int型全局变量。
13.根据权利要求1所述的执行方法,其特征在于,所述指令字节码集合包括:
全局变量装载字节码,所述全局变量装载字节码包括:助记符,
其中,所述助记符中包括表示全局变量待装载的数据的全局地址偏移量的标记,所述虚拟机解释并执行所述全局变量装载字节码,将所述全局地址偏移量处存储的数据装载到所述全局变量,所述全局变量包括以下变量中的一个:char型全局变量、short型全局变量和int型全局变量。
14.根据权利要求1所述的执行方法,其特征在于,所述指令字节码集合包括:
全局变量存储字节码,所述全局变量存储字节码包括:助记符,
其中,所述助记符中包括表示待存储全局变量的内存的全局地址偏移量的标记,所述虚拟机解释并执行所述全局变量存储字节码,以将所述全局变量存储到所述全局地址偏移量所表示的内存中,所述全局变量包括以下变量中的一个:char型全局变量、short型全局变量和int型全局变量。
15.根据权利要求1所述的执行方法,其特征在于,所述指令字节码集合包括:
指针变量入栈字节码,所述指针变量入栈字节码包括:助记符,
其中,所述虚拟机解释并执行所述指针变量入栈字节码,以将指针变量读取到堆栈中,所述指针变量包括以下变量中的一个:char型指针变量、short型指针变量和int型指针变量。
16.根据权利要求1所述的执行方法,其特征在于,所述指令字节码集合包括:
指针变量赋值字节码,所述指针变量赋值字节码包括:助记符,
其中,所述虚拟机解释并执行所述指针变量赋值字节码,以对指针变量赋值,所述指针变量包括以下变量中的一个:char型指针变量、short型指针变量和int型指针变量。
17.根据权利要求1所述的执行方法,其特征在于,所述指令字节码集合包括:
比较跳转字节码,所述比较跳转字节码包括:助记符、待比较参数和全局地址偏移量,
其中,所述虚拟机解释、执行所述比较跳转字节码,如果所述待比较参数指定的两个比较数据的比较结果为“相等”,则将布尔值“1”或“0”压入堆栈,否则,将布尔值“0”或“1”压入堆栈并跳转至所述全局地址偏移量所指定的内存;或者
所述虚拟机解释、执行所述比较跳转字节码,如果所述待比较参数指定的两个比较数据的比较结果为“相等”,则将布尔值“1”或“0”压入堆栈并跳转至所述全局地址偏移量所指定的内存,否则,将布尔值“0”或“1”压入堆栈。
18.根据权利要求1所述的执行方法,其特征在于,所述指令字节码集合包括:
比较跳转字节码,所述比较跳转字节码包括:助记符、待比较参数和全局地址偏移量,
其中,所述虚拟机解释、执行所述比较跳转字节码,如果所述待比较参数指定的两个比较数据的比较结果为“不相等”,则将布尔值“1”或“0”压入堆栈,否则,将布尔值“0”或“1”压入堆栈并跳转至所述全局地址偏移量所指定的内存;或者
所述虚拟机解释、执行所述比较跳转字节码,如果所述待比较参数指定的两个比较数据的比较结果为“不相等”,则将布尔值“1”或“0”压入堆栈并跳转至所述全局地址偏移量所指定的内存,否则,将布尔值“0”或“1”压入堆栈。
19.根据权利要求1所述的执行方法,其特征在于,所述指令字节码集合包括:
比较跳转字节码,所述比较跳转字节码包括:助记符、待比较参数和全局地址偏移量,
其中,所述虚拟机解释、执行所述比较跳转字节码,如果所述待比较参数指定的两个比较数据的比较结果为“小于”,则将布尔值“1”或“0”压入堆栈,否则,将布尔值“0”或“1”压入堆栈并跳转至所述全局地址偏移量所指定的内存;或者
所述虚拟机解释、执行所述比较跳转字节码,如果所述待比较参数指定的两个比较数据的比较结果为“小于”,则将布尔值“1”或“0”压入堆栈并跳转至所述全局地址偏移量所指定的内存,否则,将布尔值“0”或“1”压入堆栈。
20.根据权利要求1所述的执行方法,其特征在于,所述指令字节码集合包括:
比较跳转字节码,所述比较跳转字节码包括:助记符、待比较参数和全局地址偏移量,
其中,所述虚拟机解释、执行所述比较跳转字节码,如果所述待比较参数指定的两个比较数据的比较结果为“大于”,则将布尔值“1”或“0”压入堆栈,否则,将布尔值“0”或“1”压入堆栈并跳转至所述全局地址偏移量所指定的内存;或者
所述虚拟机解释、执行所述比较跳转字节码,如果所述待比较参数指定的两个比较数据的比较结果为“大于”,则将布尔值“1”或“0”压入堆栈并跳转至所述全局地址偏移量所指定的内存,否则,将布尔值“0”或“1”压入堆栈。
21.根据权利要求1所述的执行方法,其特征在于,所述指令字节码集合包括:
比较跳转字节码,所述比较跳转字节码包括:助记符、待比较参数和全局地址偏移量,
其中,所述虚拟机解释、执行所述比较跳转字节码,如果所述待比较参数指定的两个比较数据的比较结果为“小于等于”,则将布尔值“1”或“0”压入堆栈,否则,将布尔值“0”或“1”压入堆栈并跳转至所述全局地址偏移量所指定的内存;或者
所述虚拟机解释、执行所述比较跳转字节码,如果所述待比较参数指定的两个比较数据的比较结果为“小于等于”,则将布尔值“1”或“0”压入堆栈并跳转至所述全局地址偏移量所指定的内存,否则,将布尔值“0”或“1”压入堆栈。
22.根据权利要求1所述的执行方法,其特征在于,所述指令字节码集合包括:
比较跳转字节码,所述比较跳转字节码包括:助记符、待比较参数和全局地址偏移量,
其中,所述虚拟机解释、执行所述比较跳转字节码,如果所述待比较参数指定的两个比较数据的比较结果为“大于等于”,则将布尔值“1”或“0”压入堆栈,否则,将布尔值“0”或“1”压入堆栈并跳转至所述全局地址偏移量所指定的内存;或者
所述虚拟机解释执行所述比较跳转字节码,如果所述待比较参数指定的两个比较数据的比较结果为“大于等于”,则将布尔值“1”或“0”压入堆栈并跳转至所述全局地址偏移量所指定的内存,否则,将布尔值“0”或“1”压入堆栈。
23.根据权利要求1所述的执行方法,其特征在于,所述指令字节码集合包括:
特殊功能区引用字节码,所述特殊功能区引用字节码包括:助记符,
其中,所述虚拟机解释、执行所述特殊功能区引用字节码,以将特殊功能区的地址压入堆栈。
24.根据权利要求1所述的执行方法,其特征在于,所述指令字节码集合包括:
异常表入栈字节码,所述异常表入栈字节码包括:助记符、待捕获的异常分支的个数参数和所述异常分支的入口的索引-偏移对,
其中,所述虚拟机解释、执行所述异常表入栈字节码,以将待捕获的所述异常分支压入堆栈,构建异常表。
25.根据权利要求1所述的执行方法,其特征在于,所述指令字节码集合包括:
异常分支查找字节码,所述异常分支查找字节码包括:助记符,
其中,所述虚拟机解释、执行所述异常分支查找字节码,以根据捕获的异常值在异常表中查找得到异常分支的全局地址偏移量。
26.根据权利要求1所述的执行方法,其特征在于,所述指令字节码集合包括:
异常表出栈字节码,所述异常表出栈字节码包括:助记符,
其中,所述虚拟机解释、执行所述异常表出栈字节码,将异常表出栈。
27.根据权利要求1所述的执行方法,其特征在于,在所述虚拟机中,堆栈控制所述指令字节码执行,所述堆栈为单向堆栈结构。
28.根据权利要求1所述的执行方法,其特征在于,在所述虚拟机初始化状态下,堆栈指针指向堆栈的栈底;
所述虚拟机在调用一个方法时会做压栈操作,压一个栈,所述堆栈中依次存储方法的局部变量、当前调用的方法的堆栈指针、上下文和程序计数器,所述堆栈指针向上移动;
当调用方法返回时,所述堆栈中存储的所述方法的局部变量、当前调用的方法的堆栈指针、上下文和程序计数器会一起出栈,所述堆栈指针向下移动。
29.一种应用执行系统,其特征在于,包括:
编译单元,被配置为执行将使用C语言编写的应用程序的源代码编译为指令字节码;
执行单元,被配置为执行将所述指令字节码发送给虚拟机,以供所述虚拟机参考预先设置的基于C语言的指令字节码集合解释并执行所述指令字节码。
30.一种应用执行控制装置,其特征在于,包括:
处理器;
用于存储所述处理器可执行指令的存储器;
其中,所述处理器被配置为执行上述权利要求1至28任意一项所述的应用执行方法。
31.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储有计算机指令,所述计算机指令被执行时实现如权利要求1至28中任一项所述的应用执行方法。
32.一种计算机程序产品,包括计算机程序,所述计算机程序包括程序指令,当所述程序指令被移动终端执行时,使所述移动终端执行如权利要求1至28中任一项所述的应用执行方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010715987.0A CN111880806B (zh) | 2020-07-23 | 2020-07-23 | 应用执行方法与应用执行系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010715987.0A CN111880806B (zh) | 2020-07-23 | 2020-07-23 | 应用执行方法与应用执行系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111880806A true CN111880806A (zh) | 2020-11-03 |
CN111880806B CN111880806B (zh) | 2023-11-21 |
Family
ID=73155992
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010715987.0A Active CN111880806B (zh) | 2020-07-23 | 2020-07-23 | 应用执行方法与应用执行系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111880806B (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114968282A (zh) * | 2022-05-20 | 2022-08-30 | 北京握奇智能科技有限公司 | 一种异常处理执行的优化方法和系统 |
Citations (14)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2002073345A (ja) * | 2000-08-25 | 2002-03-12 | Fujitsu Ltd | 情報処理装置及び記録媒体 |
JP2002140197A (ja) * | 2000-10-31 | 2002-05-17 | K Laboratory Co Ltd | プログラム処理装置及びプログラム処理方法 |
US20020194243A1 (en) * | 2001-03-27 | 2002-12-19 | Sun Microsystems, Inc. | Reduced instruction set for java virtual machines |
US20030018679A1 (en) * | 2001-03-27 | 2003-01-23 | Sun Microsystems, Inc. | Enhanced virtual machine instructions |
US20030110200A1 (en) * | 2001-11-28 | 2003-06-12 | Insignia Solutions, Plc | Inter-method control transfer for execution engines with memory constraints |
US20040003377A1 (en) * | 2002-06-28 | 2004-01-01 | Di Loreto Michael A. | Converting byte code instructions to a new instruction set |
US6851109B1 (en) * | 1999-05-06 | 2005-02-01 | International Business Machines Corporation | Process and system for dynamically compiling a partially interpreted method |
CN1687862A (zh) * | 2005-06-16 | 2005-10-26 | 北京航空航天大学 | 智能卡安全环境的控制方法 |
US20080148246A1 (en) * | 2006-12-18 | 2008-06-19 | Bea Systems, Inc. | System and method for redundant array copy removal in a pointer-free language |
CN101963914A (zh) * | 2010-11-12 | 2011-02-02 | 南京大学 | 一种基于字节码文件重构的Java类在线更新方法 |
CN102693150A (zh) * | 2012-05-11 | 2012-09-26 | 深圳市华为技术软件有限公司 | 基于计费专有领域的虚拟机的处理方法及装置 |
CN105630534A (zh) * | 2015-04-27 | 2016-06-01 | 宇龙计算机通信科技(深圳)有限公司 | 基于TrustZone架构的应用程序执行方法、装置和终端 |
US20180341395A1 (en) * | 2017-05-23 | 2018-11-29 | Servicenow, Inc. | Transactional Conversation-Based Computing System |
CN109101237A (zh) * | 2018-08-01 | 2018-12-28 | 北京顶象技术有限公司 | 代码的加密编译方法及装置 |
-
2020
- 2020-07-23 CN CN202010715987.0A patent/CN111880806B/zh active Active
Patent Citations (14)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6851109B1 (en) * | 1999-05-06 | 2005-02-01 | International Business Machines Corporation | Process and system for dynamically compiling a partially interpreted method |
JP2002073345A (ja) * | 2000-08-25 | 2002-03-12 | Fujitsu Ltd | 情報処理装置及び記録媒体 |
JP2002140197A (ja) * | 2000-10-31 | 2002-05-17 | K Laboratory Co Ltd | プログラム処理装置及びプログラム処理方法 |
US20030018679A1 (en) * | 2001-03-27 | 2003-01-23 | Sun Microsystems, Inc. | Enhanced virtual machine instructions |
US20020194243A1 (en) * | 2001-03-27 | 2002-12-19 | Sun Microsystems, Inc. | Reduced instruction set for java virtual machines |
US20030110200A1 (en) * | 2001-11-28 | 2003-06-12 | Insignia Solutions, Plc | Inter-method control transfer for execution engines with memory constraints |
US20040003377A1 (en) * | 2002-06-28 | 2004-01-01 | Di Loreto Michael A. | Converting byte code instructions to a new instruction set |
CN1687862A (zh) * | 2005-06-16 | 2005-10-26 | 北京航空航天大学 | 智能卡安全环境的控制方法 |
US20080148246A1 (en) * | 2006-12-18 | 2008-06-19 | Bea Systems, Inc. | System and method for redundant array copy removal in a pointer-free language |
CN101963914A (zh) * | 2010-11-12 | 2011-02-02 | 南京大学 | 一种基于字节码文件重构的Java类在线更新方法 |
CN102693150A (zh) * | 2012-05-11 | 2012-09-26 | 深圳市华为技术软件有限公司 | 基于计费专有领域的虚拟机的处理方法及装置 |
CN105630534A (zh) * | 2015-04-27 | 2016-06-01 | 宇龙计算机通信科技(深圳)有限公司 | 基于TrustZone架构的应用程序执行方法、装置和终端 |
US20180341395A1 (en) * | 2017-05-23 | 2018-11-29 | Servicenow, Inc. | Transactional Conversation-Based Computing System |
CN109101237A (zh) * | 2018-08-01 | 2018-12-28 | 北京顶象技术有限公司 | 代码的加密编译方法及装置 |
Non-Patent Citations (8)
Title |
---|
ISABELLA STILKERICH: "Team up: Cooperative memory management in embedded systems", 《 2014 INTERNATIONAL CONFERENCE ON COMPILERS, ARCHITECTURE AND SYNTHESIS FOR EMBEDDED SYSTEMS》, pages 1 - 7 * |
TYLER_DOWNLOAD: "java开发C语言编译器:把C实现的快速排序算法编译成jvm字节码", pages 1 - 11, Retrieved from the Internet <URL:《https://blog.csdn.net/tyler_download/article/details/78401913》> * |
佚名: "C/C++ Pointers vs Java References - GeeksforGeeks", pages 1 - 6, Retrieved from the Internet <URL:《https://www.geeksforgeeks.org/is-there-any-concept-of-pointers-in-java/》> * |
佚名: "Java与C通过JNI指针相互传递", pages 1 - 5, Retrieved from the Internet <URL:《Java与C通过JNI指针相互传递》> * |
佚名: "Java虚拟机详解02----JVM内存结构", pages 1 - 9, Retrieved from the Internet <URL:《http://www.cnblogs.com/qianguyihao/p/4748392.html》> * |
李霞: "Android虚拟机运行时技术的分析与评测", 《中国优秀硕士学位论文全文数据库 (信息科技辑)》, pages 138 - 976 * |
魏云云: "基于虚拟机技术监控组态软件脚本语言的设计与实现", 《计算机测量与控制》, pages 2009 - 05 * |
黄以华;童健华;代巍巍;王华宁;陈挚睿;符健;: "Java处理器关键技术分析", 小型微型计算机系统, no. 06, pages 1 - 4 * |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114968282A (zh) * | 2022-05-20 | 2022-08-30 | 北京握奇智能科技有限公司 | 一种异常处理执行的优化方法和系统 |
Also Published As
Publication number | Publication date |
---|---|
CN111880806B (zh) | 2023-11-21 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11385872B2 (en) | Extending a virtual machine instruction set architecture | |
US7069549B2 (en) | Multi-threaded fragment patching | |
US6438745B1 (en) | Program conversion apparatus | |
US6651080B1 (en) | Techniques for implementing pluggable virtual machines | |
US7941802B2 (en) | Reduced instruction set for java virtual machines | |
US11720344B2 (en) | Code hot-update method and device, storage medium, processor, and terminal | |
US20030041317A1 (en) | Frameworks for generation of java macro instructions for storing values into local variables | |
US7823140B2 (en) | Java bytecode translation method and Java interpreter performing the same | |
US6243668B1 (en) | Instruction set interpreter which uses a register stack to efficiently map an application register state | |
US20050028155A1 (en) | Java execution device and Java execution method | |
CN106033370B (zh) | 64位Java虚拟机的实现方法及装置 | |
US20030093649A1 (en) | Flexible caching of translated code under emulation | |
CN106960140A (zh) | 虚拟机指令的混淆方法及装置、虚拟机保护系统 | |
US7181732B2 (en) | Method and apparatus for facilitating lazy type tagging for compiled activations | |
KR20010072958A (ko) | 디지털 이미지의 이식성 개선 | |
KR20050013202A (ko) | 소프트웨어 원자화 | |
US20050235268A1 (en) | Optimisation of a compiler generated program code | |
US9021421B1 (en) | Read and write barriers for flexible and efficient garbage collection | |
Dewar et al. | Macro SPITBOL—a SNOBOL4 compiler | |
CN111782334B (zh) | 一种动态链接库文件虚拟化方法、存储介质及终端设备 | |
US7051323B2 (en) | Method and apparatus for initializing romized system classes at virtual machine build time | |
CN111880806A (zh) | 应用执行方法与应用执行系统 | |
JP2005501334A (ja) | Javaコンピューティング環境におけるJavaマクロインストラクションの生成のためのフレームワーク | |
Flynn et al. | Execution architecture: the DELtran experiment | |
US7802080B2 (en) | Null exception handling |
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 | ||
CB02 | Change of applicant information | ||
CB02 | Change of applicant information |
Address after: Room 501, Jinqian block, 10 Hongyi Road, Xinwu District, Wuxi City, Jiangsu Province, 214028 Applicant after: Wuxi rongka Technology Co.,Ltd. Address before: 518000 south wing w312, west block, Shenzhen Hong Kong industry university research base, Gaoxin South 7th Road, Nanshan District, Shenzhen City, Guangdong Province Applicant before: SHENZHEN RONGCARD Co.,Ltd. |
|
GR01 | Patent grant | ||
GR01 | Patent grant |