编译装置、编译方法、通信终端设备、编译程序以及程序产品 【技术领域】
本发明涉及一种执行编译的编译装置、具有此编译装置的通信终端设备、执行编译地编译方法、涉及上述编译的编译程序、以及基于此编译程序的程序产品,是将称作高级程序语言的编译程序语言、例如,由C语言、C++语言、Java(R)语言、FORTAN以及COBOL等以往的编译程序语言、或者APL、PL/1、ADA、Smalltalk、Lisp、汇编程序语言以及其他的所有程序语言所记述的源程序转换成某种机器语言、例如CPU(中央计算处理装置,其包括MPU(微计算处理装置))可以直接执行的机器语言,以及作为机器语言转换过程的某种中间语言的目标程序。另外,上述Java(R)是美国Sun Microsystems公司的注册商标。本说明书中的符号(R)表示注册商标。
背景技术
作为以往的部分编译程序,有如日本专利公报平成6-202875号(专利文献1)中所述。专利文献1所记载的以往的部分编译程序,其目的在于可以决定每次读取函数时是否需要内嵌展开(inline expansion),以进行符合执行图像的内嵌展开,从而实现实用且有效的内嵌展开。因此,在上述的以往技术中,控制流程加权单元,根据控制流程解析单元的解析结果来推测构成控制流程的各部分控制流程的执行次数,并根据其执行次数来对各部分控制流程进行加权。而且,目标形成单元通过参照控制流程加权单元的加权结果,来决定各次函数读取时所读取的函数是否需要内嵌展开,从而形成反映该决定的目标程序。
专利文献1所述的以往的部分编译程序,在为了决定编译部分而推算执行次数的时候,如果在从其他程序中被读取的程序中被执行的子程序具有循环的多重嵌套结构时,则可以根据此循环的嵌套的多重性、即循环深度,来推算执行次数。然而,如果在读取原程序里被执行的子程序也有循环的多重嵌套结构时,此部分编译程序却不考虑读取原程序里的循环的嵌套的多重性、即循环深度。
因此,专利文献1所述的以往的部分编译程序所存在的问题在于,不能同时考虑在读取原程序中执行的循环深度和在被读取程序中执行的循环深度,而优先对总的执行次数较多的部分进行编译。其结果,这种以往技术存在无法提高程序的执行速度和节省用来存储程序的存储器的存储容量而使其达到最佳程度的问题。
进而,专利文献1所述的以往的部分编译程序还存在一个问题,例如,尽管存在有2重嵌套结构的循环,但在各循环的返回地点有相同的地址、并且没有标注不同的标记(即表示地址的符号·记号)时,也无法判断返回地点是从单一循环的中途返回还是从最后返回、或是2重嵌套结构的循环的返回的地点。因此,该以往技术存在不能准确地推算出循环的次数或者执行次数的问题。也就是说,在这一点上,该以往技术存在,无法以较高的准确度选择出执行次数较多的部分,而优先对其进行编译,从而不能实现提高执行速度和节省使用存储领域使其达到最佳程度的问题。
【发明内容】
本发明为了解决上述的问题,其目的在于提供一种编译装置、编译方法、通信终端设备、编译程序以及程序产品,可以较高的准确度选择出源程序中的执行次数较多的部分、或者执行次数较多的可能性较高的部分,而优先对其进行编译,从而,可以实现以较高的精度度来提高程序的执行速度和节省用来存储程序的存储器的存储容量,使其达到最佳程度。
本发明的编译装置,可以将源程序转换成目标程序,其包括:用来检测包含在所述源程序中的多重嵌套结构的多重嵌套结构检测单元、用来检测构成所述多重嵌套结构的各单位循环的返回地点的地址的返回地点的地址检测单元、用来判断在所述返回地点的地址检测程序检测出的多个返回地点的地址中,是否有相互间地址相同的重复返回地点的地址的地址重复判定单元、在所述地址重复判定程序判断出有所述重复返回地点的地址时,将所述源程序转换到所述重复返回地址为互不相同的地址的目标程序来作为所述目标程序的分割单元。
根据该编译装置,由于在构成所述多重嵌套结构的各单位循环的返回地址中有重复的返回地址时,分割单元将重复的返回地址变成相互不同的返回地址,所以,可以准确地计算出循环深度。由此,则可以准确地选择出执行次数较多的可能性较高的循环深度较大的部分而优先进行编译。
上述编译装置,还可以将多个源程序转换成目标程序,其包括:用来检索包含在所述多个源程序的其中之一的源程序里的、具有多重或单一嵌套结构的第1循环的第1循环检测单元、在所述第1循环检测单元每次检测所述第1循环时,就从所述多个源程序中检索包含在从所述第1循环中读取的其它源程序中且具有多重或单一嵌套结构的第2循环,同时在检测出所述第2循环时,通过将所述第1循环检测单元作为检测所述第1循环的检测单元而重复所述第2循环的检索,来检索所述的一个源程序与从该源程序开始依次读取的各源程序之间所构成的多重嵌套结构的第2循环检测单元、将所述第1循环检测单元每次检测出所述第1循环时所述第1循环的嵌套数、或者在所述第2循环检测单元检测出第2循环时从所述第1循环至个第2循环的循环依次累加所得到的嵌套总数作为循环深度予以计算的循环深度评价单元、通过对所述多个源程序中的循环深度较大的循环优先进行编译,而将所述多个源程序转换成所述目标程序的部分编译单元。
根据上述编译装置,不仅可计算被包含在一个源程序中的循环的嵌套数,还可计算包括以该循环为起点而依次读取的源程序中所包含的循环的嵌套数在内的总嵌套数,从而优先对总的嵌套数较大的循环进行编译。也就是说,包括在从一个源程序中依次读取的作为读取原程序的各源程序之间所构成的多重嵌套结构在内,对总的嵌套数较大的循环优先进行编译。因此,可以选择出源程序中执行次数较多的可能性较高的部分来进行编译。
在上述编译装置中,所述部分编译单元,在所述循环深度评价单元计算出来的循环深度不超过预先规定的阈值时,不对所述多个源程序的任何部分进行编译。
根据上述编译装置,由于在循环深度评价单元计算出来的循环深度不超过预先规定的阈值时,不对多个源程序的任何部分进行编译,所以,可以避免对提高执行速度有较小贡献的部分进行徒劳无益的编译而浪费存储领域的使用。
上述编译装置,还包括在所述循环深度评价单元计算出多个循环深度时,判断所述多个循环深度是否均等的均等度评价单元,所述部分编译单元在所述均等度评价单元判断出所述多个循环深度为均等时,不对所述多个源程序的任何部分进行编译。
根据上述编译装置,由于在多个循环深度为均等时,不对多个源程序的任何部分进行编译,所以,可以避免过多地对提高执行速度有相同程度贡献的部分进行编译而影响存储领域的有效利用。
本发明的通信终端设备,其中包括:上述编译装置中的其中之任何一项、通过传输媒体而获得所述编译装置应该进行编译的源程序的通信单元、执行所述编译装置形成的目标程序的执行控制单元。
根据上述通信终端设备,由于通信终端设备具有通信单元,所以,可以通过传输媒体而获得源程序,从而可以通过编译装置对其进行编译。而且,又由于通信终端设备具有执行控制单元,所以,可以执行经过编译的目标程序。换言之,通过此编译装置,可以执行通过传输媒体而获得的源程序。并且,由于通信终端设备具有本发明的编译装置,所以可以较高的精度来提高程序的执行速度和节省存储领域,从而达到最佳程度。
在上述通信终端设备中,所述执行控制单元,将作为所述编译装置的处理对象且其中的任意部分没有进行编译的源程序的非编译程序也作为执行对象,所述执行控制单元还包括:在非编译程序的执行过程中,从该目标程序中检测以超过规定标准值的频率而予以执行的高频率执行部分的频率检测单元、对所述频率检测单元检测出的所述高频率执行部分进行编译的另外的部分编译单元。
根据上述通信终端设备,在非编译程序的执行过程中,由频率检测单元检测出的高频率执行部分,通过部分编译单元而进行编译。换言之,非编译程序通过JIT而进行编译。因此,从提高执行速度和节省存储领域,使其达到最佳程度的观点来看,编译装置在不适合于进行预先编译的情况下,可以取而代之,通过JIT来达到最佳程度。
本发明的编译方法,是使计算机将源程序转换成目标程序的编译方法,其中包括:用来检测包含在所述源程序中的多重嵌套结构的多重嵌套结构检测步骤、用来检测构成所述多重嵌套结构的各单位循环的返回地点的地址的返回地点的地址检测步骤、用来判断在所述返回地点的地址检测程序检测出的多个返回地点的地址中,是否有相互间地址相同的重复返回地点的地址的地址重复判定步骤、在所述地址重复判定步骤中判断出有所述重复返回地点的地址时,将所述源程序转换到所述重复返回地址为互不相同的地址的目标程序来作为所述目标程序的分割步骤。
根据上述编译方法,由于在构成所述多重嵌套结构的各单位循环的返回地点的地址中有重复的返回地点的地址时,通过分割步骤将重复的返回地点的地址成为相互不同的返回地址,所以可准确地计算出循环深度。由此,则可以准确地选择出执行次数较多的可能性较高的、循环深度较大的部分而优先进行编译。
在上述编译方法中,所述分割步骤还包括一个指令追加步骤,通过在所述重复返回地点的地址的任何地址上,追加一个不影响步骤执行的无用指令,从而使所述重复返回地点的地址成为互不相同的地址。
采用上述编译方法,由于分割步骤通过追加一个无用指令而使所述重复返回地点的地址成为互不相同的地址,所以即不影响步骤的执行,又能准确地计算出循环深度。
本发明的编译方法可将第1和第2源程序转换成目标程序,其包括用来检测被包含在所述第1源程序中具有多重或单一嵌套结构的第1循环的第1循环检测步骤、用来检测从所述第1循环中被读取的所述第2源程序中所包含的具有多重或单一嵌套结构的第2循环的第2循环检测步骤、将所述第1循环的嵌套数和所述第2循环的嵌套数加在一起来计算总嵌套数循环深度评价步骤、通过对所述总嵌套数较大的第2循环优先进行编译,而将所述第1和第2源程序转换成所述目标程序的部分编译步骤。
根据上述编译方法,不仅可计算包含在某一个源程序中的第1循环的嵌套数,还可计算包括从该循环中读取的其它源程序中所包含的第2循环的嵌套数在内的总嵌套数,从而优先对总嵌套数较大的第2循环进行编译。也就是说,同时考虑在读取原程序中执行的循环深度以及在读取程序中执行的循环深度,优先对执行次数较多的可能性较高、总的嵌套数较多的循环进行编译。
本发明的一种编译方法可将多个源程序转换成目标程序,其包括用来检索被包含在所述多个源程序中的一个源程序中的具有多重或单一嵌套结构的第1循环的第1循环检测步骤、在所述第1循环检测步骤中检测出第1循环时,在所述多个源程序中、检索从所述第1循环中被读取的其它源程序中所包含的具有多重或单一嵌套结构的第2循环的第2循环检测步骤、在所述第2循环检测步骤中检测出第2循环时,将所述第1循环检测单元作为所述第1循环的检测单元,再次执行所述第2循环检测步骤的第1反复步骤、在检测不出所述第1循环和所述第2循环中的任何之一时,将此前所检测出来的循环的嵌套总数作为循环深度予以计算的循环深度评价步骤、反复执行从所述第1循环检测步骤到所述循环深度评价步骤的步骤,直到检测不出所述第1循环时为止的第2反复步骤、通过优先对所述多个源程序中的循环深度较大的循环进行编译,从而将所述多个源程序转换成所述目标程序的部分编译步骤。
根据上述编译方法,不仅可计算被包含在某一个源程序中的循环的嵌套数,还可计算包括以该循环为起点而依次读取的源程序中所包含的循环的嵌套数在内的总嵌套数,从而优先对总的嵌套数较大的循环进行编译。也就是说,包括在从一个源程序中依次读取的作为读取原程序的各源程序之间所构成的多重嵌套结构在内,对总的嵌套数较大的循环优先进行编译。因此,可以较为准确地选择出源程序中执行次数较多的可能性较高的部分来进行编译。
在上述编译方法中,所述部分编译步骤在所述循环深度评价步骤中计算出来的循环深度的数值不超过预先规定的阈值时,不对所述多个源程序的任何部分进行编译。
根据上述编译方法,由于在循环深度不超过阈值时,不对多个源程序的任何部分进行编译,所以,可以避免对提高执行速度有较小贡献的部分进行徒劳无益的编译而浪费存储领域的使用。
上述编译方法还让计算机执行均等度评价步骤,在所述循环深度评价步骤中计算出多个循环深度时,判断所述多个循环深度是否均等,并且所述部分编译步骤在所述均等度评价步骤中判断出所述多个循环深度均等时,不对所述多个源程序的任何部分进行编译。
根据上述编译方法,由于在多个循环深度为均等时,不对多个源程序的任何部分进行编译,所以,可以避免过多地对提高执行速度有相同程度贡献的部分进行编译而影响存储领域的有效利用。
本发明的一种编译方法可将第1和第2源程序转换成目标程序,其包括用来检测包含在所述第1源程序中被反复执行的部分的第1反复执行部的第1反复执行部检测步骤、用来检测包含在从所述第1反复执行部中被读取的所述第2源程序中被反复执行的部分的第2反复执行部的第2反复执行部检测步骤、将所述第1反复执行部的执行次数和所述第2反复执行部的执行次数加在一起,来计算总的执行次数的总执行次数评价步骤、通过优先对所述总执行次数较多的第2反复执行部进行编译,将所述第1和第2源程序转换成所述目标程序的部分编译步骤。
根据上述编译方法,不仅可计算包含在某一个源程序中的第1反复执行部的执行次数,还可计算包括从该循环中读取的其它源程序中所包含的第2反复执行部的执行次数的总的执行次数,从而优先对总执行次数较多的第2反复执行部进行编译。也就是说,同时考虑在读取原程序中执行的反复执行部的执行次数以及在读取程序中执行的反复执行部的执行次数,优先对总的执行次数较多的反复执行部进行编译。
本发明的一种编译方法可将多个源程序转换成目标程序,其包括用来检索包含在所述多个源程序中的一个程序里的被反复执行的部分的第1反复执行部的第1反复执行部检测步骤、在所述第1反复执行部检测步骤中检测出第1反复执行部时,从所述多个源程序中检索包含在从所述第1反复执行部中读取的其它源程序中且被反复执行的部分的第2反复执行部的第2反复执行部检测步骤、在所述第2反复执行部检测步骤检测出第2反复执行部时,将检测所述第1反复执行部的检测单元作为检测所述第1反复执行部的检测单元,再次执行所述第2反复执行部检测步骤的第1反复步骤、在检测不出所述第1反复执行部和所述第2反复执行部中的任何之一时,则计算在其之前检测出来的反复执行部的执行次数总和,即总执行次数的总执行次数评价步骤、反复执行从所述第1反复执行部检测步骤到所述总执行次数评价步骤的步骤,直到检测不出所述第1反复执行部时为止的第2反复步骤、通过优先对所述多个源程序中的总执行次数较多的反复执行部进行编译,从而将所述多个源程序转换成所述目标程序的部分编译步骤。
根据上述编译方法,不仅可计算被包含在某一个源程序中的反复执行部的执行次数,还可计算包括以该反复执行部为起点而依次读取的源程序中所包含的反复执行部的执行次数在内的总的执行次数,从而优先对总的执行次数较多的反复执行部进行编译。也就是说,包括在从某一个源程序中依次读取的作为读取原程序的各源程序之间所构成的反复执行的多重结构在内,对总的执行次数较多的反复执行部优先进行编译。因此,可以选择出源程序中执行次数较多的部分来进行编译。
在上述编译方法中,所述部分编译步骤,在所述总执行次数评价步骤中计算出来的总执行次数不超过预先规定的阈值时,不对所述多个源程序中的任何部分进行编译。
根据上述编译程序,由于在总执行次数不超过预先规定的阈值时,不对多个源程序的任何部分进行编译,所以,可以避免对提高执行速度有较小贡献的部分进行徒劳无益的编译而浪费存储领域的使用。
上述编译方法还让计算机执行均等度评价步骤,在所述总执行次数评价步骤计算出多个总执行次数时,判断所述多个总执行次数是否均等,并且所述部分编译步骤,在所述均等度评价步骤中判断出所述多个总执行次数均等时,不对所述多个源程序中的任何部分进行编译。
根据上述编译方法,由于在多个总执行次数为均等时,不对多个源程序的任何部分进行编译,所以,可以避免过多地对提高执行速度有相同程度贡献的部分进行编译而影响存储领域的有效利用。
本发明的一种编译方法可将第1和第2源程序转换成目标程序,其包括检索从包含在所述第1源程序中具有多重或单一嵌套结构的循环或非循环的第1处理部分中被读取的所述第2源程序中所包含的具有多重或单一嵌套结构的循环或非循环,即第2处理部分的第1读取检测步骤、在所述第1读取检测步骤中检测出所述第2处理部分时,检索包含从所述第2处理部分中被读取的所述第1源程序中的所述第1处理部分的第3处理部分的第2读取检测步骤、在所述第2读取检测步骤中检测出所述第3处理部分时,通过对所述第1和第2源程序中的所述第2处理部分和所述第3处理部分进行编译,从而将所述第1和第2源程序转换成所述目标程序的部分编译步骤。
根据上述编译方法,第1和第2读取检测步骤可检测出存在于第1和第2源程序之间的重新进入结构,而部分编译步骤则对检测出来的重新进入结构进行编译。也就是说,选择出源程序中执行次数较多的可能性较高的重新进入结构来进行编译。
本发明的一种编译方法可将源程序转换成目标程序,其包括用来检测包含在所述源程序中的多重嵌套结构的多重嵌套结构检测步骤、用来检测构成所述多重嵌套结构的各单位循环的返回地点的地址的返回地点的地址检测步骤、检测在所述返回地点的地址检测步骤中检测出来的多个返回地点的地址中,是否有含有不影响程序执行的无用指令的返回地点的地址的无用指令检测步骤、在所述无用指令检测步骤中检测出含有无用指令的返回地点的地址时,将所述源程序转换成删除了无用指令的目标程序来作为作为所述目标程序的无用指令删除步骤。
根据上述编译方法,由于在构成多重嵌套结构的各单位循环的返回地点的地址中有无用指令时,通过无用指令删除步骤可删除此无用指令,所以,可以避免因无用指令而导致的步骤执行速度的减慢。也就是,通过将可以实现正确地选择出执行次数较多的可能性较高的循环深度较大的部分而优先进行编译的无用指令,在编译之后予以删除,从而可以在节省存储领域的同时也进一步提高执行速度。
本发明所提供的一种编译程序,可以将源程序转换成目标程序,让计算机执行:用来检测包含在所述源程序中的多重嵌套结构的多重嵌套结构检测步骤、用来检测构成所述多重嵌套结构的各单位循环的返回地点的地址的返回地点的地址检测步骤、用来判断在所述返回地点的地址检测步骤中检测出的多个返回地点的地址中,是否有相互间地址相同的重复返回地点的地址的地址重复判定步骤、如果所述地址重复判定步骤中判断出有所述重复返回地点的地址,将所述源程序转换到所述重复返回地址为互不相同的地址的目标程序来作为所述目标程序的分割步骤。
根据上述编译程序,可以准确地选择出源程序中的执行次数较多的部分、或者执行次数较多的可能性较高的部分,而优先对其进行编译。因此,可以实现以较高的精度来提高程序的执行速度和节省用来存储程序的存储器的存储容量,使其达到最佳程度。
在上述编译程序中,所述分割步骤还包括一个指令追加步骤,通过在所述重复返回地点的地址的任何地址上,追加一个不影响程序执行的无用指令,而使所述重复返回地址成为互不相同的地址。
根据上述编译程序,由于分割步骤通过追加一个无用指令而使所述重复返回地点的地址成为互不相同的地址,所以即不影响步骤的执行,又能准确地计算出循环深度。
上述编译程序,还可以将第1和第2源程序转换成目标程序,其让计算机执行:用来检测被包含在所述第1源程序中具有多重或单一嵌套结构的第1循环的第1循环检测步骤、用来检测从所述第1循环中被读取的所述第2源程序中所包含的具有多重或单一嵌套结构的第2循环的第2循环检测步骤、将所述第1循环的嵌套数和所述第2循环的嵌套数加在一起来计算总嵌套数循环深度评价步骤、通过对所述总嵌套数较大的第2循环优先进行编译,而将所述第1和第2源程序转换成所述目标程序的部分编译步骤。
上述编译程序,还可以将多个源程序转换成目标程序,其让计算机执行:用来检索被包含在所述多个源程序中的一个源程序中的具有多重或单一嵌套结构的第1循环的第1循环检测步骤、在所述第1循环检测步骤中检测出第1循环时,在所述多个源程序中、检索从所述第1循环中被读取的其它源程序中所包含的具有多重或单一嵌套结构的第2循环的第2循环检测步骤、在所述第2循环检测步骤中检测出第2循环时,将所述第1循环检测单元作为所述第1循环的检测单元,再次执行所述第2循环检测步骤的第1反复步骤、在检测不出所述第1循环和所述第2循环中的任何之一时,将此前所检测出来的循环的嵌套总数作为循环深度予以计算的循环深度评价步骤、反复执行从所述第1循环检测步骤到所述循环深度评价步骤的步骤,直到检测不出所述第1循环时为止的第2反复步骤、通过优先对所述多个源程序中的循环深度较大的循环进行编译,从而将所述多个源程序转换成所述目标程序的部分编译步骤。
在上述编译程序中,所述部分编译步骤在所述循环深度评价步骤中计算出来的循环深度的数值不超过预先规定的阈值时,不对所述多个源程序的任何部分进行编译。
上述编译程序还让计算机在所述循环深度评价步骤中计算出多个循环深度时,执行判断所述多个循环深度是否均等的均等度评价步骤,并且所述部分编译步骤在所述均等度评价步骤中判断出所述多个循环深度为均等时,不对所述多个源程序的任何部分进行编译。
上述将第1和第2源程序转换成目标程序的编译程序,还可以让计算机执行:用来检测包含在所述第1源程序中被反复执行的部分的第1反复执行部的第1反复执行部检测步骤、用来检测包含在从所述第1反复执行部中被读取的所述第2源程序中被反复执行的部分的第2反复执行部的第2反复执行部检测步骤、将所述第1反复执行部的执行次数和所述第2反复执行部的执行次数加在一起,来计算总的执行次数的总执行次数评价步骤、通过优先对所述总执行次数较多的第2反复执行部进行编译,将所述第1和第2源程序转换成所述目标程序的部分编译步骤。
本发明的将多个源程序转换成目标程序的编译程序,可以让计算机执行:用来检索包含在所述多个源程序中的一个程序里的被反复执行的部分的第1反复执行部的第1反复执行部检测步骤、在所述第1反复执行部检测步骤中检测出第1反复执行部时,从所述多个源程序中检索包含在从所述第1反复执行部中读取的其它源程序中且被反复执行的部分的第2反复执行部的第2反复执行部检测步骤、在所述第2反复执行部检测步骤检测出第2反复执行部时,将检测所述第1反复执行部的检测单元作为检测所述第1反复执行部的检测单元,再次执行所述第2反复执行部检测步骤的第1反复步骤、在检测不出所述第1反复执行部和所述第2反复执行部中的任何之一时,则计算在其之前检测出来的反复执行部的执行次数总和,即总执行次数的总执行次数评价步骤、反复执行从所述第1反复执行部检测步骤到所述总执行次数评价步骤的步骤,直到检测不出所述第1反复执行部时为止的第2反复步骤、通过优先对所述多个源程序中的总执行次数较多的反复执行部进行编译,从而将所述多个源程序转换成所述目标程序的部分编译步骤。
在上述编译程序中,所述部分编译步骤,在所述总执行次数评价步骤中计算出来的总执行次数不超过预先规定的阈值时,不对所述多个源程序的任何部分进行编译。
上述编译程序,还让计算机在所述总执行次数评价步骤中计算出多个总执行次数时,执行判断所述多个总执行次数是否均等的均等度评价步骤,并且所述部分编译步骤,在所述均等度评价步骤中判断出所述多个总执行次数为均等时,不对所述多个源程序的任何部分进行编译。
上述将第1和第2源程序转换成目标程序的编译程序,还可以让计算机执行:检索从包含在所述第1源程序中具有多重或单一嵌套结构的循环或非循环的第1处理部分中被读取的所述第2源程序中所包含的具有多重或单一嵌套结构的循环或非循环,即第2处理部分的第1读取检测步骤、在所述第1读取检测步骤中检测出所述第2处理部分时,检索包含从所述第2处理部分中被读取的所述第1源程序中的所述第1处理部分的第3处理部分的第2读取检测步骤、在所述第2读取检测步骤中检测出所述第3处理部分时,通过对所述第1和第2源程序中的所述第2处理部分和所述第3处理部分进行编译,从而将所述第1和第2源程序转换成所述目标程序的部分编译步骤。
本发明的将源程序转换成目标程序的编译程序,可以让计算机执行:用来检测包含在所述源程序中的多重嵌套结构的多重嵌套结构检测步骤、用来检测构成所述多重嵌套结构的各单位循环的返回地点的地址的返回地点的地址检测步骤、检测在所述返回地点的地址检测步骤中检测出来的多个返回地点的地址中,是否有含有不影响程序执行的无用指令的返回地点的地址的无用指令检测步骤、在所述无用指令检测步骤中检测出含有无用指令的返回地点的地址时,将所述源程序转换成删除了无用指令的目标程序来作为作为所述目标程序的无用指令删除步骤。
本发明的程序产品,包括上述编译程序中的其中之任何一项和保存所述编译程序的信号保存媒体。
根据该程序产品,由于在信号保存媒体中保存有上述编译程序的其中之任何一项,所以,可以通过该信号保存媒体将编译程序读进计算机,从而较为准确地选择出源程序中执行次数较多的部分、或者执行次数较多的可能性较高的部分来进行编译。信号保存媒体也可以是记录媒体和传输媒体中的至少其中之一。
【附图说明】
图1是本发明实施例1中的编译的开发环境的概况结构示意图。
图2是通过图1所示的开发环境所开发的C程序编码的例示图。
图3是举例说明2个循环的返回地址为重复的Java(R)字节编码的示意图。
图4是举例说明分割了2个循环的返回地址的Java(R)字节编码的示意图。
图5是说明分割重复循环的返回地址的处理步骤的流程图。
图6是说明本发明实施例2的终端设备结构的方框图。
图7是举例说明在3个程序之间依次进行读取的Java(R)字节编码的示意图。
图8是图6所示的编译单元结构的方框图。
图9是图8所示的编译单元的处理步骤的流程图。
图10是图8所示的部分固有编译单元(native compiler)的处理步骤的流程图。
图11是图6所示的执行控制单元结构的方框图。
图12是举例说明具有重新进入结构的程序的示意图。
图13是通过图8所示的编译部分决定单元优先对重新进入结构进行编译的处理步骤的流程图。
【具体实施方式】
下面参照附图就本发明的实施例加以详细的说明。
实施例1
图1是本发明的一个实施例中的编译的开发环境的主要部分的概况结构示意图。此开发环境105也相当于实施本发明的一个实施例的记录媒体、编译装置以及编译方法的开发环境。在开发环境105的内部,作为其一部分,可包括通过Java(R)程序语言来开发程序的环境,即Java(R)程序语言开发环境125。
图1举例说明了Java(R)程序语言开发环境125,然而,所使用的程序语言并不局限于Java(R)程序语言,也可以是任何可称为高级程序语言的编译程序语言。例如,使用C语言、C++语言、Java(R)语言、FORTAN以及COBOL等以往的编译程序语言、或者APL、PL/1、ADA、Smalltalk、Lisp等汇编程序语言和其他的所有程序语言等来描述源程序,也不会有任何障碍。而且,开发环境105可以包括使用多种语言的开发环境,也可以包括只使用单一语言的开发环境。
通过Java(R)程序语言开发环境125可以开发Java(R)程序编码121。Java(R)程序编码121相当于涉及本发明的源程序的一个实施例。图2所示的是Java(R)程序编码的一个例子。在图2的例子中,Java(R)程序编码121包含有构成2重嵌套的2个“do~while”的循环。也就是说,Java(R)程序编码121具有2重嵌套结构。
另外,在本说明书中,只不过是将“多重嵌套结构”适当地称为“多重循环”。而且,包括单一循环即1重循环和多重嵌套结构即多重循环在内,适当地称其为“循环结构”或者“循环”。并且,为了区别构成多重循环的各个循环,而称其为“单位循环”。另外,单一循环又称为“单一嵌套结构”。
上述循环结构被作为编译部分决定单元127所解析的对象。开发环境105具有一个未图示的计算机,此计算机可以通过执行本发明的一个实施例的编译程序,来实现编译部分决定单元127的功能。编译部分决定单元127的模拟器137用来模拟执行图2所示的Java(R)程序编码121,包括有循环解析单元131以及首部分割单元133。
循环解析单元131,通过解析循环,来检测多重循环的返回地址中的重复返回地址。因此,循环解析单元131具有多重嵌套结构检测单元135、返回地址检测单元136以及地址重复判定单元137。首部分割单元133分割被检测出的重复的返回地点的地址,并将分割后的重复的返回地点的地址从Java(R)程序编码121转换成Java(R)字节编码129,并予以输出。因此,首部分割单元133具有指令追加单元138。Java(R)字节编码129相当于本发明的目标程序的一个实施形态。
图3,作为一个比较例子,举例说明编译部分决定单元127不分割重复的返回地址就进行输出时的Java(R)字节编码129。图3所示的Java(R)字节编码129包括有程序模块403、405、407以及409。图3(a)是举例说明各模块的处理过程的流程方框图,图3(b)是举例说明各模块所描述的程序。在此Java(R)字节编码129中,2个循环的返回地点都是程序模块405首部的“15 iinc 21”指令。也就是说,2重循环的返回地点的地址是重复的。
这样,在2重循环的2个返回地点的地址相同的情况下,当对包含在Java(R)字节编码129中的多重循环进行部分编译时,则无法判断该循环是包括从中途返回的一个循环,还是2重循环。也就是说,对于连续重复程序模块405和程序模块407的一个循环,无法判断是按照某种条件只执行程序模块405就结束一次循环的情况,还是包括只重复程序模块405的内侧循环、以及与此内侧循环一起重复程序模块407的循环在内的2重循环。
所以,循环解析单元131检测出这种多重循环的重复返回地点的地址,而首部分割单元133则分割被检测出的重复返回地点的地址。即,以图4中所示的程序模块504为例,首部分割单元133一个模块“15 nop”插入,对内侧循环的返回地点的地址和外侧的返回地点的地址进行分割。图4中的程序模块503、505、507以及509,与图3的程序模块403、405、407以及409分别有相同的内容,只是模块504被插入的部分地址不同。
这样,在2重循环的2个返回地点的地址为相同的情况下,通过插入一个在处理上没有意义的指令,如上述的述的“nop(空操作)”(在本说明书中,称为“无用指令”),来分割返回地点的地址,正如图4(a)的方框流程图中所示的结构,可以明确此循环为2重循环。这样,通过首部分割单元133分割重复的2重循环的返回地点的地址所形成的Java(R)字节编码129,就可以从开发环境105被输送到服务器103。服务器103则将输送来的Java(R)字节编码129予以储存以针对来自顾客终端设备的发送请求。
然而,向服务器103的输送和存储仅为一例,但并非必须,作为其他的例子,开发环境105和服务器103可以是相同装置中的不同的记录单元,也可以是相同装置中的相同记录单元,还可以是其他的结构。
这里,就编译部分决定单元127的处理步骤作进一步详细的说明。图5是说明编译部分决定单元127所执行的处理步骤的流程图。编译部分决定单元127,一边执行步骤S1~S5的处理,一边将Java(R)程序编码121转换成Java(R)字节编码129。编译部分决定单元127一旦开始执行处理,首先,多重嵌套结构检测单元135,在Java(R)程序编码121中检索多重嵌套结构(步骤S1)。如果多重嵌套结构检测单元135检测出多重嵌套结构(步骤S2为YES),则返回地址检测单元136检测构成被检测出的多重嵌套结构的各单位循环的返回地点的地址(步骤S3)。
如果返回地点的地址重复(步骤S4为YES),首部分割单元133的指令追加单元138,则通过在重复的返回地点的地址中的任何一个上追加一个nop指令,来分割重复的返回地点的地址(步骤S5)。一般来说,在N重(N≥2)嵌套结构的各单位循环的返回地点的地址发生重复的情况下,可以通过在内侧的N-1个单位循环的各个返回地点,分别插入一个nop指令,从而消除重复。然后,处理返回步骤S1。另一方面,如果返回地点的地址不重复(步骤S4为NO),处理则直接返回步骤S1。编译部分决定单元127反复执行步骤S1~S5的处理,直到多重嵌套结构检测单元135检测不出多重嵌套结构为止,如果检测不出多重嵌套结构(步骤S2为NO),则结束处理。
实施例2
图6是依照本发明的一个实施例来执行编译程序的终端设备的主要结构的方框图。此终端设备205相当于依照本发明的一个实施例的编译装置以及通信终端设备。而且,终端设备205还相当于依照本发明的一个实施例来实施记录媒体以及编译方法的装置。
终端设备205具有未图示的计算机。此计算机通过依照本发明的一个实施例来执行编译程序,以实现终端设备205所具有的预先连接单元231的功能。实现预先连接单元231的功能的编译程序,可以通过ROM、软磁盘、CD-ROM等记录媒体31来提供,也可以通过电话线路、网络等传送媒体33来提供。在图6中,作为记录媒体31使用了CD-ROM。储存在CD-ROM中的编译程序,可以通过将CD-ROM读取装置32接续到输出输入接口211而予以读出,进而又存储到未图示的计算机所具备的硬盘或RAM等记录媒体中。
在记录媒体31以ROM的形式提供编译程序时,通过将该ROM装入计算机,使该计算机可按照编译程序来执行预先连接单元231的处理。通过传输媒体33予以提供的编译程序,可以通过通信接口210来接收,并存储到硬盘或RAM等未图示的存储媒体中。传输媒体33并不只局限于有线的传输媒体,也可以是无线的传输媒体。另外,虽然在实施例1中省略了说明,但用来实现编译部分决定单元127(图1)的功能的编译程序,同样也可以提供给未图示的具有开发环境105的计算机。
终端设备205,通过网络32以及通信接口210,从服务器103将分割多重循环的返回地址后形成的Java(R)字节编码129读入第1文件系统243。被读入第1文件系统243的Java(R)字节编码221,继续被读进终端设备205的预先连接单元231,并由编译单元233所具有的编译部分决定单元223来决定进行编译的部分。
编译部分决定单元223,考虑多个程序之间的读取关系,并同时考虑读取原程序中的读取指令的循环深度和被读取程序的循环深度,将深度最大的循环判断为执行次数最多的可能性较高的循环(指令)。而且,编译部分决定单元223,将深度最大的循环(指令)决定为应该优先进行部分编译的部分。
这里所说的“循环的深度”或者“循环深度”,指的是循环的多重嵌套结构或单一嵌套的多重性。例如,单一嵌套结构的循环深度为1,2重嵌套结构的循环深度为2。而且,一般来说,也可以通过检测出反复执行的处理部分或指令(本说明书中称为“反复执行部分”)来代替循环的检测。此意即为将“指令”附加在循环之后。反复执行部分的执行次数与循环深度相对应。
如图7所示,假定为依次读取3个程序、即程序610、程序630、程序670。另外,程序610包含有程序模块603~607,程序630包含有程序模块624~626,程序670则包含有程序模块643~649。而且,还假定从程序610的程序模块605中读取程序630,而从程序630的程序模块625中读取程序670。
程序模块605位于程序610中深度为2的循环里,程序模块625位于程序630中深度为1的循环里,程序模块646位于程序670中深度为3的循环里。因此,如果考虑程序模块646单独在程序670的循环深度,则其深度为“3”,然而,如果是考虑全部程序之间的读取关系来判断总的循环深度,则其深度为“2+1+3=6”。
虽然此仅为一例,多对于其他的程序和程序模块也都是如此,则通过考虑全部程序之间的读取关系来判断作为总体的循环深度,可较为准确地检测出执行次数较多的可能性较高的循环(指令),并通过对此部分进行部分编译,从而可以更为准确地实现执行速度的最大化。
Java(R)字节编码221,是多重循环的返回地址通过开发环境105的编译部分决定单元127的首部分割单元133被分割后而予以形成。所以,即使是图3和图4所示的2重循环,也可以准确地检测出其为2重循环,从而以较高的精度判断出执行次数最多的循环(指令)。由此,可以较高的精度来决定应该优先进行编译的部分。因此,只要在执行时的存储器容量、即图6中的终端设备205所具有的第2文件系统245的存储器容量的容许范围内,就可以正确地判断最能提高执行速度的部分,从而决定该部分为应该进行编译的部分。
编译单元233所具有的部分固有编译单元225,对编译部分决定单元223所决定的应该编译的部分进行编译。编译部分决定单元223所进行的编译部分的决定,如上所述,优先决定从总的循环深度来考虑的循环深度最大的部分,并且在考虑执行存储器容量的同时,只要执行存储器容量容许,可以允许较多指令的预先编译予以执行。因此,只要在执行时的存储器容量的容许范围内,就可以尽可能地提高执行速度。
由于受执行时的存储器容量的限制,不一定能对全部指令进行预先编译,所以,在经过预先编译之后的程序中,并存有已完成预先编译的固有编码229的部分和以Java(R)字节编码227的原状予以保留的部分。已完成预先编译的固有编码229的部分和以Java(R)字节编码227的原样予以保留的部分共存的执行程序,被存储在第2文件系统245中。第1文件系统243和第2文件系统245可以是同一系统,也可以是不同的系统。
存储在第2文件系统245中的执行程序,由执行控制单元257来执行。此执行程序,由于在执行时的存储器容量的容许范围内,优先对循环深度较大的部分进行预先编译,所以可最大限度地提高执行速度。
如上所述,即使是图3和图4所示的2重循环,由于编译部分决定单元127的首部分割单元133分割了多重循环的返回地址,所以编译部分决定单元223可以准确地检测出2重循环,并以较高的精度判断出执行次数最多的循环(指令),从而优先决定进行编译的部分。然而,如上所述的返回地址的分割,是通过插入一个nop指令,即没有处理意义的无用指令而予以执行。由于此指令确实没有处理上的意义,所以对处理内容不会产生任何不良影响,但是在存储器里却占用了不必要的存储领域。另外,也会导致执行控制单元257在执行程序时,为了解读此指令、例如判断nop指令而浪费不必要的时间。因此,若是否为2重循环的判断已经执行,则部分固有编译单元225可以删除追加的无用指令,然后进行预先编译。
下面,就编译单元233的结构及工作步骤进行较为详细的说明。图8是说明编译单元233所具有的编译部分决定单元223和部分固有编译单元225的结构的方框图。编译部分决定单元223包括有:循环检测单元261、读取检测单元262、循环深度评价单元263、均等度评价单元264、编译部分判定单元265以及重新进入结构判定单元267。部分固有编译单元225包括有多重嵌套结构检测单元271、返回地点的地址检测单元272、无用指令检测单元273以及无用指令删除单元274。
图9是说明编译部分决定单元223以及部分固有编译单元225所执行的处理步骤的流程图。为了便于说明,假定编译部分决定单元223以及部分固有编译单元225将具有图7所示的3个程序610、630、670的Java(R)字节编码221作为处理对象。编译部分决定单元223开始执行处理后,首先是循环检测单元261在在Java(R)字节编码221所包含的主程序、即图7所示的程序610中,检索是否具有多重嵌套结构或单一嵌套结构的循环(步骤S11)。
如果循环检测单元261检测出包含在程序610中的循环(步骤S12为YES),则读取检测单元262从所检测出的循环中检测被读取的其它程序(步骤S14)。如果检测出被读取的程序、即程序630(步骤S14为YES),则循环检测单元261,在程序630中检索是否具有多重嵌套结构或单一嵌套结构的循环(步骤S15)。另外,循环检测单元261相当于本发明的第1和第2循环检测单元的实施例。
如果循环检测单元261检测出包含在程序630中的循环(步骤S16为YES),则读取检测单元262从所检测出的循环中再进一步检测被读取的其它程序(步骤S14)。如果检测出被读取的程序、即程序670(步骤S14为YES),则循环检测单元261,从程序670中检索是否具有多重嵌套结构或单一嵌套结构的循环(步骤S15)。
如果循环检测单元261检测出包含在程序670中的循环(步骤S16为YES),则读取检测单元262从所检测出的循环中再进一步检测被读取的其它程序(步骤S14)。由于检测不出被读取的程序(步骤S14为NO),所以,循环深度评价单元263就计算在其之前由循环检测单元261检测出的循环的嵌套总数、即将2+1+3=6作为循环深度。也就是,循环深度评价单元263针对涉及读取关系的程序610、630及670,将构成多重嵌套结构的循环总体的多重度,作为循环深度而予以算出(步骤S17)。
循环检测单元261,在程序610中进一步检索循环(步骤S11)。如果循环检测单元261检索不出新的循环(步骤S12为NO),则可以由均等度评价单元264对循环深度之间的均等度进行评价(步骤S19)。均等度评价单元264,在循环深度评价单元263计算出多个循环深度时,按照确定该多个循环深度的标准来判断该多个循环深度是否均等。例如,均等度评价单元264,在多个循环深度全部相同时作出均等的判断,不相同时作出不均等的判断。或者,均等度评价单元264,在多个循环深度全部位于规定的标准范围内则作出均等的判断,在存在超出标准范围的循环时作出不均等的判断。均等度评价单元264,在循环深度评价单元263只计算出单一的循环深度时作出循环深度为不均等的判断。
如果均等度评价单元264判断循环深度为不均等(步骤S19为NO),则编译部分判定单元265可以将循环深度较大的循环优先包括到应该进行编译的部分中(步骤S20)。例如,编译部分判定单元265,在分配至第2文件系统的存储器容量的容许范围之内,尽可能将多个循环从循环深度较大的循环开始优先包括到应该进行编译的部分中。作为另一例,编译部分判定单元265只将循环深度最大的循环、或者将从循环深度大的循环开始按序规定的个数之内的循环包括到应该进行编译的部分中。或者,编译部分判定单元265可以将超过规定的循环深度的阈值的循环包括到应该进行编译的部分之内。
编译部分判定单元265的处理(步骤S20)结束时,或者均等度评价单元264判断出循环深度为均等(步骤S19为YES)时,部分固有编译单元225则通过只对编译部分判定单元265所决定的应该编译的部分进行编译,以此产生含有固有编码229的Java(R)字节编码227(步骤S21)。
这样,包括Java(R)字节编码221所含有的互相间具有读取关系的多个程序610、630及670之间所构成的多重嵌套结构在内,多重嵌套的总数较大的循环可以优先进行编译。因此,Java(R)字节编码221中的执行次数较多的可能性较高的部分,可以较高的精度被选择出并予以编译。从而可以较高的将度来提高程序的执行速度以及节省第2文件系统245的存储领域,使其达到最佳程度。
而且,在步骤S20中,编译部分判定单元265,在循环深度的最大值不超过预先规定的阈值时,可以决定没有应该进行编译的部分。因此,可以避免对提高执行速度贡献较小的部分进行无用的编译而浪费第2文件系统245的存储领域。
并且,如果均等度评价单元264判断出循环深度为不均等(步骤S19为NO)时,编译部分判定单元265可以决定没有应该进行编译的部分。因此,可以避免对较多的对提高执行速度的贡献程度相同的部分进行编译而影响第2文件系统245的存储领域的有效利用。
如果编译部分判定单元265判定没有应该进行编译的部分,则部分固有编译单元225不对作为处理对象的源程序的Java(R)字节编码221进行编译,而是将其作为处理之后的目标程序的Java(R)字节编码227,直接予以输出。在此情况下,Java(R)字节编码227最好是通过执行控制单元257被逐渐提供并予以执行,同时抽出执行频率较高的部分,并对抽出的部分进行部分编译。也就是说,在执行前,没有进行部分编译的Java(R)字节编码227,最好加以JIT(Just In Time)处理。另外,关于在执行前已进行部分编译的Java(R)字节编码227,也可以加以JIT处理,由此可将更加需要编译的部分加以编译。关于执行JIT的执行控制单元257的结构将在后面加以说明。
在图9中,循环检测单元261可以通过检测被反复执行的部分即反复执行部分,来代替循环的检测。反复执行部分包含有循环。在此情况下,循环深度评价单元263可以计算出反复执行部分的执行次数的总和,以代替循环深度即循环的多重性的总和。由此,可以更高的精度来选择出Java(R)字节编码221中的执行次数较多的部分,并予以编译。其结果,可以较高的精度来提高程序的执行速度以及节省第2文件系统245的存储领域,使其达到最佳程度。
图10是部分固有编译单元225,在步骤S21之前,或与步骤S21同时执行的最理想的处理步骤的流程图。部分固有编译单元225,可在执行步骤S51~S55的处理的同时,将Java(R)字节编码221转换成通常包含有固有编码229的Java(R)字节编码227。部分固有编译单元225开始执行处理时,首先是多重嵌套结构检测单元271在Java(R)字节编码221中检索多重嵌套结构(步骤S51)。如果多重嵌套结构检测单元271检测出多重嵌套结构(步骤S52为YES),则返回地点的地址检测单元272检测构成被检测出的多重嵌套结构的各单位循环的返回地点的地址(步骤S53)。
其次,无用指令检测单元273判断在被检测出的返回地点的地址中是否存在含有无用指令的返回地点的地址(步骤S54)。如果无用指令检测单元273检测出含有无用指令的返回地点的地址(步骤S54为YES),则无用指令删除单元274从被检测出的返回地点的地址中删除无用指令(步骤S55)。然后,处理返回步骤S51。相反,如果没有检测出含有无用指令的返回地点的地址(步骤S54为NO),则处理直接返回步骤S51。部分固有编译单元225反复执行步骤S51~S55的处理,直到多重嵌套结构检测单元271检测不出多重嵌套结构为止,如果检测不出多重嵌套结构(步骤S52为NO),则结束图10的删除无用指令的处理。
如上所述,部分固有编译单元225,将编译部分决定单元265所决定的应该进行编译的部分优先进行编译(步骤S21)。部分固有编译单元225,在分配至第2文件系统的存储领域达到饱和时,结束步骤S21的编译处理。
图11是执行控制单元257的结构的一例方框图。在图11的示例中,执行控制单元257包括第1执行控制单元257A和第2执行控制单元257B。当从第2文件系统245读出的Java(R)字节编码227,通过部分编译而含有固有编码229时,该Java(R)字节编码227通过第1执行控制单元257A予以执行。相反,如果Java(R)字节编码227不含有固有编码229,则该Java(R)字节编码227通过第2执行控制单元257B予以执行。第2执行控制单元257B即为执行上述JIT处理的执行控制单元。
被输入第1执行控制单元257A的含有固有编码229的Java(R)字节编码227,通过连接单元281加以连接处理后,固有编码229部分被保存到高速缓冲存储器282中,Java(R)字节编码227部分被保存到高速缓冲存储器283中。按照执行处理的顺序,固有编码229和Java(R)字节编码227通过转换单元284予以选择,被选择出来的部分通过执行单元285予以执行。在Java(R)字节编码227全部被固有编码229所置换的情况下,即全部的Java(R)字节编码227通过编译单元233被编译时,该Java(R)字节编码227通过第1执行控制单元257A予以执行。
第2执行控制单元257B,除了包括第1执行控制单元257A的结构以外,还包括有执行部分频率检测单元286以及部分固有编译单元287。执行部分频率检测单元286,最初在执行单元285执行不含固有编码229的Java(R)字节编码227时,检测该Java(R)字节编码227中超过规定标准以较高频率予以执行的部分,即高频率执行部分。而部分固有编译单元287则对执行部分频率检测单元286所检测出的高频率执行部分进行编译。其结果,成为含有固有编码229的Java(R)字节编码227,同第1执行控制单元257A一样,经过高速缓冲存储器282和283以及转换单元284,最终通过执行单元285予以执行。
执行控制单元257B的执行结束之后,已成为含有固有编码229的Java(R)字节编码227,针对下一次的执行而被保存至第2文件系统245中。被保存的Java(R)字节编码227,由于已经进行了部分编译,所以也可以通过第1执行控制单元257A予以执行。
根据图11所示的执行控制单元257,被编译单元233的编译部分判定单元265判定为没有进行编译的部分的Java(R)字节编码227,可加以JIT处理。因此,针对被编译单元233判定为预先编译的执行不适当的Java(R)字节编码227,可通过JIT处理来实现最佳程度的执行速度和节省存储领域至最佳程度,以此取代预先编译。
图11举例说明了第1执行控制单元257A和第2执行控制单元257B共存的情况。对此,执行控制单元257,也可以只包括第2执行控制单元257B,根据所输入的Java(R)字节编码227是否包含固有编码229,来控制执行部分频率检测单元286和部分固有编译单元287的开启(on)·关闭(off)。
再回到图8,编译部分决定单元223,通过让重新进入结构判定单元267进入工作,可以实现以下所述的处理。假定作为编译部分决定单元223的处理对象的源程序、即Java(R)字节编码221具有图12所示的循环结构。图12所示的Java(R)字节编码221具有程序710和程序730。程序710含有程序模块703~707,程序730含有程序模块724~726。
在读取原程序710中构成2重循环的程序模块705,读取包含在程序730中的程序模块724。另一方面,在程序730中,接在程序模块724之后执行的程序模块725具有单一循环结构。而且,该程序模块725读取包含在读取原程序710中的程序模块704。
一般来说,该结构被称作“重新进入”结构或者“重入”(Re-entrant)结构。即程序模块704、705、706、724、725、726为重新进入结构。编译部分决定单元223的重新进入结构判定单元267,在编译对象程序中发现该重新进入结构时,编译部分决定单元223优先将该部分决定为编译部分。因此,重新进入结构可以通过部分固有编译单元225而优先进行编译。由于Java(R)字节编码221中的执行次数较多的可能性较高的部分的重新进入结构可以优先进行编译,所以,可以较高的精度度来提高程序的执行速度以及节省第2文件系统245的存储领域,使其达到最佳程度。
下面,再就有关编译部分决定单元223的重新进入结构判定的工作步骤进行详细说明。图13是有关重新进入结构判定的编译部分决定单元223的工作步骤的流程图。图13的处理步骤,可以和图9的处理步骤同时进行。为了便于说明,假定编译部分决定单元223将图12所示的Java(R)字节编码221作为处理的对象。
编译部分决定单元223开始执行图13所示的处理后,读取检测单元262,在作为主程序的程序710中,检索读取其它程序的处理部分(步骤S31)。如果读取检测单元262检测出该处理部分、即检测出程序模块705(步骤S32为YES),则读取检测单元262,在被读取的程序730中检索读取含有读取原程序的程序710中的读取部分(即程序模块704、705、706)的处理部分的处理部分(即程序模块725)(步骤S33)。
如果读取检测单元262检测出该处理部分、即检测出程序模块725(步骤S34为YES),重新进入结构判定单元267则判定被读取程序的处理(即程序模块724、725、726),以及相反从被读取程序中读出的读取原程序的处理(即程序模块704、705、706)为重新进入结构(步骤S35)。接着,读取检测单元262再重新执行步骤S33的处理。如果读取检测单元262检测不出新的处理部分(步骤S34为NO),读取检测单元262则重新执行步骤S31的处理。如果读取检测单元262检测不出新的处理部分(步骤S32为NO),编译部分判定单元265将重新进入结构判定单元267所判定的重新进入结构的处理部分包括到应该进行编译的部分中(步骤S36)。
然后,编译部分决定单元223结束图13的处理。而部分固有编译单元225,则可以优先对由编译部分判定单元265通过图9的处理而决定为应该进行编译的部分的循环以及由编译部分判定单元265通过图13的处理而决定为应该进行编译的部分的重新进入结构进行编译。
在实施例1中,举例说明了从Java(R)程序编码121向Java(R)字节编码129的转换,是在开发环境105中进行的。对此,也可以使用终端设备205,通过通信接口210从服务器103下载Java(R)程序编码121,并在预先连接单元231中执行向Java(R)字节编码129的转换。综上所述,由于本发明所涉及的编译装置、编译方法、通信终端设备、编译程序以及程序产品,可以实现以较高的精度度来提高程序的执行速度和节省用于存储程序的存储器的存储容量,使其达到最佳程度,所以可以被广泛地利用于各种产业上。