CN1119756C - 用于进行静态初始化的方法和系统 - Google Patents

用于进行静态初始化的方法和系统 Download PDF

Info

Publication number
CN1119756C
CN1119756C CN99107735A CN99107735A CN1119756C CN 1119756 C CN1119756 C CN 1119756C CN 99107735 A CN99107735 A CN 99107735A CN 99107735 A CN99107735 A CN 99107735A CN 1119756 C CN1119756 C CN 1119756C
Authority
CN
China
Prior art keywords
array
code
clinit
static initialization
steps
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.)
Expired - Lifetime
Application number
CN99107735A
Other languages
English (en)
Other versions
CN1238500A (zh
Inventor
弗兰克·耶林
理查德·D·特克
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.)
Oracle America Inc
Original Assignee
Sun Microsystems Inc
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
Family has litigation
First worldwide family litigation filed litigation Critical https://patents.darts-ip.com/?family=22001182&utm_source=google_patent&utm_medium=platform_link&utm_campaign=public_patent_search&patent=CN1119756(C) "Global patent litigation dataset” by Darts-ip is licensed under a Creative Commons Attribution 4.0 International License.
Application filed by Sun Microsystems Inc filed Critical Sun Microsystems Inc
Publication of CN1238500A publication Critical patent/CN1238500A/zh
Application granted granted Critical
Publication of CN1119756C publication Critical patent/CN1119756C/zh
Anticipated expiration legal-status Critical
Expired - Lifetime legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/447Target code generation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/44Arrangements for executing specific programs
    • G06F9/445Program loading or initiating

Abstract

所公开的系统代表一种对常规的用于初始化静态数组的系统的改进,其中减少了由虚拟机静态初始化数组而执行的代码的数量。为实现这种减少,当统一类文件时,预加载程序识别所有的<clinit>方法并模拟执行这些方法,以便确定由其进行的静态初始化。然后,预加载程序产生一个表达,其表示由<clinit>方法进行的静态初始化,并把该表达存储在.mclass文件中,以便代替<clinit>方法。例如,含有许多指令的<clinit>方法的代码被一个命令虚拟机进行静态初始化的表达代替,从而节省大量的存储器。虚拟机被修改,以便识别这个表达,并对数组进行正确的初始化。

Description

用于进行静态初始化的方法和系统
本发明一般涉及数据处理系统,特别涉及用于进行静态初始化的方法和系统。
JavaTM描述用于产生和运行平台无关代码的编程语言和编程环境。这种平台无关代码在JavaTM虚拟机上运行,这是一种解释平台无关代码的抽象计算机。JavaTM虚拟机在Lindholm和Yellin的文章“The Java Virtual MachineSpecification”,Addison-Wesley(1997),中详细说明了,该文在在此引为参考。Java虚拟机不专门识别JavaTM编程语言或任何其它编程语言;相反。Java虚拟机只识别特定的文件格式,类文件格式。类文件包含构成平台无关代码的Java虚拟机指令(或字节代码)。
作为运行Java程序的一部分,开发人员经过若干步骤,如图1所示。首先,开发人员编制计算机程序(步102)。一般地说,开发人员已经用高级语言例如Java编程语言开发了包含源码的计算机程序,并调用JavaTM编译程序对代码进行编译。Java编译程序是可从加利弗尼亚州Mountain View市的SunMicrosystems公司得到的JavaTM软件开发包的一部分。Java编译程序输出一个或几个含有适合于在Java虚拟机上执行的字节代码的类文件。每个类文件含有一种Java编程语言,可以是一个类或一个接口。类文件格式在“The JavaVirtual Machine Specification”pp.83-137中详细说明了。虽然类文件格式是健壮的文件格式,但是其不能命令虚拟机有效地静态初始化一个数组,因而便提出了一个问题,详述如下。
在编译程序之后,开发者把在步102输出的类文件通过使用预加载程序(步104)统一成一个文件,叫做.mclass文件。预加载程序也从Sun Microsystems公司得到,其用于链接类文件并进行预处理以便于类文件的执行。在统一类文件之后,开发者将.mclass文件加载在虚拟机中(步106)。在本步中,Java虚拟机在存储器中存储.mclass文件,并通过读出字节代码并对其进行处理和执行来解释包含在.mclass文件中的字节代码。直到字节代码的解释被完成,.mclass文件才存储在存储器中。由Java虚拟机识别的字节代码在“The Java VirtualMachine Specification”pp.151-338中更清楚地说明了。
如上所述,类文件格式不能命令虚拟机静态地初始化数组。为了解决这个问题,JavaTM编译程序产生一个特定的方法,<clinit>,用于进行类初始化,包括静态数组的初始化。静态数组初始化的一个例子如下:
代码表#1
static int setup[]={1,2,3,4};在本例中,数组“setup”包括要被静态初始化为1,2,3,和4的4个整数。已知静态初始化,JavaTM编译程序便产生<clinit>方法,该方法在功能上按照下述的伪码进行静态初始化
代码表#2
                      temp=new int[4];
                      temp[0]=1;
                      temp[1]=2;
                      temp[2]=3;
                      temp[3]=4;
                      this.setup=temp;
