CN114428603A - 一种基于编译器生成short和int类型指令的方法和系统 - Google Patents
一种基于编译器生成short和int类型指令的方法和系统 Download PDFInfo
- Publication number
- CN114428603A CN114428603A CN202111600628.1A CN202111600628A CN114428603A CN 114428603 A CN114428603 A CN 114428603A CN 202111600628 A CN202111600628 A CN 202111600628A CN 114428603 A CN114428603 A CN 114428603A
- Authority
- CN
- China
- Prior art keywords
- type
- unary
- suffix
- action
- binary
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 45
- 230000009471 action Effects 0.000 claims description 190
- 238000006243 chemical reaction Methods 0.000 claims description 44
- 238000003491 array Methods 0.000 claims 1
- 238000003672 processing method Methods 0.000 abstract 1
- 230000003068 static effect Effects 0.000 description 20
- 230000008569 process Effects 0.000 description 9
- 238000010586 diagram Methods 0.000 description 6
- 230000014509 gene expression Effects 0.000 description 6
- 238000004364 calculation method Methods 0.000 description 4
- 230000006870 function Effects 0.000 description 4
- 238000005516 engineering process Methods 0.000 description 3
- 238000005457 optimization Methods 0.000 description 3
- 238000004458 analytical method Methods 0.000 description 2
- 230000007246 mechanism Effects 0.000 description 2
- 238000007493 shaping process Methods 0.000 description 2
- 230000007547 defect Effects 0.000 description 1
- 230000007812 deficiency Effects 0.000 description 1
- 230000004069 differentiation Effects 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 230000009467 reduction Effects 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/30—Creation or generation of source code
- G06F8/37—Compiler construction; Parser generation
-
- 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/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30003—Arrangements for executing specific machine instructions
- G06F9/30007—Arrangements for executing specific machine instructions to perform operations on data operands
- G06F9/30029—Logical and Boolean instructions, e.g. XOR, NOT
-
- 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/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30003—Arrangements for executing specific machine instructions
- G06F9/3005—Arrangements for executing specific machine instructions to perform operations for flow control
- G06F9/30069—Instruction skipping instructions, e.g. SKIP
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
本发明涉及一种基于编译器生成short和int类型指令的方法和系统。现有编译处理的方法编译出的指令是32位指令,在资源受限设备存在执行效率底的问题。本发明所述的方法可依据各种操作符的操作数类型确定操作的结果,对有int类型操作数的操作生成int类型指令,对只有short类和byte型操作数的操作可生成short类型指令,包括一元操作字节码指令、后缀操作字节码指令及二元操作字节码指令,采用本发明所述的方法,用户可以编写对short类型运算的结果没有(short)类型转换的代码,采用本发明的编译器技术可以生成16位指令。
Description
技术领域
本发明属于指令编译的技术领域,具体涉及一种基于编译器生成short和int类型指令的方法和系统。
背景技术
安全芯片因为芯片资源受限,典型的资源受限包括Flash和RAM空间受限等,难以承载实现基于32位操作指令的虚拟机,但是可以执行8位或16位算术运算,且比32位算术运算更有效,8位或16位数据操作不需要将byte或short提升到32位,需要的栈空间更少,这使得在资源受限的安全芯片中实现基于16位操作指令的虚拟机成为必要。
现有产生16位操作指令的方法是:编译器编译出通用的字节码之后,由转换程序或工具将其中的部分32位操作指令优化为16位操作指令,在这转换过程中,编译器将byte、short类型提升为int类型后进行各种操作,操作后的结果也是int类型,这将导致两个short类型操作后的结果赋值给short类型时,需要增加显式类型转换,即在计算结果前加(short)做类型转换,小字面量也被编译器当作int类型处理,赋值给short或byte类型也需要加short类型转换,导致编写的应用源代码中出现大量的(short)强制类型转换,代码可读性差,如果未加(short),将导致转换程序或工具无法转换为16位操作指令的问题。
编译器编译获取通用字节码后,通过转换程序或工具进一步进行转换的方法中,需要在中间计算结果前赋值到short类型时添加short类型转换,否则编译器会报错,转换程序或工具则只能转换为int类型操作指令,否则转换失败。用户在开发应用时,符合通用语言规范,但是不能完全适配16位操作指令要求,此时编译器虽然能编译通过,但在转换程序或工具进行后续转换处理阶段则会报错,不能做到应用编写阶段提示问题,而只能在应用转换阶段报错,用户体验差,因对程序代码进行编译及转换时因易出错而导致编译转换的效率不高。因此,现有指令编译方法存在编译转换的效率较低的问题。
发明内容
针对现有技术中存在的缺陷,本发明的目的是提供一种基于编译器生成short和int类型指令的方法和系统。该方法和系统可依据各种操作符的操作数类型确定操作的结果,对有int类型操作数的操作生成int类型指令,对只有short类和byte型操作数的操作可生成short类型指令,用户可以编写对short类型运算的结果没有(short)类型转换的代码,采用本发明的编译器技术也可以生成16位指令。
为达到以上目的,本发明采用的技术方案是:一种基于编译器生成short和int类型指令的方法,包括以下步骤:根据所输入的抽象语法树中的每一字面量的数值确定与每一所述字面量对应的字面量类型,所述字面量类型为byte、short或int;根据所述抽象语法树中的一元运算符查找预置的一元操作符动作表以确定对应的一元动作,根据所述一元处理动作生成对应的一元操作字节码,所述一元动作包括操作数的类型转换及操作的指令类型的选择;所述一元操作字节码的类型为short或int类型;根据所述抽象语法树中的后缀运算符查找预置的后缀操作符动作表以确定对应的后缀动作,根据所述后缀动作生成对应的后缀操作字节码,所述后缀动作包括操作数的类型转换及操作的指令类型的选择;所述后缀操作字节码的类型为short或int类型;根据所述抽象语法树中的二元运算符查找预置的二元操作符动作表以确定对应的二元动作,根据所述二元动作生成对应的二元操作字节码,所述二元动作包括操作数的类型转换及操作的指令类型的选择;所述二元操作字节码的类型为short或int类型;根据所述字面量类型、所述一元操作字节码、所述后缀操作字节码及所述二元操作字节码生成与所述抽象语法树对应的中间指令。
进一步,所述字面量包括整型字面量及布尔类型字面量,所述根据所输入的抽象语法树中的每一字面量的数值确定与每一所述字面量对应的字面量类型,包括:根据所述整型字面量的数值大小,确定每一所述整型字面量的字面量类型;根据所述布尔类型字面量的字面量类型,确定每一所述布尔类型字面量的字面量类型。
进一步,所述根据所述抽象语法树中的一元运算符查找预置的一元操作符动作表以确定对应的一元动作,根据所述一元动作生成对应的一元操作字节码,包括:根据所述一元运算符的操作数类型及结果类型查找所述一元操作符动作表以确定对应的一元动作;根据所述一元动作获取所述一元操作符动作表中对应的一元目标指令;根据所述一元目标指令及所述一元运算符的操作数生成对应的一元操作字节码。
进一步,所述根据所述抽象语法树中的后缀运算符查找预置的后缀操作符动作表以确定对应的后缀动作,根据所述后缀动作生成对应的后缀操作字节码,包括:根据所述后缀运算符的操作数类型及结果类型查找所述后缀操作符动作表以确定对应的后缀动作;根据所述后缀动作获取所述后缀操作符动作表中对应的后缀目标指令;根据所述后缀目标指令及所述后缀运算符的操作数生成对应的后缀操作字节码。
进一步,所述根据所述抽象语法树中的二元运算符查找预置的二元操作符动作表以确定对应的二元动作,根据所述二元动作生成对应的二元操作字节码,包括:根据所述二元运算符的操作数类型及结果类型查找所述二元操作符动作表以确定对应的二元动作;根据所述二元动作获取所述二元操作符动作表中对应的二元目标指令;根据所述二元目标指令及所述二元运算符的操作数生成对应的二元操作字节码。
一种基于编译器生成short和int类型指令的系统,包括以下装置:字面量类型确定装置,用于根据所输入的抽象语法树中的每一字面量的数值确定与每一所述字面量对应的字面量类型,所述字面量类型为byte、short或int;一元操作字节码生成装置,用于根据所述抽象语法树中的一元运算符查找预置的一元操作符动作表以确定对应的一元动作,根据所述一元动作生成对应的一元操作字节码,所述一元动作包括操作数的类型转换及操作的指令类型的选择;所述一元操作字节码的类型为short或int类型;后缀操作字节码生成装置,用于根据所述抽象语法树中的后缀运算符查找预置的后缀操作符动作表以确定对应的后缀动作,根据所述后缀动作生成对应的后缀操作字节码,所述后缀动作包括操作数的类型转换及操作的指令类型的选择;所述后缀操作字节码的类型为short或int类型;二元操作字节码生成装置,用于根据所述抽象语法树中的二元运算符查找预置的二元操作符动作表以确定对应的二元动作,根据所述二元动作生成对应的二元操作字节码,所述二元动作包括操作数的类型转换及操作的指令类型的选择;所述二元操作字节码的类型为short或int类型;中间指令获取装置,用于根据所述字面量类型、所述一元操作字节码、所述后缀操作字节码及所述二元操作字节码生成与所述抽象语法树对应的中间指令。
进一步,所述字面量包括整型字面量及布尔类型字面量,所述字面量类型确定装置包括单元:整型字面量处理单元,用于根据所述整型字面量的数值大小,确定每一所述整型字面量的字面量类型;布尔类型字面量处理单元,用于根据所述布尔类型字面量的字面量类型,确定每一所述布尔类型字面量的字面量类型。
进一步,所述一元操作字节码生成装置包括单元:一元动作确定单元,用于根据所述一元运算符的操作数类型及结果类型查找所述一元操作符动作表以确定对应的一元动作;一元目标指令获取单元,用于根据所述一元动作获取所述一元操作符动作表中对应的一元目标指令;一元操作字节码生成单元,用于根据所述一元目标指令及所述一元运算符的操作数生成对应的一元操作字节码。
进一步,所述后缀操作字节码生成装置包括单元:后缀动作确定单元,用于根据所述后缀运算符的操作数类型及结果类型查找所述后缀操作符动作表以确定对应的后缀动作;后缀目标指令获取单元,用于根据所述后缀动作获取所述后缀操作符动作表中对应的后缀目标指令;后缀操作字节码生成单元,用于根据所述后缀目标指令及所述后缀运算符的操作数生成对应的后缀操作字节码。
进一步,所述二元操作字节码生成装置包括单元:二元动作确定单元,用于根据所述二元运算符的操作数类型及结果类型查找所述二元操作符动作表以确定对应的二元动作;二元目标指令获取单元,用于根据所述二元动作获取所述二元操作符动作表中对应的二元目标指令;二元操作字节码生成单元,用于根据所述二元目标指令及所述二元运算符的操作数生成对应的二元操作字节码。
本发明的效果在于:采用本发明所述的方法,可依据各种操作符的操作数类型确定操作的结果,对有int类型操作数的操作生成int类型指令,对只有short类和byte型操作数的操作可生成short类型指令,用户可以编写对short类型运算的结果没有(short)类型转换的代码,采用本发明的编译器技术可以生成16位指令。
附图说明
图1是本发明所述方法的流程图;
图2为本发明所述方法的子流程示意图;
图3为本发明所述方法的另一子流程示意图;
图4为本发明所述方法的又一子流程示意图;
图5为本发明所述方法的再一子流程示意图;
图6是本发明所述系统的结构图;
图7是本发明所述系统中装置的结构图;
图8是本发明所述系统中另一装置的结构图;
图9是本发明所述系统中又一装置的结构图;
图10是本发明所述系统中再一装置的结构图;
具体实施方式
下面结合附图和具体实施方式对本发明作进一步描述。
如图1所示,一种基于编译器生成short和int类型指令的方法,该基于编译器生成short和int类型指令的方法应用于用户终端中,该基于编译器生成short和int类型指令的方法通过安装于用户终端中的应用软件进行执行,用户终端即是用于执行基于编译器生成short和int类型指令的方法以对抽象语法树进行编译从而生成对应中间指令的终端设备,如台式电脑、笔记本电脑等,包括以下步骤:
S110、根据所输入的抽象语法树中的每一字面量的数值确定与每一所述字面量对应的字面量类型,所述字面量类型为byte、short或int。
本发明定义基于操作数栈的中间指令集,支持16位short类型操作生成short类型的指令,可选的支持32位int类型操作生成int类型的指令。本发明实现一种编译器,可以将基于通用语言规范限定编写的源码编译为中间指令集,该中间指令集可进一步转换为基于寄存器的指令集。
中间指令虚拟机是可以模拟执行中间指令集的虚拟机,保存类型对应源码中变量的类型,计算类型是这些类型在栈帧中的体现形式。
中间指令虚拟机最基本的数据单元是字(Word),其大小由虚拟机实现的设计者确定,但字长必须至少能够保存byte、short、returnAddress或者引用类型的值,两个字可以满足保存int类型的值,中间指令虚拟机选择16位作为字长。保存类型与计算类型之间的对应关系如表1所示。
表1
局部变量和操作数栈都按照字来定义的,这些内存区域能够容纳任何虚拟机数据类型的值,当把这些值放到局部变量或者操作数栈时,将占用一个或者两个字单元。由16位长的数据单元,本发明称为“字”的数组实现,boolean、byte、short以及引用类型的局部变量使用以一个字保存其值,而int类型需要使用两个字保存其内容。
支持short类型和int类型运算的中间指令,中间指令不在实际设备运行,因此未考虑为节省字节码空间或者提高执行性能而进行指令优化设计,中间指令主要用于后续转换以及优化操作的输入,转换的输出可以是目标指令集。
以下重点说明本发明的编译器如何生成和数据类型相关指令,其他指令生成方式同传统编译器的生成方式。
本实施例中中间指令的指令注记符及相应指令功能的说明如表2所示。
表2
需要说明的是此处给出的中间指令集只是用于说明如何生成short和int类型指令的功能和机制,其他形式(指令条数的增加或减少、指令合并和拆分、指令的操作码、操作数、具体指令格式差异等等)中间指令集,只要生成机制和本发明相同或者类似,也属于本发明覆盖的范围。
可根据所述抽象语法树中的每一字面量的数值大小确定与每一字面量对应的字面量类型,字面量类型为byte、short或int类型。
在一实施例中,如图2所示,步骤S110包括子步骤S111和S112。
S111、根据所述整型字面量的数值大小,确定每一所述整型字面量的字面量类型。
传统编译器支持的最小类型的整型字面量是int类型的字面量,不支持byte以及short类型的字面量,本发明将int类型字面量按照其值的大小进一步细化为byte、short以及int三种类型。
若在byte类型表示的范围,确定为byte类型,若在short类型表示的范围,确定为short类型,否则确定为int类型。
具体的,整型字面量的数值大小与相应字面量类型之间的对应关系如表3所示。
表3
整型字面量 | 字面量的类型 |
>=-128且<=127 | byte |
>=-32768且<=32767 | short |
<-32768或>32767 | int |
此外确定整型字面量的字面量类型过程中还包括两种特殊情况:1.用户程序可以通过强制类型转换可以将小值的字面量明确指定为short或int类型。如(short)6是short类型、(int)3是int类型、(int)300是int类型。2.对于二元操作,如果其中一个操作数为int类型,另一个为byte或者short类型的字面量,此时编译器会将byte或者short类型的字面量提升为int类型。
确定整型字面量的字面量类型的目的:byte、short类型的字面量参与生成short类型的指令,int类型的字面量参与生成int类型的指令。
下面以整型字面量入栈操作为例,说明整型字面量区分的带来的益处,传统编译器生成相关的指令如表4所示。
表4
本发明的编译器生成相关的指令如表5所示。
表5
指令注记符 | 指令功能说明 |
push-short | 将16位有符号常数入栈 |
push-int | 将32位有符号常数入栈 |
S112、根据所述布尔类型字面量的字面量类型,确定每一所述布尔类型字面量的字面量类型。
具体的,布尔类型字面量与相应字面量类型之间的对应关系如表6所示。
表6
此外,本发明的编译器对于隐式类型转换,由于byte按照short类型存储,因此byte转short是隐式转换,不要生成对应的转换指令。
S120、根据所述抽象语法树中的一元运算符查找预置的一元操作符动作表以确定对应的一元动作,根据所述一元处理动作生成对应的一元操作字节码,所述一元动作包括操作数的类型转换及操作的指令类型的选择;所述一元操作字节码的类型为short或int类型。
在一实施例中,如图3所示,步骤S120包括子步骤S121、S122和S123。
S121、根据所述一元运算符的操作数类型及结果类型查找所述一元操作符动作表以确定对应的一元动作;S122、根据所述一元动作获取所述一元操作符动作表中对应的一元目标指令;S123、根据所述一元目标指令及所述一元运算符的操作数生成对应的一元操作字节码。
本发明主要关注操作符的操作数类型和操作的结果,局部变量可以是操作数,也存在其他类型,比如静态域、实例域、常数、以及由这些内容组成的表达式都可以是操作数,只要是操作数的类型即可进行处理。具体的,一元操作符动作表如7所示。
表7
可首先根据一元操作符的操作数类型及结果类型查找一元操作符动作表以确定对应的一元动作,其中确定得到的一元动作中包括操作数的类型转换及操作的指令类型的选择。可根据一元动作获取对应的一元目标指令,如操作数的类型转换为byte类型转short类型,操作的指令类型的选择为“++”,则对应确定一元目标指令为add-short指令,若一元操作符的操作数为25,则对应生成的一元操作字节码为add-short 25,所生成的一元操作字节码的类型与一元操作符的结果类型相一致,由于结果类型仅包含short及int类型,则所生成的一元操作字节码的类型为short或int类型。
S130、根据所述抽象语法树中的后缀运算符查找预置的后缀操作符动作表以确定对应的后缀动作,根据所述后缀动作生成对应的后缀操作字节码。
在一实施例中,如图4所示,步骤S130包括子步骤S131、S132和S133。
S131、根据所述后缀运算符的操作数类型及结果类型查找所述后缀操作符动作表以确定对应的后缀动作;S132、根据所述后缀动作获取所述后缀操作符动作表中对应的后缀目标指令;S133、根据所述后缀目标指令及所述后缀运算符的操作数生成对应的后缀操作字节码。
具体的,生成后缀操作字节码的过程与生成一元操作字节码的过程相似,区别仅仅在于生成过程中使用的为后缀操作符动作表,而生成一元操作字节码的过程中使用的为一元操作符动作表。所生成的后缀操作字节码的类型为short或int类型。具体的,一元操作符动作表如8所示。
表8
S140、根据所述抽象语法树中的二元运算符查找预置的二元操作符动作表以确定对应的二元动作,根据所述二元动作生成对应的二元操作字节码,所述二元动作包括操作数的类型转换及操作的指令类型的选择;所述二元操作字节码的类型为short或int类型。
在一实施例中,如图5所示,步骤S140包括子步骤S141、S142和S143。
S141、根据所述二元运算符的操作数类型及结果类型查找所述二元操作符动作表以确定对应的二元动作;S142、根据所述二元动作获取所述二元操作符动作表中对应的二元目标指令;S143、根据所述二元目标指令及所述二元运算符的操作数生成对应的二元操作字节码。
具体的,可首先根据二元操作符确定对应的二元操作符动作表,由于二元操作符数量较多,因此区分多个二元操作符动作表。二元运算符对应包含两个操作数,每一操作数均对应各自的操作数类型,二元运算符在对两个操作数进行运算的过程中会涉及操作数类型转换,则两个操作数分别对应两个操作数类型转换,二元运算符在运算后可得到运算结果,则可获取运算结果对应的数值类型作为二元运算符的结果类型,所生成的二元操作字节码类型与二元运算符的结果类型相一致。
算术预算包括加法“+”、减法“-”、乘法“*”、除法“\”、取余“%”等运算,与上述运算相对应的二元操作符动作表如表9所示。
表9
表格中操作数1与操作数2即为二元运算符的两个操作数,操作数1类型转换及操作数2类型转换即对应两个操作数对应的两个操作数类型转换,表格中操作结果即为二元操作符的结果类型。整数位操作包括逻辑与“&”、逻辑或“|”、逻辑异或“^”,与上述运算相对应的二元操作符动作表如表10所示。
表10
布尔逻辑操作包括逻辑与“&”、逻辑或“|”、逻辑异或“^”,与上述运算相对应的二元操作符动作表如表11所示。
表11
移位操作包括左移操作符“<<”、右移操作符“>>”、无符号右移“>>>”,与上述运算相对应的二元操作符动作表如表12所示。
表12
逻辑运算操作包括条件与操作符“&&”及条件或操作符“||”,与上述运算相对应的二元操作符动作表如表13所示。
表13
条件操作符“?:”,其指令代码的表现形式为“操作数1?操作数2:操作数3”,其中操作数1必须为boolean类型。操作数2和操作数3都是数字型时,称为数字型条件表达式,数字型条件表达式对应的二元操作符动作表如表14所示。
表14
判等操作包括数字判等操作符“==”和“!=”,与上述运算相对应的二元操作符动作表如表14所示。
表14
判等操作还包括布尔判等操作符“==”和“!=”,与上述运算相对应的二元操作符动作表如表15所示。
表15
判等操作还包括引用判等操作符“==”和“!=”,与上述运算相对应的二元操作符动作表如表16所示。
表16
关系操作包括数字比较操作符“<”、“<=”、“>”和“>=”,与上述运算相对应的二元操作符动作表如表17所示。
表17
S150、根据所述字面量类型、所述一元操作字节码、所述后缀操作字节码及所述二元操作字节码生成与所述抽象语法树对应的中间指令。
将根据上述得到的局部变量、一元操作字节码、后缀操作字节码及二元操作字节码添加相应附属指令,即可生成与抽象语法树对应的中间指令。所生成的中间指令中还包括栈操作和局部变量操作指令、静态域访问指令、类型转换指令、一元操作符和二元操作符表达式、比较指令等。
在生成的中间指令中,还可在静态域的定义前增加标注@RamField(Type=RAMFieldType.DTR),可以将该静态域放入DTR类型RAM区,可以提高访问静态域的读写性能;要实现DTR RAM静态域访问功能,需要编译器生成专有的DTR RAM静态域访问指令。在静态域声明的AST节点,进行类型解析时,检查该静态域是否有注解,如有注解进一步检查是否RamField类型的注解,如有就在该静态域的绑定信息中增加RAM Field注解标志。生成静态域访问指令前,检查该静态域的绑定信息是否有RAM Field注解标志,如有采用RAMField专有的指令操作码,否则采用常规的静态域访问指令的操作码。增加DTR RAM静态域声明注解,通过对注解的解析,记录解析的结果,指令生成查询该标志,可以生成DTR RAM静态域指令,通过注解将指定静态域放入DTR RAM区可以提高静态域的读写性能。
静态域访问指令如表18所示。
表18
常规静态域访问指令 | DTR RAM静态域访问指令 |
get_staticfield | get_staticfield_dtr |
put_staticfield | put_staticfield_dtr |
栈操作和局部变量操作包括把常量压入操作数栈、通用的栈操作、在操作数栈和局部变量之间往返数据操作。入栈时boolean、byte、short以及引用类型占用一个位置,而int类型占用两个位置;出栈时boolean、byte、short以及引用类型弹出一个位置,而int类型弹出两个位置。对应常量压入操作数栈指令,依据要入栈的整型字面量的类型生成将short类型入栈指令push-short和int类型常量入栈的指令push-int。对于通用(无类型)的栈操作,可生成弹出(pop)一个字或两个字的指令,可生成复制(dup)栈顶一个或两个字,并插入到栈顶的指定位置的指令;可生成交换(swap)栈顶一个或两个字的指令。
操作数栈和局部变量之间往返数据操作指令,即加载(load)和存储(store)指令。若操作数的类型是short,则生成short类型局部变量入栈的指令load-short,若数据的类型是int,则生成int类型的局部变量入栈的指令load-int;若操作数的类型是short,生成将操作数栈顶的short类型出栈并保存到short类型局部变量的指令store-short;若操作数的类型是int,生成将操作数栈顶的int类型出栈并保存到int类型局部变量的指令store-int。
对于类型转换指令,可生成short类型转byte类型以及short类型转int类型的指令,还可生成int类型转byte类型以及int类型转short类型的指令。
对于一元操作符和二元操作符表达式,依据预先设置各种一元以及二元运算的动作表,生成short类型或者int类型的操作指令。对于比较指令,增加两个int类型的数的比较操作的指令,指令比较的结果为short类型,小于时其值为-1,等于时其值为0,小于时其值为1。对于switch语句处理,如果switch表达式以及所有的case常数为short类型,生成lookupswitch或者tableswitch的short类型版本,否则生成lookupswitch或者tableswitch的int类型版本。对于方法调用返回,则可生成返回short类型以及返回int类型的指令。对于方法调用局部变量的索引,方法的参数以及方法定义的局部变量boolean、byte、short以及引用类型的局部变量占用一个索引位置,而int类型占用两个索引位置。对于,类文件Code属性max_stack和max_locals的生成,max_stack项给出该方法的操作数栈的最大长度(以字为单位),max_locals项给出方法的局部变量所需存储空间的长度(以字为单元),这两个项的计算都要注意int类型占用两个字长,其他类型占用一个字长。
实施例1:
如抽象语法树为“short s1,s2;
……
s2=s1-10;”
字面量10按照int字面量处理规则处理为short类型,查用两个short型的操作数查与算术运算对应的二元操作符动作表,生成short类型的减指令sub-short,字面量10入栈指令也是short类型的指令spush。
则所生成的中间指令为:
实施例2:
指令注记符,b1、s1以及s2在实际指令中是局部变量表的索引,是一个常数,这里直接采用变量名只是为更清晰地说明转换原理。
则所生成的中间指令为:
实施例3:
则所生成的中间指令为:
实施例4:
则所生成的中间指令为:
实施例5:
则所生成的中间指令为:
本发明中的编译器对于short类型的操作编译器可以生成short类型操作的指令,在资源非常有限的装置上实现的支持short类型指令的虚拟机,编译器编译出的应用具有更佳的执行性能。传统的支持虚拟机的系统,比如JavaCard平台,采用传统的Java语言编译器编译Java应用时,需要用户将short操作的结果(int类型)强制转化为short类型,再通过附加转换程序才可以生成short类型的指令,用户编写出源码可读性很差,可维护性性差的不足;先编译源码为类文件,再通过专有的Class转换程序转换出优化的字节码,处理流程相比编译器直接生成优化指令繁琐。
本实施例中,采用本发明所述的方法,可依据各种操作符的操作数类型确定操作的结果,对有int类型操作数的操作生成int类型指令,对只有short类和byte型操作数的操作可生成short类型指令,用户可以编写对short类型运算的结果没有(short)类型转换的代码,采用本发明的编译器技术也可以生成16位指令。
如图6所示,一种基于编译器生成short和int类型指令的系统,该系统可配置于用户终端中,该系统用于执行前述的基于编译器生成short和int类型指令的方法的任一实施例,包括以下装置:字面量类型确定装置110、一元操作字节码生成装置120、后缀操作字节码生成装置130、二元操作字节码生成装置140和中间指令获取装置150。
字面量类型确定装置110,用于根据所输入的抽象语法树中的每一字面量的数值确定与每一所述字面量对应的字面量类型,所述字面量类型为byte、short或int。
在一具体实施例中,如图7所示,所述字面量类型确定装置110包括以下单元:整型字面量处理单元111,用于根据所述整型字面量的数值大小,确定每一所述整型字面量的字面量类型;布尔类型字面量处理单元112,用于根据所述布尔类型字面量的字面量类型,确定每一所述布尔类型字面量的字面量类型。
一元操作字节码生成装置120,用于根据所述抽象语法树中的一元运算符查找预置的一元操作符动作表以确定对应的一元动作,根据所述一元动作生成对应的一元操作字节码,所述一元动作包括操作数的类型转换及操作的指令类型的选择;所述一元操作字节码的类型为short或int类型。
在一具体实施例中,如图8所示,所述一元操作字节码生成装置120包括以下单元:一元动作确定单元121,用于根据所述一元运算符的操作数类型及结果类型查找所述一元操作符动作表以确定对应的一元动作;一元目标指令获取单元122,用于根据所述一元动作获取所述一元操作符动作表中对应的一元目标指令;一元操作字节码生成单元123,用于根据所述一元目标指令及所述一元运算符的操作数生成对应的一元操作字节码。
后缀操作字节码生成装置130,用于根据所述抽象语法树中的后缀运算符查找预置的后缀操作符动作表以确定对应的后缀动作,根据所述后缀动作生成对应的后缀操作字节码,所述后缀动作包括操作数的类型转换及操作的指令类型的选择;所述后缀操作字节码的类型为short或int类型。
在一具体实施例中,如图9所示,所述后缀操作字节码生成装置130包括以下单元:后缀动作确定单元131,用于根据所述后缀运算符的操作数类型及结果类型查找所述后缀操作符动作表以确定对应的后缀动作;后缀目标指令获取单元132,用于根据所述后缀动作获取所述后缀操作符动作表中对应的后缀目标指令;后缀操作字节码生成单元133,用于根据所述后缀目标指令及所述后缀运算符的操作数生成对应的后缀操作字节码。
二元操作字节码生成装置140,用于根据所述抽象语法树中的二元运算符查找预置的二元操作符动作表以确定对应的二元动作,根据所述二元动作生成对应的二元操作字节码,所述二元动作包括操作数的类型转换及操作的指令类型的选择;所述二元操作字节码的类型为short或int类型。
在一具体实施例中,如图10所示,所述二元操作字节码生成装置140包括以下单元:二元动作确定单元141,用于根据所述二元运算符的操作数类型及结果类型查找所述二元操作符动作表以确定对应的二元动作;二元目标指令获取单元142,用于根据所述二元动作获取所述二元操作符动作表中对应的二元目标指令;二元操作字节码生成单元143,用于根据所述二元目标指令及所述二元运算符的操作数生成对应的二元操作字节码。
中间指令获取装置150,用于根据所述字面量类型、所述一元操作字节码、所述后缀操作字节码及所述二元操作字节码生成与所述抽象语法树对应的中间指令。
本实施例中,可依据各种操作符的操作数类型确定操作的结果,对有int类型操作数的操作生成int类型指令,对只有short类和byte型操作数的操作可生成short类型指令,用户可以编写对short类型运算的结果没有(short)类型转换的代码,采用本发明的编译器技术也可以生成16位指令。
本领域技术人员应该明白,本发明所述的方法和系统并不限于具体实施方式中所述的实施例,上面的具体描述只是为了解释本发明的目的,并非用于限制本发明。本领域技术人员根据本发明的技术方案得出其他的实施方式,同样属于本发明的技术创新范围,本发明的保护范围由权利要求及其等同物限定。
Claims (10)
1.一种基于编译器生成short和int类型指令的方法,其特征在于,所述编译器编译源码生成基于操作数栈的指令,所述基于操作数栈的指令可由虚拟机执行,所述虚拟机执行方法需要栈帧存储参数、局部变量、中间运算结果,所述栈帧包括局部变量区和操作数栈,所述局部变量区由16位长的数据单元,称为“字”的数组实现,boolean、byte、short类型以及引用类型的局部变量使用一个字保存其值,int类型使用两个字保存其内容,字节码的指令通过从0开始的索引使用其中的数据;所述操作数栈也组织成一个以字为单位的数组,通过压栈和出栈操作访问,将虚拟机数据类型的值放入所述所述操作数栈时,将占用一个或者两个字单元,所述方法包括以下步骤:
根据所输入的抽象语法树中的每一字面量的数值确定与每一所述字面量对应的字面量类型,所述字面量类型为byte、short或int;
根据所述抽象语法树中的一元运算符查找预置的一元操作符动作表以确定对应的一元动作,根据所述一元处理动作生成对应的一元操作字节码,所述一元动作包括操作数的类型转换及操作的指令类型的选择;所述一元操作字节码的类型为short或int类型;
根据所述抽象语法树中的后缀运算符查找预置的后缀操作符动作表以确定对应的后缀动作,根据所述后缀动作生成对应的后缀操作字节码,所述后缀动作包括操作数的类型转换及操作的指令类型的选择;所述后缀操作字节码的类型为short或int类型;
根据所述抽象语法树中的二元运算符查找预置的二元操作符动作表以确定对应的二元动作,根据所述二元动作生成对应的二元操作字节码,所述二元动作包括操作数的类型转换及操作的指令类型的选择;所述二元操作字节码的类型为short或int类型;
根据所述字面量类型、所述一元操作字节码、所述后缀操作字节码及所述二元操作字节码生成与所述抽象语法树对应的中间指令。
2.如权利要求1所述的一种基于编译器生成short和int类型指令的方法,其特征在于,所述字面量包括整型字面量及布尔类型字面量,所述根据所输入的抽象语法树中的每一字面量的数值确定与每一所述字面量对应的字面量类型,包括:
根据所述整型字面量的数值大小,确定每一所述整型字面量的字面量类型;
根据所述布尔类型字面量的字面量类型,确定每一所述布尔类型字面量的字面量类型。
3.如权利要求1所述的一种基于编译器生成short和int类型指令的方法,其特征在于,所述根据所述抽象语法树中的一元运算符查找预置的一元操作符动作表以确定对应的一元动作,根据所述一元动作生成对应的一元操作字节码,包括:
根据所述一元运算符的操作数类型及结果类型查找所述一元操作符动作表以确定对应的一元动作;
根据所述一元动作获取所述一元操作符动作表中对应的一元目标指令;
根据所述一元目标指令及所述一元运算符的操作数生成对应的一元操作字节码。
4.如权利要求1所述的一种基于编译器生成short和int类型指令的方法,其特征在于,所述根据所述抽象语法树中的后缀运算符查找预置的后缀操作符动作表以确定对应的后缀动作,根据所述后缀动作生成对应的后缀操作字节码,包括:
根据所述后缀运算符的操作数类型及结果类型查找所述后缀操作符动作表以确定对应的后缀动作;
根据所述后缀动作获取所述后缀操作符动作表中对应的后缀目标指令;
根据所述后缀目标指令及所述后缀运算符的操作数生成对应的后缀操作字节码。
5.如权利要求1所述的一种基于编译器生成short和int类型指令的方法,其特征在于,所述根据所述抽象语法树中的二元运算符查找预置的二元操作符动作表以确定对应的二元动作,根据所述二元动作生成对应的二元操作字节码,包括:
根据所述二元运算符的操作数类型及结果类型查找所述二元操作符动作表以确定对应的二元动作;
根据所述二元动作获取所述二元操作符动作表中对应的二元目标指令;
根据所述二元目标指令及所述二元运算符的操作数生成对应的二元操作字节码。
6.一种基于编译器生成short和int类型指令的系统,其特征在于,包括以下装置:
字面量类型确定装置,用于根据所输入的抽象语法树中的每一字面量的数值确定与每一所述字面量对应的字面量类型,所述字面量类型为byte、short或int;
一元操作字节码生成装置,用于根据所述抽象语法树中的一元运算符查找预置的一元操作符动作表以确定对应的一元动作,根据所述一元动作生成对应的一元操作字节码,所述一元动作包括操作数的类型转换及操作的指令类型的选择;所述一元操作字节码的类型为short或int类型;
后缀操作字节码生成装置,用于根据所述抽象语法树中的后缀运算符查找预置的后缀操作符动作表以确定对应的后缀动作,根据所述后缀动作生成对应的后缀操作字节码,所述后缀动作包括操作数的类型转换及操作的指令类型的选择;所述后缀操作字节码的类型为short或int类型;
二元操作字节码生成装置,用于根据所述抽象语法树中的二元运算符查找预置的二元操作符动作表以确定对应的二元动作,根据所述二元动作生成对应的二元操作字节码,所述二元动作包括操作数的类型转换及操作的指令类型的选择;所述二元操作字节码的类型为short或int类型;
中间指令获取装置,用于根据所述字面量类型、所述一元操作字节码、所述后缀操作字节码及所述二元操作字节码生成与所述抽象语法树对应的中间指令。
7.如权利要求6所述的一种基于编译器生成short和int类型指令的系统,其特征在于,所述字面量包括整型字面量及布尔类型字面量,所述字面量类型确定装置包括单元:
整型字面量处理单元,用于根据所述整型字面量的数值大小,确定每一所述整型字面量的字面量类型;
布尔类型字面量处理单元,用于根据所述布尔类型字面量的字面量类型,确定每一所述布尔类型字面量的字面量类型。
8.如权利要求6所述的一种基于编译器生成short和int类型指令的系统,其特征在于,所述一元操作字节码生成装置包括单元:
一元动作确定单元,用于根据所述一元运算符的操作数类型及结果类型查找所述一元操作符动作表以确定对应的一元动作;
一元目标指令获取单元,用于根据所述一元动作获取所述一元操作符动作表中对应的一元目标指令;
一元操作字节码生成单元,用于根据所述一元目标指令及所述一元运算符的操作数生成对应的一元操作字节码。
9.如权利要求6所述的一种基于编译器生成short和int类型指令的系统,其特征在于,所述后缀操作字节码生成装置包括单元:
后缀动作确定单元,用于根据所述后缀运算符的操作数类型及结果类型查找所述后缀操作符动作表以确定对应的后缀动作;
后缀目标指令获取单元,用于根据所述后缀动作获取所述后缀操作符动作表中对应的后缀目标指令;
后缀操作字节码生成单元,用于根据所述后缀目标指令及所述后缀运算符的操作数生成对应的后缀操作字节码。
10.如权利要求6所述的一种基于编译器生成short和int类型指令的系统,其特征在于,所述二元操作字节码生成装置包括单元:
二元动作确定单元,用于根据所述二元运算符的操作数类型及结果类型查找所述二元操作符动作表以确定对应的二元动作;
二元目标指令获取单元,用于根据所述二元动作获取所述二元操作符动作表中对应的二元目标指令;
二元操作字节码生成单元,用于根据所述二元目标指令及所述二元运算符的操作数生成对应的二元操作字节码。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111600628.1A CN114428603A (zh) | 2021-12-24 | 2021-12-24 | 一种基于编译器生成short和int类型指令的方法和系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111600628.1A CN114428603A (zh) | 2021-12-24 | 2021-12-24 | 一种基于编译器生成short和int类型指令的方法和系统 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN114428603A true CN114428603A (zh) | 2022-05-03 |
Family
ID=81311706
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111600628.1A Pending CN114428603A (zh) | 2021-12-24 | 2021-12-24 | 一种基于编译器生成short和int类型指令的方法和系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114428603A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117492831A (zh) * | 2023-10-16 | 2024-02-02 | 东信和平科技股份有限公司 | 字节码指令序列分析方法、装置、电子设备、存储介质 |
-
2021
- 2021-12-24 CN CN202111600628.1A patent/CN114428603A/zh active Pending
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117492831A (zh) * | 2023-10-16 | 2024-02-02 | 东信和平科技股份有限公司 | 字节码指令序列分析方法、装置、电子设备、存储介质 |
CN117492831B (zh) * | 2023-10-16 | 2024-08-13 | 东信和平科技股份有限公司 | 字节码指令序列分析方法、装置、电子设备、存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
EP0528028B1 (en) | Automatic flowgraph generation for program analysis and translation | |
CA2082070C (en) | Branch resolution via backward symbolic execution | |
US5317740A (en) | Alternate and iterative analysis of computer programs for locating translatable code by resolving callbacks and other conflicting mutual dependencies | |
US7353508B2 (en) | Method, apparatus and article for generation of debugging information | |
US20070271553A1 (en) | Method and system for translating assembler code to a target language | |
US8276130B2 (en) | Method and compiler of compiling a program | |
US5960197A (en) | Compiler dispatch function for object-oriented C | |
US10614227B2 (en) | Method and system for identifying functional attributes that change the intended operation of a compiled binary extracted from a target system | |
CN114428603A (zh) | 一种基于编译器生成short和int类型指令的方法和系统 | |
CN115543294A (zh) | 一种Linux系统上动态链接库可视化依赖树的生成方法 | |
US20040243983A1 (en) | Method and computer program for converting an assembly language program for one processor to another | |
CN114237612A (zh) | 程序代码的编译方法、装置、电子设备及存储介质 | |
CN117827286B (zh) | Risc-v架构二进制转译文件复用方法、装置及存储介质 | |
CN116775127B (zh) | 一种基于RetroWrite框架的静态符号执行插桩方法 | |
CN117032719A (zh) | 针对TypeScript的静态编译方法及装置 | |
CN116360788A (zh) | 结构化文本编程语言的编译方法、编译器及电子设备 | |
CN114816435A (zh) | 一种基于逆向技术的软件开发方法 | |
US20080216099A1 (en) | System for Generating Optimized Computer Data Field Conversion Routines | |
CN114706586A (zh) | 代码编译、代码运行方法、装置、计算机设备及存储介质 | |
CN117785213B (zh) | 基于Rust开发的前端构建工具及构建方法 | |
Gazi | Modern C Programming: Including Standards C99, C11, C17, C23 | |
Wang | Enhancing Static Binary Analysis: Type Inference and Pointer Analysis for Executable Programs | |
Sampson | Translating CMS-2 to Ada | |
CN117270863A (zh) | 一种基于增量编译的Verilog语法分析方法 | |
JP5910197B2 (ja) | 組み込み用プログラム開発装置、コンパイル方法およびコンパイラプログラム |
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 |