如上述代码表所示,仅仅描述<clinit>方法在功能上便需要许多语句。不过,更重要的是,由字节代码进行的<clinit>方法的实际处理需要更多的语句。这些字节代码控制产生所需的静态初始化的堆栈。堆栈是由在Java编程环境下的方法使用的存储器的一部分。对于由上述的示例的静态初始化的<clinit>方法进行的步骤以字节代码表示如下:代码表#3
Method void<clinit>( )
0 iconst_4     //整数值4入栈
1 newarray int //建立新整数数组并入栈
3 dup          //复制栈顶
4 iconst_0     //整数值0入栈
5 iconst_1     //整数值1入栈
6 iastore      //数组下标0处存1
7 dup          //复制栈顶
8 iconst_1     //整数值1入栈
				
				<dp n="d2"/>
9 iconst_2      //整数值2入栈
10 iastore      //数组下标1处存2
11 dup          //复制栈顶
12 iconst_2     //整数值2入栈
13 iconst_3     //整数值3入栈
14 iastore      //数组下标2处存3
15 dup          //复制栈顶
16 iconst_3     //整数值3入栈
17 iconst_4     //整数值4入栈
18 iastore      //数组下标3处存4
19 putstatic #3<Field foobar.setup[I>

                //根据栈中新数组修改设定数组
22 return
虽然使用<clinit>方法为JavaTM编译程序提供一种方式命令虚拟机初始化一个静态数组,但是用于初始化数组所需代码的数量是数组大小的许多倍,因而需要大量的存储器。因此,需要改进静态初始化方法。
所公开的系统代表对常规的用于初始化静态数组的系统的一种改进。其中减少了由虚拟机为静态地初始化数组而执行的代码的数量。为实现这种减少,当统一类文件时,预加载程序识别所有的<clinit>方法,并模拟执行(“假装执行”)这些方法,以便确定由这些方法执行的静态初始化。然后,预加载程序产生一个表示由<clinit>方法进行的静态初始化的一个表达,并把该表达存储在.mclass文件中,用于代替<clinit>方法。这样,包含许多指令的<clinit>方法的代码被一个命令虚拟机进行静态初始化的表达所代替,因而节省大量存储器。虚拟机被修正,以便识别这一表达,并对数组进行合适的静态初始化。
本发明的方法在处理部件上接收要被运行的代码,以便进行操作。然后该代码在存储器上被模拟执行,而不在处理部件上运行该代码,以便识别该操作,看该代码是否已被处理元件执行。此后,对处理元件产生一个指令,以便执行这种操作。
本发明的一种数据处理系统包括辅助存储装置,存储器和处理器。辅助存储装置包括具有静态初始化数据结构和类文件的源码的程序,其中一个类文件含有静态初始化数据结构的<clinit>方法。存储器含有编译程序,用于对程序进行编译并产生类文件和用于统一类文件的预加载程序,用于模拟执行<clinit>方法,从而确定<clinit>方法进行的静态初始化,并产生用于执行静态初始化的指令。处理器运行编译程序和预加载程序。
图1是当在JavaTM环境下开发一个程序时执行的步骤。
图2是本发明的数据处理系统。
图3是由图2说明的预加载程序执行的步骤流程图。
本发明的系统和方法提供一种改进的系统,用于通过利用一个或几个指令代替代替<clinit>方法,在JavaTM编程环境下初始化静态数组,其中所述指令当被虚拟机读取时,除去使用数量少得多的存储器和少得多的时间之外,使虚拟机进行和利用<clinit>方法进行的相同的静态初始化。结果,这种系统和方法在静态初始化数组时,可以大大减少存储器的利用。
本发明的系统和方法通过在预加载程序中进行某种处理而消除了对<clinit>方法的需要。尤其是,预加载程序接收类文件,用于统一并扫描它们,寻找<clinit>方法。当预加载程序找到<clinit>方法时,便相对于存储器模拟执行(“假装执行”)<clinit>方法,以便确定如果由Java虚拟机解释则<clinit>方法对于存储器应当具有的影响。即,预加载程序模拟执行<clinit>方法,以便识别假如由JavaTM虚拟机执行<clinit>方法进行静态初始化而得到的结果。在识别这一静态初始化之后,预加载程序产生一个或几个指令(或指示),以便进行和<clinit>方法相同的初始化,并向Java虚拟机输出这些指令,因而代替<clinit>方法。然后,在运行时间,由Java虚拟机读出这些指令,使Java虚拟机进行和使用<clinit>方法时相同的静态初始化。所述指令需要的存储空间比<clinit>方法少得多。例如,在上述代码表#3描述的字节代码被减少为下面在.mclass文件内包含的指令,其指示4个整数的数组具有初始值1,2,3,和4:
CONSTANT_Array T_INT 41234
示例的实施例的虚拟机识别这一表达,并把数组静态初始化为合适的值。结果,示例的实施例在初始化静态数组时比常规的系统占用的存储器少。
图2说明构成本发明的数据处理系统200。数据处理系统200包括和因特网204相连的计算机系统202。计算机系统202包括存储器206,辅助存储器装置208,中央处理单元(CPU)210,输入装置212,和视频显示器214。存储器206进一步包括JavaTM编译程序218,JavaTM预加载程序220和JavaTM运行时系统221。 JavaTM运行时系统211包括JavaTM虚拟机222。辅助存储器装置208包括具有源码的程序224,不同的类文件226,以及.mclass文件228。JavaTM编译程序218把程序224编译成一个或几个类文件226。然后,预加载程序220接收类文件226,并产生代表所有这些类文件的统一化的.mclass文件228。在统一之后,.mclass文件228可在虚拟机222上运行。
本发明的处理由用于搜索<clinit>方法的预加载程序220进行,当找到时,则预加载程序(1)模拟<clinit>方法的执行,以便确定如果其由虚拟机222解释则其对存储器具有的影响,(2)产生静态初始化指令复现这些影响,以及(3)以.mclass文件输出这些指令来代替<clinit>方法,这样便节省大量的存储器。
此外,本发明的处理由虚拟机222进行,因为其被修改,以便识别预加载程序的静态初始化指令。虽然本发明的示例的实施例以被存储在存储器206中进行说明,但是本领域技术人员应当理解,它也可以存储在其它的计算机可读的介质上,例如辅助存储装置如硬盘、软盘或CD-ROM;从因特网204接收的载波;或RAM或ROM的其它形式。此外,本领域的技术人员应当理解,计算机202可以具有附加的或不同的元件。
图3说明由本发明的预加载程序220执行的用于完成静态数组的初始化的步骤的流程图。由预加载程序进行的第一步是读出类文件,以便获得<clinit>方法(步302)。在获得<clinit>方法之后,预加载程序分配在模拟执行期间使用的各个变量(步304)。当模拟执行时,如下所述,预加载程序由虚拟机模拟包含在<clinit>方法中的字节代码的执行。这些字节代码控制和<clinit>方法相关的各种数据结构,例如常量存储库,堆栈,或局部变量(或寄存器)。
常量存储库是一种可变长度结构的表,代表各种串常量、类名和其它属于类文件内的常量。堆栈是存储器的一部分,用于在方法的执行期间存储操作数。因而,堆栈尺寸是在执行该方法的任一时刻由操作数占据的空间的最大的数量。局部变量是由这种方法使用的变量。
当分配变量时,预加载程序获得<clinit>方法的常量存储库的指针,为堆栈分配一个合适的尺寸,并这样分配一个数组,使得数组的每个项相应于每个局部变量。如下所述,则模拟执行根据这些变量操作。
在分配变量之后,预加载程序读出来自<clinit>方法的字节代码(步306)。接着,预加载程序确定其是否识别该字节代码(步308)。在这一步,预加载程序识别所有字节代码的子集,该子集只含有一般用于进行数组的静态初始化的那些字节代码。下面是由一个示例的实施例的预加载程序识别的字节代码的表:
代码表#4
            acons_null      iastore

            iconst_ml       lastore

            iconst_0        fastore

            iconst_1        dastore

            iconst_2        aastore

            iconst_3        bastore

            iconst_4        lastore

            iconst_5        sastore

            lconst_0        dup

            lconst_1        newarray

            fconst_0        anewarray

            fconst_1        return

            fconst_2        ldc

            dconst_0        ldc_w

            dconst_1        ldc2_w

            bipush          putstatic

            sipush
任何和上述表中的字节代码不同的字节代码不被识别。除去上述字节代码之外其它字节代码的存在表明,<clinit>方法执行附加于静态初始化数组的功能。在这种情况下,<clinit>方法不可能被优化。如果字节代码不被识别,则预加载程序认为其对于优化(或模拟执行)是不合适的,并且处理继续到步316。
然而,如果预加载程序识别字节代码,预加载程序就进行由字节代码表示的操作(步310)。在这一步,预加载程序根据在步304分配的变量模拟执行字节代码,结果,一个值可以从堆栈中弹出,可以更新局部变量,或从常量存储库中检索一个值。此外预加载程序可以遇见一个“put static”字节代码,其表示以特定方式要被初始化的特定静态变量(例如数组)。如果预加载程序接收这个字节代码,便将请求初始化的表示存储在一个散列表中供以后使用。例如,在散列表中的一个项如下:
Setup:=Array(1,2,3,4)
在完成由字节代码表示的操作之后,预加载程序确定是否在<clinit>方法中具有更多的字节代码(步314)。如果有,处理返回步306。然而,如果没有更多的字节代码,预加载程序便在.mclass文件中存储命令,以便对数组进行静态初始化(步318)。在这一步,预加载程序在.mclass文件中存储常量存储库项如下:
    标记       类型      尺寸     值
CONSTANT-Array T-INT     4        1 2 3 4
这个在常量存储库中的项表示,一个特定的数组具有初始值为1,2,3,和4的4个整数。在运行时,当虚拟机初始化类.mclass文件时,它将遇到对于这常量存储库的一个引用,并产生合适的数组。结果,在<clinit>方法中包含的许多命令被减少为这一个表达,大大节省了存储器的数量和时间。
下面的伪码描述示例的实施例的预加载程序的采样处理。预加载程序接收限定<clinit>方法的方法信息数据结构作为参数,这在“JavaTM Virtual MachineSpecification”pp.104-106中描述了。应当注意,所述的处理只是一个例子,例如,只有少数的字节代码被描述为被预加载程序处理的。不过,本领域的技术人员应当理解,在代码表#4中的所有字节代码都可以利用示例的实施例进行处理。
代码表#5
void emulateByteCodes(Method_info mb)

  int numberRegisters=mb.max_locals();//局部变量数

  int stackSize=mb.max_stack();       //堆栈尺寸

  byte byteCode[]=mb.code();          //获得字节代码

  ConstantPool constantPool=mb.constantPool();//获得常量库

  Object stack[]=new Object[stackSize];//为假装执行建立堆栈

  Object registers[]=new Object[numberRegisters];//为假装执行建

                                                   立局部变量

  /*以空堆栈开始*/

  int stackTop=-1;                              //仅在有效单元之下

  /*静态目标图*/

  Hashtable changes=new Hashtable();
try{

        boolean success;

  execution_loop:

         for(int codeOffset=0,newCodeOffset;

                  ;codeOffset=newCodeOffset){

               int opcode=byteCode[codeOffset]&amp;OxFF;//0..255

               nextCodeOffset=codeOffset+1;//最普通值

               switch(opcode){

                  case opc_iconst_ml:  //-1入栈

                       stack[++stackTop]=new Integer(-1);

                       break;

                  case opc_bipush:

                        nextCodeOffset=codeOffset+2;

                       stack[++stackTop]=new Integer

                                          (byteCode
				
				<dp n="d8"/>
                  [codeOffset+1]);

  break;
cast opc_lload_3://加载整数3的内容

  stack[++stackTop]=(Long)register[3];

  stack[++stackTop]=null;//长期使用栈

                             中二字

  break;
cast opc_fsub:{       //从下项减去栈顶

  float b=stack[stackTop--].

           floatValue();

  float a=stack[stackTop].floatValue();

  stack[stackTop]=new Float(a-b);

  break;
}
case opc_ldc:

  nextCodeOffset=codeOffset+2;

  stack[++stackTop]=
             constantPool.getItem

             (byteCode(codeOffset+1));

  break;
case sastore:{//将内容存入“short”数组

  short value=(short)(stack[StackTop--].

               intValue());

  int index=stack[StackTop--].intValue();

  short[]array=(short[])stack[StackTop-

                -];

  array[index]=value;

  break;
}
case opc_putstatic:{
				
				<dp n="d9"/>
               nextCodeOffset=codeOffset+3;

               int index=((byteCode[codeOffset+1])&amp;

                          OxFF<<8)+(byteCode

                          [codeOffset+2]&amp;OxFF);

               Field f=constantPool.getItem(byteCode

                        [codeOffset+1]);

               if(f.getClass()!=mb.getClass()){

                  //只能修改自己类中的静量

                  throw new RuntimeException();

               }

               Type t=f.getType();

               if(t.isLong()||t.isDouble())

                 ++stackTop;

               Objet value=stack[++stackTop]

               Changes.put(f,value);//在数列表中加入

                                        表项

               break;

         case opc_return:

               success=true;

               break execution_loop;

        default://未能理解的某些字节代码

                success=false;

                break execution_loop;

         }

  }
}catch(RuntimeException){

   //任何运行时意外指示故障

   success=false;
}
if(success){

  <如“changes”数列表指示地修改。class文件>
				
				<dp n="d10"/>
            <从类中去除该<clinit>方法>

     }else{

            <某些内容不可理解>

            <不替换该方法>

  }
}
如上所述,Java虚拟机222,除去进行如下的修正之外,是一种标准的Java虚拟机,如同在“Java Virtual Machine Specification”中所定义的。常规的虚拟机识别各种常量存储库项,例如CONSTANT_Integer,CONSTANT_String,和CONSTANT_Long。这些类型的常量存储库项存储各种变量信息,包括初始值。然而,示例的虚拟机还识别常量存储库中的CONSTANT_Array项。
在类文件格式中的CONSTANT_Array常量存储库项的格式如下:
代码表#6
CONSTANT_Array_info{

  ul tag;     /*字面值CONSTANT_Array*/

  ul type;    /*如下所示*/

  u4 length;  /*数组元素个数*/

           un objects[length];/*实际值*/

                         /*仅在type=

                         T_CLASS时包括以下字段*/

           u2 type2;    /*常量库中CONSTANT_Class的下标*/
  }
u1类型字段是下表所列的值之一:
 数组类型  值
 T_CLASS  2
 T_BOOLEAN  4
 T_char  5
 T_FLOAT  6
 T_DOUBLE  7
 T_BYTE  8
 T_SHORT  9
 T_INI  10
 T_LONG  11
字段ux objects[length]是一个数值数组,提供数组的元素。数组中元素个数由常量库表项的长度字段给定。这些值的每个的实际大小如下:
类型  Ux 含义
T_BOOLEAN,T_BYTE  u1  1字节
T_char,T_SHORT,T_CLASS  u2  2字节
T_INT,T_FLOAT  u4  4字节
T_LONG,T_DOUBLE  u8  8字节
除去T_CLASS之外,对于以上的所有类型,所示的字节是被存储在数组元素中的实际值。不过,每个u2本身是一个常量存储库项的下标。所指的常量存储库项本身必须是CONSTANT_Array,CONSTANT_Object,或者是特殊的常量存储库项O,表示一个NULL值 。
例如,为了表示以下的数组:
    int[]={10,20,30,40};常量存储库项如下:
标记          类型          大小   初值CONSTANT_Array    T_TNT         4      10 20 30 40另一个例子表示下面的数组:
new Foo[3]  /*全部被初始化为NULL*/常量存储库项如下:
标记         类型      大小   初值    类CONSTANT_Array   T_CLASS   3      0 0 0    xx其中“xx”是常量存储库中的下标,表示常量存储库中的类F00。如下的二维数组:
new byte[][]={{1,2,3,4},{5,6,7,8}};通过使两个常量存储库项对子数组编码,并使两个附加项表示子数细之间的相关性而被编码。这编码相应于作为目标类型的数组和作为多个数组中的一个数组的多维数组的JavaTM概念。上述的二维数组的常量存储库项如下:Entry 1:CONSTANT_Array T_BYTE 4 1 2 3 4Entry 2:CONSTANT_Array T_BYTE 4 5 6 7 8Entry 3:CONSTANT_Class具有名字“[[B”并且
        标记     类型     大小     初值    类Entry4:CONSTANT_Array  T_CLASS  2 Entry1 Entry2 Entry3其中每个Entry1,Entry2,和Entry3是相应于常量存储库项的下标的两字节编码。
虽然根据最佳实施例说明了本发明的系统和方法,但是,本领域的技术人员应当理解,不脱离所附权利要求限定的本发明的范围和实质可以作出各种改变和改型。

Claims (17)

1一种数据处理系统中用于静态初始化数组的方法,包括以下步骤:
利用静态值编译包含该数组的源码,从而利用含有字节代码的clinit方法产生一个类文件,以便把数组静态初始化为静态值;
在预加载程序中接收类文件;
对于存储器模拟执行clinit方法的字节代码,以便由预加载程序识别数组的静态初始化;
在输出文件中存储需要静态初始化数组的指令;以及由虚拟机解释指令,从而进行数组的静态初始化。
2如权利要求1所述的方法,其中存储步骤包括以下步骤:
在常量存储库中存储常量存储库项。
3如权利要求1所述的方法,其中模拟执行步骤包括以下步骤:
分配堆栈;
从clinit方法中读出控制堆栈的字节代码;以及
对分配的堆栈执行堆栈控制。
4如权利要求1所述的方法,其中模拟执行步骤包括以下步骤:
分配变量;
从clinit方法中读出控制clinit方法的局部变量的字节代码;以及
根据分配的变量进行局部变量的控制。
5如权利要求1所述的方法,其中所述模拟执行步骤包括以下步骤:
获得clinit方法的常量存储库的一个基准;
从clinit方法中读出控制常量存储库的字节代码;以及
进行常量存储库的控制。
6一种用于数据处理系统中的方法,包括以下步骤:
接收要在处理元件上运行的代码,以便进行操作;
模拟执行不在处理元件上运行的代码,以便识别所述的代码是否曾被处理元件运行过的操作;以及
产生使所述处理元件进行所述操作的指令。
7如权利要求6所述的方法,其中所述的操作初始化一种数据结构,并且其中模拟执行步骤包括以下步骤:
模拟执行所述的码,以便识别数据结构的初始化。
8如权利要求6所述的方法,其中所述操作静态初始化一个数组,并且其中模拟执行步骤包括以下步骤:
模拟执行所述的代码,以便识别数组的静态初始化。
9如权利要求6所述的方法,还包括以下步骤:
在处理元件上运行产生的指令,以便完成所述操作。
10如权利要求6所述的方法,还包括以下步骤:
由虚拟机解释产生的指令,以便进行操作。
11如权利要求6所述的方法,其中所述的操作对存储器有影响,并且其中模拟执行步骤包括以下步骤:
模拟执行所述代码,以便识别对存储器的影响。
12一种数据处理系统包括:
存储装置,其包括:
    具有静态初始化一种数据结构的源码的程序;以及
    类文件,其中一种类文件含有静态初始化所述数据结构的clinit方法;
存储器,其包括:
    用于编译所述程序并产生类文件的编译程序;以及
    用于统一所述类文件的预加载程序,用于模拟执行clinit方法,以便确定clinit方法进行的静态初始化,并用于产生进行静态初始化的指令;以及
用于运行所述编译程序和预加载程序的处理器。
13如权利要求12所述的数据处理系统,其中预加载程序包括一种用于产生含有被产生的指令的输出文件的机制。
14如权利要求13所述的数据处理系统,其中存储器还包括虚拟机,用于解释产生的指令,以便进行静态初始化。
15如权利要求12所述的数据处理系统,其中所述的数据结构是数组。
16如权利要求12所述的数据处理系统,其中clinit方法具有静态初始化所述数据结构的字节代码。
17如权利要求12所述的数据处理系统,其中所述产生的指令包括在常量存储库中的一个项。
CN99107735A 1998-04-07 1999-04-07 用于进行静态初始化的方法和系统 Expired - Lifetime CN1119756C (zh)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US09/055,947 US6061520A (en) 1998-04-07 1998-04-07 Method and system for performing static initialization
US055,947 1998-04-07
US055947 1998-04-07

Publications (2)

Publication Number Publication Date
CN1238500A CN1238500A (zh) 1999-12-15
CN1119756C true CN1119756C (zh) 2003-08-27

Family

ID=22001182

Family Applications (1)

Application Number Title Priority Date Filing Date
CN99107735A Expired - Lifetime CN1119756C (zh) 1998-04-07 1999-04-07 用于进行静态初始化的方法和系统

Country Status (6)

Country Link
US (1) US6061520A (zh)
EP (1) EP0949566B1 (zh)
JP (1) JP4699580B2 (zh)
KR (1) KR100624248B1 (zh)
CN (1) CN1119756C (zh)
DE (1) DE69936953D1 (zh)

Families Citing this family (31)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2000514584A (ja) * 1996-10-25 2000-10-31 シュルンベルジェ システーム 高級プログラミング言語を用いたマイクロコントローラ
US6658492B1 (en) * 1998-03-20 2003-12-02 Sun Microsystems, Inc. System and method for reducing the footprint of preloaded classes
GB2343021A (en) * 1998-10-19 2000-04-26 Ibm Class loading model for object oriented programming
DE60142136D1 (de) * 2000-02-21 2010-07-01 Panasonic Corp Linken von Java class files für eingebettete Geräte
US6813762B1 (en) * 2000-02-22 2004-11-02 Freescale Semiconductor, Inc. Method for processing program files in a programming language capable of dynamic loading
US6760019B1 (en) 2000-06-01 2004-07-06 Sun Microsystems, Inc. Methods and apparatus for facilitating the sharing of computer graphics operations
US6915508B2 (en) * 2000-06-12 2005-07-05 Sun Microsystems, Inc. Method and apparatus for eliminating C recursion from a Java™ bytecode interpreter
US6978448B1 (en) * 2000-06-12 2005-12-20 Sun Microsystems, Inc. Method and apparatus for rewriting bytecodes to minimize runtime checks
US6832369B1 (en) * 2000-08-01 2004-12-14 International Business Machines Corporation Object oriented method and apparatus for class variable initialization
US7080373B2 (en) * 2001-03-07 2006-07-18 Freescale Semiconductor, Inc. Method and device for creating and using pre-internalized program files
ATE481677T1 (de) * 2001-05-30 2010-10-15 Research In Motion Ltd System zur verarbeitung einer anwendung für ein mobiles kommunikationsgerät
US7197750B2 (en) * 2001-06-28 2007-03-27 Sun Microsystems, Inc. Java Bytecode instruction for determining hashcode values
GB0125176D0 (en) * 2001-10-19 2001-12-12 Koninkl Philips Electronics Nv A method of compiling bytecode to native code
US7450631B2 (en) * 2001-10-26 2008-11-11 Intel Corporation Metric correction for multi user detection, for long codes DS-CDMA
US7272827B2 (en) * 2002-04-03 2007-09-18 International Business Machines Corporation Statically detecting externally referenced interfaces of a program
US7051323B2 (en) * 2002-10-08 2006-05-23 Sun Microsystems, Inc. Method and apparatus for initializing romized system classes at virtual machine build time
KR100493893B1 (ko) * 2003-02-07 2005-06-10 삼성전자주식회사 자바 프로그램에서 클래스 로딩 과정을 단축시키는 시스템및 방법
CA2434280A1 (en) * 2003-07-03 2005-01-03 Zhong L. Wang Method and apparatus to guarantee type and initialization safety in multihreaded programs
KR100697635B1 (ko) * 2003-12-19 2007-03-20 한국전자통신연구원 자바가상머신에서 배열 접근을 위한 통합 바이트 코드를 기록한 기록매체, 통합 바이트 코드 수행방법 및 매핑 방법
KR100654428B1 (ko) * 2004-01-14 2006-12-06 삼성전자주식회사 자바 프로그램의 처리 속도를 향상시키는 시스템 및 그 방법
US20090070752A1 (en) * 2007-09-06 2009-03-12 International Business Machines Corporation Method and system for optimization of an application
JP2009181558A (ja) * 2008-02-01 2009-08-13 Panasonic Corp プログラム変換装置
US8316357B2 (en) * 2008-09-03 2012-11-20 Microsoft Corporation Type descriptor management for frozen objects
US8769518B1 (en) 2010-06-29 2014-07-01 Ca, Inc. Ensuring determinism during programmatic replay in a virtual machine
CA2759516C (en) 2011-11-24 2019-12-31 Ibm Canada Limited - Ibm Canada Limitee Serialization of pre-initialized objects
US8813018B1 (en) 2012-10-05 2014-08-19 Altera Corporation Method and apparatus for automatically configuring memory size
US10540148B2 (en) * 2014-06-12 2020-01-21 Oracle International Corporation Complex constants
US10503525B2 (en) 2017-08-22 2019-12-10 Refinitiv Us Organization Llc Apparatuses, methods and systems for persisting values in a computing environment
CN110297666B (zh) * 2019-06-21 2022-06-17 百度在线网络技术(北京)有限公司 热修复方法、装置、系统及存储介质
CN111400736B (zh) * 2020-03-17 2022-07-22 同盾(广州)科技有限公司 应用程序加密的方法、装置、存储介质及电子设备
US11809839B2 (en) 2022-01-18 2023-11-07 Robert Lyden Computer language and code for application development and electronic and optical communication

Family Cites Families (14)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5421016A (en) * 1991-12-12 1995-05-30 International Business Machines Corporation System and method for dynamically invoking object methods from an application designed for static method invocation
US5361350A (en) * 1991-12-12 1994-11-01 International Business Machines Corporation Object oriented method management system and software for managing class method names in a computer system
US5367685A (en) * 1992-12-22 1994-11-22 Firstperson, Inc. Method and apparatus for resolving data references in generated code
US5437025A (en) * 1993-01-26 1995-07-25 International Business Machines Corporation System and method for run time configuration of objects in an object oriented computing environment
US5615400A (en) * 1993-06-30 1997-03-25 Apple Computer, Inc. System for object oriented dynamic linking based upon a catalog of registered function set or class identifiers
JPH0773044A (ja) * 1993-09-02 1995-03-17 Mitsubishi Electric Corp 最適化コンパイル方法及び最適化コンパイル装置
US5668999A (en) * 1994-12-20 1997-09-16 Sun Microsystems, Inc. System and method for pre-verification of stack usage in bytecode program loops
US5812828A (en) * 1995-06-01 1998-09-22 Centerline Software, Inc. Function simulation
US5794044A (en) * 1995-12-08 1998-08-11 Sun Microsystems, Inc. System and method for runtime optimization of private variable function calls in a secure interpreter
US5815718A (en) * 1996-05-30 1998-09-29 Sun Microsystems, Inc. Method and system for loading classes in read-only memory
US6003038A (en) * 1997-03-31 1999-12-14 Sun Microsystems, Inc. Object-oriented processor architecture and operating method
US5903899A (en) * 1997-04-23 1999-05-11 Sun Microsystems, Inc. System and method for assisting exact Garbage collection by segregating the contents of a stack into sub stacks
US5966702A (en) * 1997-10-31 1999-10-12 Sun Microsystems, Inc. Method and apparatus for pre-processing and packaging class files
US5999732A (en) * 1998-03-23 1999-12-07 Sun Microsystems, Inc. Techniques for reducing the cost of dynamic class initialization checks in compiled code

Also Published As

Publication number Publication date
EP0949566A3 (en) 2003-12-10
KR100624248B1 (ko) 2006-09-13
US6061520A (en) 2000-05-09
CN1238500A (zh) 1999-12-15
EP0949566A2 (en) 1999-10-13
KR19990083019A (ko) 1999-11-25
JP2000035893A (ja) 2000-02-02
DE69936953D1 (de) 2007-10-11
JP4699580B2 (ja) 2011-06-15
EP0949566B1 (en) 2007-08-29

Similar Documents

Publication Publication Date Title
CN1119756C (zh) 用于进行静态初始化的方法和系统
US6286134B1 (en) Instruction selection in a multi-platform environment
US6799173B2 (en) Method and apparatus for sharing code containing references to non-shared objects
May Mimic: a fast system/370 simulator
CN1134731C (zh) 在计算机系统中编译指令的方法
US6240547B1 (en) Method and apparatus for dynamically deoptimizing compiled activations
US7103881B2 (en) Virtual machine to provide compiled code to processing elements embodied on a processor device
US6363522B1 (en) Method and apparatus for handling exceptions as normal control flow
US6701520B1 (en) Preventing garbage collection of objects in object oriented computer programming languages
US20050226406A1 (en) Efficient linking and loading for late binding and platform retargeting
JPH113269A (ja) スタックの内容をサブスタックに分離することによる正確なガーベイジ・コレクションを補助するシステムと方法
US7665075B1 (en) Methods for sharing of dynamically compiled code across class loaders by making the compiled code loader reentrant
CN106033370B (zh) 64位Java虚拟机的实现方法及装置
US7020874B2 (en) Techniques for loading class files into virtual machines
Aslam et al. Introducing TakaTuka: a Java virtualmachine for motes
US6959430B2 (en) Specialized heaps for creation of objects in object-oriented environments
US20030079210A1 (en) Integrated register allocator in a compiler
Jones et al. Annotating Java class files with virtual registers for performance
CN1287280C (zh) 用于在运行时提高函数的执行性能的方法和计算系统
EP1481320B1 (en) Two tier clusters for representation of objects in java programming environments
US7194736B2 (en) Dynamic division optimization for a just-in-time compiler
US7181724B2 (en) Representation of Java® data types in virtual machines
US6934726B2 (en) Storing and retrieving of field descriptors in Java computing environments
WO2002091173A2 (en) Frameworks for efficient representation of string objects in java programming environments
US7082597B2 (en) Representation of objects in a Java programming environment

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant
C56 Change in the name or address of the patentee

Owner name: ORACLE AMERICA CO., LTD.

Free format text: FORMER NAME: SUN MICROSYSTEMS, INC.

CP01 Change in the name or title of a patent holder

Address after: American California

Patentee after: Oracle America Co., Ltd.

Address before: American California

Patentee before: Sun Microsystems, Inc.

CX01 Expiry of patent term

Granted publication date: 20030827

CX01 Expiry of patent term