程序变换方法和程序变换系统的制作方法

文档序号:6416183阅读:259来源:国知局
专利名称:程序变换方法和程序变换系统的制作方法
技术领域
本发明一般涉及一种程序变换方法,一种程序变换系统,和一种存储程序变换程序的存储介质。具体地讲,本发明涉及一种用于把由编程语言描述的源程序变换(编译)为由计算机、中央处理器(CPU)等可执行的语言(机器语言、汇编语言等)描述的目标程序的程序变换方法和程序变换系统。


图15是日本未审查专利公开1-118931中公开的一种现有程序变换系统的结构实例的方框图。
图15中所示的程序变换系统是由一个第一程序存储部分151,一个编译器152,一个第二程序存储部分153,一个第三程序存储部分154,一个输入数据存储部分155,一个程序执行部分156,一个第四程序存储部分157,和一个剖析(parsing)结果存储部分158构成的。
首先,编译器152从第一程序存储部分151读出一个由C语言之类的编程语言描述的源程序,临时地产生一个由机器语言、汇编语言之类的语言描述的目标程序,并且把临时产生的目标程序存储在第二程序存储部分153。
在这里,临时产生的目标程序是通过把源程序以描述的顺序次序变换为机器语言、汇编语言等的代码而产生的程序。尽管临时产生的目标程序是可以由计算机、中央处理器(CPU)等执行的,由于只是把源程序变换成源程序代码顺序次序的代码,所以它固有的冗余部分使得以临时产生形式保持的整体目标程序的长度(代码量)很大。因此适于存储临时产生的目标程序的主存储器需要大的存储容量。此外,目标程序执行周期变得很长,因而降低了效率。
因此,需要产生一种有效和优化的目标程序。此后把上述处理中从源程序变换为依照源程序中描述的顺序次序代码的目标程序称为“临时目标程序”,以区别于优化后的最终目标程序。
有各种优化目标程序的方法。在这里,在一个过程中对指令的排列优化编码。过程的意思是指计算机或CPU要执行的算术运算之类的一组处理,通常称为函数或子程序。在整个说明书和权利要求中,将把这种处理组统称为“过程”。
在一个程序中,在程序的某一部分的一些过程(此后称为“主调用(caller)”辅助过程)的执行中需要调用其它过程(此后称为“被调用(callee)”辅助过程)。因此,当把源程序变换成目标程序并把所得的目标程序存储在主存储器中时,如果一个主调用辅助过程的指令代码和一个与前者最为相关的一个主调用辅助过程的指令代码物理地相互紧挨着排列,那么一个过程调用指令可以从长跳转指令变为短跳转指令。
通过这种改变可以减少整个目标程序的代码量。结合这种改变,在计算机或CPU中执行目标程序的执行速度可以是较高的。把将来具有很可能相继执行的指令代码排列在目标程序的物理上紧挨的位置上称为过程指令代码的排列优化。
接下来,程序执行部分156从第四程序存储部分157读出一个过程调用频率剖析程序,并执行之。即,程序执行部分156从第二程序存储部分153读出临时目标程序。与之结合,程序执行部分156还读出存储在输入数据存储部分155中由操作员输入的输入数据。然后,程序执行部分156模拟临时目标程序的执行,并且结合这种模拟执行,累计临时目标程序中某一过程中其它过程的调用发生的次数。把累计的结果作为过程参考频率剖析结果存储在剖析结果存储部分158中。
借此,编译器152从剖析结果存储部分158读出过程参考频率剖析结果,以计算任意两个过程之间的参考关系的紧密性。根据所得的紧密性,进行指令代码的排列优化,以产生最终目标过程,存储在第三程序存储部分154中。
另一方面,图16是日本未审查专利公开9-34725中公开的一个现有程序变换系统的结构实例的方框图。
图16中所示的程序变换系统一般是由一个源程序存储部分161,一个编译器162和一个目标程序存储部分163构成的。
编译器162一般是由一个剖析部分164,一个过程调用发生计数部分165,一个代码产生部分166,一个过程调用计数数据存储部分167,一个特定空间排列程序确定部分168,一个目标程序输出部分169构成的。在这里,一个特定空间的意思是设定在一个程序空间的一部分中的一个有限代码量的特定区。
剖析部分164从源程序存储部分161读出要剖析的源程序,并且剖析形成源程序的语法。过程调用计数部分165计算在剖析语法时剖析部分164识别出的每个过程的有关过程的调用次数。
代码产生部分166进行两次代码产生。即,在第一次代码产生,根据剖析部分164的剖析结果,如果语法不是过程调用指令,代码产生部分166产生一个正常代码,而如果语法是过程调用指令,则使用正常调用指令产生一个指令代码。另一方面,代码产生部分166在第二代码产生中从开始端扫描第一次代码产生的结果。然后,如果代码是过程调用指令,并且访问特定空间排列过程确定部分168的结果显示过程是确定要排列在特定空间中的特定空间排列过程,用一个指定的具有小字节计数的调用指令代码替换具有大字节计数的正常调用指令代码。
过程调用计数数据存储部分167存储过程调用发生计数部分165计算的每个过程的调用次数,和在第一代码产生中产生的代码的代码量。特定空间排列过程确定部分168根据存储在过程调用计数数据存储部分167中的调用计数和代码量,通过给予具有较大调用计数的过程优先次序因而使得要在特定空间中排列的过程的代码量的总和落在特定空间的代码量范围内的方法,选择和确定要排列在特定空间内的过程。
目标程序输出部分169,在访问特定空间排列过程确定部分168的结果显示代码产生部分166产生的代码是特定空间排列过程的一个定义部分的代码的时候,输出代码给附加了该特定空间排列属性的段,并且在代码产生部分166产生的代码不是特定空间排列过程的确定部分的代码时,输出一个正常段。在这里,段的意思是当把代码排列在程序空间时作为排列的最小单元的一组代码。
如上所述,目标程序输出部分166分隔了特定空间排列过程和正常过程。接下来,目标程序输出部分169输出参数区之类的数据,输出组合为目标程序的一个代码部分和一个数据部分,并存储在目标程序存储部分163中。
利用上述的构造,可以减小产生的目标程序的代码量。结合这种构造,可以节省程序空间。并且可以提高计算机或CPU执行目标程序的执行速度。
另一方面,在日本未审查专利公开1-118931公开的现有程序变换系统中,由于进行过程的指令代码的排列优化的目标只是使用者在源程序中定义的过程,这限制了目标程序效率的改进。
另一方面,在日本未审查专利公开9-34725公开的现有程序变换系统中,由于特定空间具有有限的代码量,因而限制了要在特定空间内排列的过程。因此,限制了目标程序的效率的提高。
另一方面,当要用一个由CPU,译码器等构成的单片微型计算机执行程序变换系统产生的目标程序时,目标程序被存储在外主存储器中,使得能够顺序地从主存储器中读出目标程序的每个代码。然后,在译码器译码后,CPU剖析用于执行的目标程序。在这种情况下,为了提高CPU的执行速度,在单片微型计算机中提供有一个具有小的暂时存储容量和高存取速度并且存储从一般具有大的存储容量和低存取速度的主存储器读出的代码的高速缓冲存储器。
在装配有高速缓冲存储器的单片微型计算机中,在CPU执行代码时,在从主存储器读出的目标程序中的每个代码存储在高速缓冲存储器中之前,译码器不能对它进行译码,并且CPU不能剖析和执行它。在这种单片微型计算机中,有各种把从主存储器读出的每个代码存储在高速缓冲存储器中的方法。其中,直接映像法是在高速缓冲存储器中存储每个代码的方法之一。
如图17中所示,在直接映像法中,高速缓冲存储器171被划分为多个存储区(此后称为高速缓存行)。与此结合,主存储器172的每个存储区被划分。主存储器172的每个存储区是对应于高速缓冲存储器171的每个高速缓存行建立的。
在图17中,高速缓冲存储器171是由171a至171e五个高速缓存行组成的。对应于这些高速缓存行,把主存储器172划分成每个都具有与每个高速缓存行相同存储容量的存储区。以五个为一个单元,每个存储区对应于相应的五个高速缓存行171a至171e。也就是说,主存储器172的存储区172-1a至172-第一实体对应于高速缓存行171a至171e作为一组。同样,存储区172-2a至172-第二实体对应于高速缓存行171a至171e。最后的存储区172-na至172-ne(n是自然数)也对应于高速缓存行171a至171e。
当要用程序变换系统产生使用直接映像法的单片微型计算机执行的目标程序的时候,会遇到以下的缺陷。
例如,当用程序变换系统把图18中所示的用C语言描述的源程序变换成目标程序时,如图19中所示,过程func_A和func_B的相应的指令代码被存储在主存储器172中。
在图19中,过程func_A的指令代码存储在主存储器172的存储区172-1a至172-1c中。过程func_B的指令代码也存储在主存储器172的存储区172-2a至172-2b中。因此,过程func_A的指令代码对应于高速缓冲存储器171的高速缓存行171a至171c。另一方面,过程func_B的指令代码对应于高速缓冲存储器171的高速缓存行171a和171b。
在这种情况下,当CPU执行图18中所示源程序变换产生的目标程序时,从主存储器172的存储区172_1a至172_1c读出过程func_A的指令代码和一次存储在高速缓冲存储器171的高速缓存行171a至171c中,并且随后由译码器译码和由CPU剖析和执行。
接下来,把过程func_B的指令代码从主存储器172的存储区172_2a至172_2b中读出,并临时存储在高速缓冲存储器171的高速缓存行171a至171b中。在这里,由于过程func_A的指令代码的一部分已经存储在高速缓冲存储器171的高速缓存行171a和171b中,因此过程func_B的指令代码在那里覆盖存储(覆盖写入)。因此过程func_A的指令代码的一部分不能被后续读出。此后,存储在高速缓冲存储器171的高速缓存行171a至171b中的过程func_B的指令代码被译码器译码并由CPU剖析和执行。
接着,图18中所示的源程序必须再次执行过程func_A的指令代码。但是,由于过程func_B的指令代码已经存储在高速缓冲存储器171的高速缓存行171a和171b中,因而过程func_A的指令代码的一部分不能被读出。因此,再次从主存储器172的存储区172_1a至172_1b读出过程func_A的指令代码。然后,把过程func_A的指令代码临时存储在高速缓冲存储器171的高速缓存行171a至171b中,由译码器译码和由CPU剖析和执行。
如上所述,当把将来极可能相继执行的两个过程的指令代码存储在对应于高速缓冲存储器的相同高速缓存行的主存储器的存储区中的时候(这将称为装载在相同高速缓存行上),存储在高速缓冲存储器171中的先从主存储器读出的指令代码的全部或一部分,被从主存储器读出并且写在高速缓冲存储器171的相同高速缓存行上的后续写入的过程的指令代码重写。这种状况被称为冲突(高速缓存冲突)。如果这种冲突经常发生,可能会使加快CPU的执行速度的高速缓冲存储器失效。更糟糕的是,它可能会造成CPU执行速度的降低。
作为在高速缓冲存储器中存储从主存储器读出的每个代码的方法,有一种完全相关的允许把主存储器的数据存储到高速缓冲存储器的任何高速缓存行的方法,存在一种用来作为直接映像法与完全相关方法的中间方法的相关方法和排列主存储器的数据的多个高速缓存行,以及各种可联合直接映像法使用的方法。如上所述,可能造成高速缓冲存储器上过程的冲突。
在日本未审查专利公开1-118931和日本未审查专利公开9-34725公开的现有程序变换系统中,没有考虑到上述的冲突。因此,作为过程指令代码排列优化或在特定空间中过程排列的结果,如果两个将来极有可能相继执行的过程的指令代码被装载到高速缓冲存储器171的相同的高速缓存行上,冲突是固有的。因此,即使能够减少整个目标程序的代码量,也不能加快CPU的执行速度。
另一方面,由于指令代码没有存储在高速缓冲存储器171中,因为冲突而不能读出指令代码(这些一般称为高速缓存丢失),所以目标程序执行中频繁使用的过程不能通过每次使用时从主存储器172读出指令代码和存储在对应的高速缓冲存储器的高速缓存行中提高CPU的执行速度。因此,需要把频繁使用的过程尽可能长时间地存储在高速缓冲存储器171中,而不造成冲突。
但是,在日本未审查专利公开1-118931和日本未审查专利公开9-34725公开的现有程序变换系统中,对目标程序执行中的高速缓存丢失根本没有考虑。因此,即使是出于这一点,CPU的执行速度也不能提高。
本发明的目的是要提供一种能够成功地防止高速缓冲存储器上不同过程的冲突,能够防止频繁使用的过程的高速缓存丢失,因而能够提高计算机、CPU等执行目标程序的速度的程序变换方法和程序变换系统。
根据本发明的第一方面,一种用于把由编程语言描述的源程序变换为数据处理系统可执行语言描述的目标程序的程序变换方法,包括第一处理,将源程序中使用的至少一部分过程、函数或子程序变换为一种使得目标程序可以被存储在数据处理系统的主存储器的任意存储区中的形式;第二处理,根据在源程序变换为目标程序的处理过程中获得的有关于过程、函数或子程序的信息,在主存储器的存储内中对应于一高速缓冲存储器的高速缓存行的存储区中排列第一处理中变换的或未变换的过程、函数或子程序,而不造成高速缓存冲突;和第三处理,根据排列的结果产生目标程序。
在优选构造中,过程、函数或子程序是使用者在源程序中定义的、使用者定义并检验的、以编程语言在处理系统中预先准备的、和以指令代码形式预先准备的过程、函数或子程序中的至少一种。
在另一优选构造中,信息是通过执行从源程序变换的一个临时目标程序获得的,并且是由指示过程、函数或子程序实际被调用的次数的信息和指示过程、函数或子程序之间的调用关系的信息构成的。
在再一个优选构造中,信息是通过执行从源程序变换的一个临时目标程序获得的,并且是由指示过程、函数或子程序实际被调用的次数的信息和指示过程、函数或子程序之间的调用关系的信息构成的,在第二处理中,根据调用频率把过程、函数或子程序划分为多个组,和把过程、函数或子程序排列在主存储器存储区中对应于一个高速缓冲存储器的高速缓存行的存储区内。
根据本发明的第二方面,一种用于把由编程语言描述的源程序变换为数据处理系统可执行语言描述的目标程序的程序变换方法,包括第一处理,当在数据处理系统中使用目标程序时,将源程序中使用的过程、函数或子程序的至少一部分变换为一种在数据处理系统的一个主存储器的任意存储区中存储的形式;第二处理,将源程序变换为目标程序,和与之结合,关于目标程序,把源程序中使用者定义的过程、函数或子程序变换为可在主存储器的任意区中存储的形式;第三处理,链接第一处理中变换的过程、函数或子程序和第二处理中获得的目标程序;第四处理,利用执行通过第三处理获得的目标程序,收集由指示过程、函数或子程序实际被调用的次数的信息和指示过程、函数或子程序之间的调用关系的信息构成的动态信息;第五处理,根据动态信息,在主存储器的存储区中对应于高速缓冲存储器的高速缓存行的存储区中排列过程、函数或子程序,并避免高速缓存冲突;和第六处理,根据排列信息,通过链接第一处理中变换的过程、函数或子程序和在第二处理中获得的目标程序产生最终目标程序。
在优选构造中,过程、函数或子程序是使用者在源程序中定义的、使用者定义并检验的、在处理系统中以编程语言预先准备的、和以指令形式预先准备的过程、函数或子程序中的至少一种。
在另一优选构造中,在第二处理中,根据调用频率把过程、函数或子程序划分为多个组,和把过程、函数或子程序排列在主存储器的存储区中对应于一个高速缓冲存储器的高速缓存行的存储区内。
根据本发明的第三方面,一种用于把由编程语言描述的源程序变换为数据处理系统可执行语言描述的目标程序的程序变换方法,包括第一处理,将源程序变换为一个临时目标程序,和与之结合,在执行临时目标程序时,插入过程、函数或子程序实际被调用的次数的计数代码;第二处理,把使用者在源程序中定义的、使用者定义并检验的、在处理系统中以编程语言预先准备的、和以指令代码形式预先准备的过程、函数或子程序中的一个与通过第一处理获得的临时目标程序链接;第三处理,利用执行通过第二处理获得的目标程序,收集由指示过程、函数或子程序实际被调用的次数的信息和过程、函数或子程序之间的调用关系的信息组成的动态信息;第四处理,根据动态信息,在主存储器的存储区中对应于高速缓冲存储器的高速缓存行的存储内中排列过程、函数或子程序,并避免高速缓存冲突;和第五处理,把在源程序中将要使用的过程、函数或子程序中由使用者在源程序中定义的一个、由使用者定义并检验的一个、在处理系统中以编程语言预先准备的一个、和以指令代码形式预先准备的一个的至少一部分变换为可在主存储器的任意存储区中存储的一种形式,其中目标程序按照在数据处理系统中实际使用的形式存储;第六处理,在把源程序变换为目标程序之后,关于目标程序,把使用者在源程序中定义的过程、函数或子程序变换为一种可在主存储器的任意区中存储的形式;第七处理,根据排列信息,通过链接第五处理中变换的过程、函数或子程序和第六处理中获得的目标程序产生最终目标程序。
在该优选构造中,在第四处理中,根据调用频率把过程、函数或子程序划分为多个组,和把过程、函数或子程序排列在主存储器的存储区中对应于一个高速缓冲存储器的高速缓存行的存储区内。
根据本发明的第四方面,一种用于把由编程语言描述的源程序变换为数据处理系统可执行语言描述的目标程序的程序变换系统,包括过程变换装置,用于将源程序中使用的过程、函数或子程序的至少一部分变换为一种使得目标程序可以被存储在数据处理系统的主存储器的任意存储区中的形式;优化装置,用于根据在源程序至目标程序的变换处理过程中获得的有关过程、函数或子程序的信息,把过程变换装置中变换的或未变换的过程、函数或子程序排列在主存储器存储区中对应于一个高速缓冲存储器的高速缓存行的存储区中,而不造成高速缓存冲突;和产生装置,用于根据排列的结果产生目标程序。
在该优选构造中,过程、函数或子程序是使用者在源程序中定义的、使用者定义并检验的、预先在处理系统中以编程语言准备的、和预先以指令代码形式准备的过程、函数或子程序的至少一种。
在另一优选构造中,信息是通过执行从源程序变换的临时目标程序而获得的,并且是由指示过程、函数或子程序实际被调用的次数的信息和指示过程、函数或在例程之间的调用关系的信息构成的,在优化装置中,根据调用频率把过程、函数或子程序划分为多个组,和将过程、函数或子程序排列在主存储器存储区中的对应于一个高速缓冲存储器的高速缓存行的存储区内。
根据本发明的第五方面,一种用于把由编程语言描述的源程序变换为数据处理系统可执行语言描述的目标程序的程序变换系统,包括用于当目标程序在数据处理系统中使用时将源程序中使用的过程、函数或子程序的至少一部分变换为一种用于在数据处理系统的主存储器的任意存储区中存储的形式的过程变换装置,用于把源程序变换为目标程序,和与之结合,关于目标程序,把使用者在源程序中定义的过程、函数或子程序变换为一种可以存储在主存储器的任意存储区中的形式的程序变换装置,用于链接在过程变换装置中变换的过程、函数或子程序和在程序变换装置中获得的目标程序的链接装置,用于利用执行通过链接装置获得的目标程序,收集由指示过程、函数或子程序实际被调用的次数的信息和指示过程、函数或子程序之间的调用关系的信息构成的动态信息的动态信息收集装置,和用于根据动态信息,避免高速缓存冲突地在主存储器存储区中对应于高速缓冲存储器的高速缓存行的存储区中排列过程、函数或子程序的优化装置,链接装置根据排列信息,通过链接在过程变换装置变换的过程、函数或子程序和在程序变换装置获得的目标程序产生最终目标程序。
根据本发明的第六方面,一种用于把由编程语言描述的源程序变换为数据处理系统可执行语言描述的目标程序的程序变换系统,包括用于将源程序变换为一临时目标程序,和与之结合,在执行临时目标程序时,插入计算过程、函数或子程序被实际调用的次数的代码的程序变换装置;用于将源程序中使用者定义的,使用者定义并检验的,在处理系统中以编程语言预先准备的,和以指令代码形式预先准备的过程、函数或子程序中的一个与通过程序变换装置获得的临时目标程序链接的链接装置;用于利用执行通过链接装置获得的目标程序,收集由指示过程、函数或子程序实际被调用的次数的信息和指示过程、函数或子程序之间的调用关系的信息构成的动态信息的动态信息收集装置;用于根据动态信息,避免高速缓存冲突地在主存储器存储区中对应于高速缓冲存储器的高速缓存行的存储区中排列过程、函数或子程序的优化装置;和用于把要在源程序中使用的过程、函数或子程序中由使用者在源程序中定义的、使用者定义并检验的、在处理系统中以编程语言预先准备的、以指令代码形式预先准备的过程、函数或子程序至少一部分变换为可以存储在主存储器的任意存储区中的一种形式的过程变换装置,在主存储器的该存储区中按照在数据处理系统中实际使用的形式存储目标程序;程序变换装置将源程序变换为目标程序,关于目标程序,把使用者在源程序中定义的过程、函数或子程序变换为一种可以存储在主存储器的任意区中的形式,链接装置根据排列信息,通过链接在过程变换装置变换的过程、函数或子程序和在程序变换装置中获得的目标程序产生一个最终目标程序。
从下面给出的详细描述中可以对本发明的其它目的,特征和优点有更清楚的了解。
通过下面给出的详细说明和本发明优选实施例的附图可以更充分地理解本发明,但是,不应当把优选实施例的附图作为对本发明的限制,而只是帮助解释和理解。
在附图中图1是显示根据本发明的程序变换系统的第一实施例的结构的方框图;图2是显示图1的程序变换系统的第一实施例中使用的一个源程序的实例的示意图;图3是显示图1的程序变换系统的第一实施例的操作的流程图;图4是显示图1的程序变换系统的第一实施例中优化部分的一个过程的排列优化处理的流程图;图5是显示被过程A至G占据的高速缓存行的数量的一个实例的示意图;图6是显示由优化部分产生的过程调用图的实例的示意图;图7是说明图1中所示的程序变换系统的第一实施例中优化部分中过程的排列优化处理的示意图;图8是显示一个排列信息的实例的示意图;图9是说明在不执行过程的排列优化处理时将要造成的缺陷的说明示意图;图10是显示在图6的过程调用图中过程C和D是标准库过程的情况的示意图;图11是用于解释在标准库过程被置于过程排列优化处理目的之外的情况中的缺陷的示意图;图12是显示根据本发明的程序变换系统的第二实施例的结构的方框图;图13是显示根据本发明的程序变换系统的第三实施例的结构的方框图;图14是显示图13的程序变换系统的第三实施例的操作的流程图;图15是显示现有程序变换系统的结构的第一实例的方框图;图16是显示现有程序变换系统的结构的第二实例的方框图;图17是用于解释在一个直接映像方法中高速缓冲存储器与主存储器之间的关系的示意图;图18是显示一个要在现有技术中使用的源程序是用C语言表达的情况的一个实例的示意图;和图19是用于解释过程在高速缓冲存储器中冲突的解释性示意图。
以下参考附图通过本发明的优选实施例对本发明进行详细地讨论。在以下的说明中,提出了大量的特定细节,以便提供对本发明的彻底理解。但是,熟悉本领域的技术人员应当明白,可以不用这些特定细节实现本发明。在其它实例中,没有详细地示出众所周知的结构,以避免使本发明模糊。(第一实施例)图1是显示根据本发明的程序变换系统的第一实施例的结构的方框图。
程序变换系统的所示实施例一般是由第一至第四程序存储部分31至34,编译器35,链接器36,剖析器37,第一和第二信息存储部分38和39,优化部分40,第一和第二库存储部分41和42,以及库产生部分43构成的。
第一程序存储部分31是由包括ROM,RAM等的半导体存储器、FD(软盘)、HD(硬盘)、CD-ROM之类的存储介质构成的。在第一程序存储部分31中,预先存储了一个由C语言之类的编程语言描述的源程序。在所示实施例中,将针对C语言作为编程语言的情况进行讨论。
编译器35把源程序编译为可再排列的目标程序,并随后变换为可每个过程排列的可再排列目标程序,以存储在第二程序存储部分32中。在这里,可再排列目标程序是一个可以存储在主存储器的任何存储区中的目标程序。此外,可每个过程排列的意思是能够在可再排列目标程序内进行过程的排列。
应当指出,在所示实施例中,如同前面所指出的,过程一般不仅代表原始意义上的过程,而且代表函数和子程序。在过程中,包括使用者过程,使用者库过程,标准库过程,运行时库过程,等等。
在这里,使用者过程是一个使用者在源程序中定义的过程。例如,当使用者准备图2中所示的源程序时,过程func,func1和func2都是使用者过程。
使用者库过程源于使用者过程,并被考虑为具有高的普遍应用性,因而在经过调试之类的检验后存储在第一库存储部分41。例如,当把图2中所示源程序编译为可再排列目标程序后利用调适之类的处理把源程序存储在第一库存储部分41中时,所有的过程func,func1和func2都成为使用者库过程。标准库过程是预先在一种诸如编译器之类的以编程语言描述源程序的处理系统中准备的,并且可以不经使用者定义而使用的过程。例如,在C语言中,用于输出一个字符串作为标准输出的过程prinff,用于返回字符串的长度的过程strlen等,都是标准库过程。
运行时库过程是预先用指令代码描述的形式的、用于大代码量、一般应用性高的,并且预先存储在第一库存储部分41中的过程。如果编译器35在每次产生目标程序时产生指令代码,那么具有高的一般应用性和大代码量的指令串必然是低效率的。因此,把这种指令串预先建立为用指令代码描述的过程,使得在产生目标程序时能够产生一个调用这种过程的代码。然后,通过链接器36链接这种过程。例如,无视执行最终目标程序的CPU之类的器件没有十进制浮点运算的指令的实事,在源程序中说明了浮点型参数或运算,编译器35利用包括多个诸如浮动过程加,浮动过程减之类的指令串产生目标程序。浮动过程加或浮动过程减是运行期库过程。
第二程序存储部分32是由包括RAM之类的半导体存储器,FD,HD等的存储介质构成的,并且存储可每个过程排列的可再排列目标程序。
链接器36建立存储在第二程序存储部分32中的可每个过程排列的可再排列目标程序和存储在第二库存储部分42中的可每个过程排列的可再排列库(以后将对其进行讨论)之间的链接,以产生一个可执行临时目标程序存储在第三程序存储部分33中。与之结合,根据存储在第二信息存储部分39中的排列信息(以后将对其进行讨论),在可每个过程排列的可再排列目标程序与可每个过程排列的可再排列库之间建立链接,以产生一个可执行最终目标程序,存储在第四程序存储部分34中。
第三程序存储部分33是由一种诸如包括RAM等的半导体存储器,FD,HD之类的存储介质构成的,并且存储临时目标程序。第四程序存储部分34是由一种诸如包括RAM等的半导体存储器,FD,HD之类的存储介质构成的,并且存储最终目标程序。
剖析器37是由一个硬件仿真器,一个软件仿真器等构成的,并且利用执行从第三程序存储部分33读出的临时目标程序收集包括过程之间的调用关系、各过程的调用次数、循环结构信息等在内的动态信息(剖析信息)。然后,把这样得到的动态信息存储在第一信息存储部分38中。
在这里,循环结构信息是指示在该循环结构中调用的一个特定过程的信息。具体地讲,是写在源程序的循环结构中的使得在剖析器37的操作过程中能够识别出循环结构的起点和终点的特定标记。通过剖析器37利用标记识别循环结构的起点和终点,可以识别出在循环结构中调用的过程是在该循环结构中。这样就能够判断过程在循环结构内相继执行的可能性是高的。
第一信息存储部分38是由一种诸如包括RAM等的半导体存储器,FD,HD之类的存储介质构成的,并且存储动态信息。
优化部分40根据存储在第一信息存储部分38中的动态信息进行所有过程的排列优化,以避免将来极有可能相继执行的过程在高速缓冲存储器上的冲突,和避免频繁使用的过程的高速缓存未命中。优化部分40还产生一个用于向链接器36指明过程的排列的排列信息,和把这样产生的排列信息存储在第二信息存储部分39中。
第二信息存储部分39是由一种诸如包括RAM等的半导体存储器,FD,HD之类的存储介质构成的,并且存储排列信息。
第一库存储部分41是由一种诸如包括ROM,RAM等的半导体存储器,FD,HD,CD-ROM之类的存储介质构成的,并且存储包括标准库过程、运行期库过程和使用者库过程在内的可再排列库。在这里,可再排列库是可再排列目标程序。但是,为了与编译器35产生的可再排列目标程序区分开,存储在第一库存储部分41中的可再排列目标程序被称为可再排列库。
库产生部分43把存储在第一库存储部分41中的可再排列库变换为可每个过程排列的可再排列库,存储在第二库存储部分42中。第二库存储部分42是由诸如包括RAM等的半导体存储器,FD,HD之类的存储介质构成的,并且存储可每过程排列的可再排列库。
接下来,参考图3至10讨论具有上述构造的程序变换系统的操作。
首先,在图3中所示的步骤301,库产生部分43把存储在第一库存储部分41中的每个可再排列库变换为可每个过程排列的可再排列库,识别过程单元以存储在第二库存储部分42中。
在一个可再排列库中的作为一组的多个过程一般包括在一节中,例如作为排列的一个单元的文本节(.text.节)。当在链接器36中链接时,把这些过程聚合在一起成为文本节。每个单独的过程不能每个过程独立地排列。因此,通过把每个单独节划分为每过程多个节,可以在链接器36建立链接时适当地排列每个过程。
以下将讨论把可再排列库内的文本节划分成每过程多个节的处理。
首先,由于指示自身过程可以外部使用的全局属性和有关过程属性的符号信息等被加在过程的前端,这些全局属性和符号信息被识别为用来提及一前导地址的前导标记。
接着,根据每个过程的前导标记的识别,新产生每一过程的具有区分名称的节,例如,“过程名_源程序名(procedure name_source programname)”,等等。然后,把可再排列库中的有关各节的信息集中和新近地记录在可再排列库中的一个特定部分,例如,节头部分。如果文本节在可再排列库中是不需要的,那么删除相关的信息。
由于可再排列库具有指示可再排列库中各种信息在各部分的位置的偏移量,当如上述那样加入新节时,必然会造成在信息与偏移量之间的相应的误差。因此,必须更新偏移量。把上述处理过的每个可再排列库存储在第二程序存储部分32中,作为可每过程排列的可再排列库。
在步骤302,编译器35把源程序编译成可再排列目标程序,并随后进行与在步骤301库产生部分43的处理相同的处理,将可再排列库变换为可每过程排列的可再排列库,存储在第二程序存储部分32中。
在步骤303,链接器36在存储于第二程序存储部分32中的可每过程排列的可再排列目标程序与存储于第二库存储部分42中的可每过程排列的可再排列库之间进行链接,以产生可执行临时目标程序,存储在第三程序存储部分33中。
在步骤304,剖析器37利用执行从第三程序存储部分33读出的临时目标程序,收集包括各过程之间的调用关系、各过程的调用次数、循环结构信息等等的动态信息。剖析器37把这样得到的动态信息存储在第一信息存储部分38中。
在步骤305,优化部分40根据存储在第一信息存储部分38中的动态信息进行对所有过程的排列优化,以产生排列信息,存储在第二信息存储部分39中。以后将讨论过程排列优化的细节。
在步骤306,链接器36在可每过程排列的可再排列目标程序与可每过程排列的可再排列库之间建立链接,以产生可执行最终目标程序,存储在第四程序存储部分34中。此后,结束这一处理序列。
接下来,参考图4至10讨论优化部分40的过程排列优化处理。
存在着各种有效利用高速缓冲存储器的过程的排列优化方法。在所示的实施例中,使用了A.H.Hasemi等在“利用高速缓存行着色的有效过程映像”(A.H.Hasemi,et al,“Efficient Procedure Mapping UsingCache Line Coloring”,SIGPLAN,pp 171-182,June,1997)中公开的利用高速缓存行着色的排列方法。
首先,作为前提,从主存储器读出程序变换系统产生的并且存储在主存储器中的目标程序的每个代码,并随后通过直接映像法存储在由四个高速缓存行组成的高速缓冲存储器中。
在要编译的源程序中,顺序描述了七个过程A至G。当把源程序编译成目标程序时,图5中示出了各过程A至G的代码量,要占据的形成高速缓冲存储器的高速缓存行的数量(高速缓存行数)。
另一方面,作为在剖析器37中动态剖析的结果,假设从过程A至过程B的调用频率是“90”,从过程B至过程C的调用频率是“80”,从过程C至过程D的调用频率是“70”,从过程A至过程E的调用频率是“40”,从过程E至过程C的调用频率是“100”,从过程E至过程F的调用频率是“0”,和从过程F至过程G的调用频率是“0”。
利用高速缓存行着色的排列方法减少了在利用以后将讨论的过程调用图的一个产生(从一个过程到其它过程的直接调用关系)中的高速缓冲存储器上的冲突。在排列方法中,为每个高速缓存行指派一种“颜色”,并利用排列所需“颜色”数量,即高速缓存行数,过程在其上排列的“颜色”,和不可用组进行过程的排列。
在所示实施例中,分别将红色(r)指派给第一高速缓存行,绿色(g)指派给第二高速缓存行,蓝色(b)指派给第三高速缓存行,和黄色(y)指派给第四高速缓存行。不可用组是与调用和被调用有直接关系的各个过程,并且被称为已经排列的过程所占据的“颜色”的聚合组。
首先,在图4中所示的步骤401,优化部分40根据存储在第一信息存储部分38中的动态信息产生如图6中所示的过程调用图。在图6中,节点A至G代表过程。节点之间的线代表过程的调用关系。为线所加的数值代表从起始节点,即在箭头路线上的过程,到端点节点,即在箭头尖端的过程的调用频率。
在步骤402,关于过程调用图,线和节点被分为一个具有高调用频率的组和一个具有低调用频率的组。在所示实施例中,如可以从图6中看到的,具有高调用频率的组是由节点A至E、从节点A至节点B的线、从节点A至节点E的线、从节点B至节点C的线、从节点C至节点D的线、和从节点E至节点C的线组成的。另一方面,具有低调用频率的组是由节点F和G,从节点E至节点F的线,和从节点F至节点G的线组成的。
在步骤403,在划分的每个组内重新排列线和节点。即,在具有高调用频率的组中,从加到线上的较大数值开始以降序方式进行再排列。与之形成对照,在具有低调用频率的组中,再排列是以从过程的较大高速缓存行数开始的降序方式进行再排列的,并且主要是为填充程序空间中的空白而排列的。
在所示的实施例中,如从图6可以看到的,在具有高调用频率的组中,线是以从节点E至节点C的线、从节点A至节点B的线、从节点B至节点C的线、从节点C至节点D的线和从节点A至节点E的线的顺序次序排列的。另一方面,在具有低调用频率的组中,如从图6可以看到的,由于过程G的高速缓存行数是2,过程F的高速缓存行数是1,所以节点是以节点G然后节点F的顺序次序排列的。
在步骤404中,进行是否有遗留下的高调用频率组的线的判断。当判断的结果是肯定(“是”)的时候,处理前进到步骤405。此时,由于处理是第一次执行,所有的线都是被遗留的。因此,判断的结果为“是”。
在步骤405,进行遗留线内再排列次序中的最高次序线的两端的节点是否仍未排列的检查。如果结果为是,处理前进到步骤406。在所示的情况中,遗留线内最高次序的线是从节点E至节点C的线,并且由于处理第一次执行,两端的节点E和C仍未排列。因此,判断的结果为“是”。
在步骤406,在彼此相邻地排列了目标线的两端的节点之后,处理前进到步骤407。在本例中,目标线两端的节点可以排列在程序空间的任意位置。在本例中,可以从图5中得知,过程E和C的高速缓存行数都是2。如图7的第一行中所示,过程E的部分E1和E2排列在第一和第二高速缓存行上(颜色是红(r)和绿(g))。过程C的部分C1和C2排列在第三和第四高速缓存行上(颜色是蓝(b)和黄(y))。在这种情况下,考虑合并节点E和C,以形成一个单一的节点。这种单一节点将被称为复合节点E-C。
在步骤407,在更新不能使用的组之后,处理返回到步骤404。
在节点E的场合,在其上节点C是被节点E直接调用关系的高速缓存行的“颜色”是蓝(b)和黄(y),不可用组成为E{b,y}。同样,在节点C的场合,在其上节点E是被节点C直接调用关系的高速缓存行的“颜色”是红(r)和绿(g)。因此,不可用组成为C{r,g}。
重复进行上述步骤404至407的处理,直到具有高调用频率的组内的线中没有其两端节点留下未被排列的线遗留下来。如果在具有高调用频率的组中没有线被遗留下来,步骤404的判断结果成为“否”。那么,处理前进到步骤416。在本例中,由于留下了从节点A至节点B的线,并且两端的节点A和B仍未排列,所以执行步骤406和407的处理。
如从图5可以得知的,过程A和B都具有高速缓存行数1。因此,如图7第一行中所示,过程A被排列在第三高速缓存行(颜色是蓝(b)),过程B被排列在第四高速缓存行(颜色是黄(y))。因而节点A和B成为复合节点A-B。接下来,在节点A的场合,在其上节点B是被节点A直接调用的关系的高速缓存行的“颜色”是黄色(y),不可用组成为A{y}。同样,在节点B的场合,在其上节点A是被节点B直接调用的关系的高速缓存行的“颜色”是蓝色(b),不可用组成为B{b}。
应当注意,在图6中所示的过程调用图中,尽管事实是留下了从节点A至节点E的线,由于在其上节点E被排列在节点A的不可用组中的颜色红(r)与绿(g)的高速缓存行没有被包括。这是因为由于低调用频率次序,还没有处理从节点A至节点E的线。在当前状态下,可能引起有关从节点A至节点E线冲突,处理按照原始线次序进行。因此,当前状态是可接受的。
另一方面,当留下了具有高调用频率组中的线但遗留线的任意一端的节点已经排列的时候,步骤405的判断结果成为“否”。处理前进到步骤408。
在步骤408,进行处理目标的线是否是连接两个不同复合节点中的节点的线的检查。如果在步骤408检查的结果为是,那么处理前进到步骤409。在当前条件下,由于具有遗留下的线中最高次序的从节点B指向节点C的线是连接复合节点E-C和复合节点A-B的线,步骤408的判断结果为是。因此,处理前进到步骤409。
在步骤409,关于作为处理目标的线,两个复合节点被合并为一个单一的复合节点。这是通过把两个复合节点中具有较少合并节点数的复合节点(以后称为短复合节点)耦合到具有较多合并节点数的复合节点(以后称为长复合节点)进行的。在把短复合节点耦合到长复合节点时,即使在程序空间中,也是短复合节点被耦合到长复合节点。
首先,确定要把短复合节点排列在长复合节点的哪一侧。具体地讲,作出在组成长复合节点的节点中,组成处理目标线的节点的中心位置朝向长复合节点的左还是右边界的判断,判断是利用达到左和右边界所需的高速缓存行数进行的。因此,确定短复合节点排列在朝向中心位置的一侧。
接下来,确定和排列排列短复合节点的方向。具体地讲,是这样确定短复合节点的方向的,使得在组成处理目标的线的多个节点中,不是组成长复合节点的节点能够尽可能靠近长复合节点中已经排列的节点排列。在这种场合,如果短复合节点排列引起冲突,把不是组成长复合节点的节点的位置从组成长复合节点的节点偏移,直到解决了冲突。但是,当在不是组成长复合节点的节点的任何排列位置都不能避免冲突时,将不是组成长复合节点的节点的排列位置移回到初始排列位置。然后处理前进到步骤410。
在所示实施例中,复合节点E-C和A-B都有两个合并的节点。因此,两个复合节点都可以作为短复合节点。但是,在所示情况中,把复合节点A-B作为短复合节点。
在组成长复合节点的节点E和C中,形成作为处理目标的从节点B指向节点C的线的节点C的中心位置处于图7的第一行中所示的部分C1和C2之间。因此,到达长复合节点E-C的左侧边界所需的高速缓存行的数量是三,而到达长复合节点E-C的右侧边界所需的高速缓存行的数量是一。因此,把短复合节点A-B排列在长复合节点E-C的右侧。
然后,确定短复合节点A-B的方向,使得在形成作为处理目标的从节点B指向节点C的线的节点B和C中,不是组成长复合节点E-C的节点B位于尽可能靠近已经被排列的节点C的位置。因此,复合节点成为B-A。由于在上述的排列中没有造成冲突,保持这样的排列(见图7的第二行)。由此产生了新的复合节点E-C-B-A。
在步骤410,进行通过上述的排列处理是否在程序空间中形成了空白区的检查。如果在步骤410的检查结果为“否”,那么处理前进到步骤407。在所示情况中,由于没有形成空白区,处理前进到步骤407。接着,在更新了不可用组之后,处理返回到步骤404。
在节点A的场合,由于其上节点B是以直接调用的关系排列的高速缓存行的“颜色”是红(r),不可用组成为A{r}。同样,在节点B的场合,由于节点A以直接调用关系排列于其上的高速缓存行的“颜色”是绿(g),并且由于节点C以直接调用关系排列于其上的高速缓存行的“颜色”是蓝(b)和黄(y),因此,不可用组变为B{g,b,y}(见图7的第二行)。
在另一方面,当在步骤410检查的结果为“是”时,即当通过上述的排列处理在程序空间中形成了空白区时,处理前进到步骤411。
在步骤411,把具有低调用频率组中具有高次序的节点排列在空白区中。此后,处理前进到步骤407。
重复上述步骤404,405,408至411和407的处理,直到发现在具有高调用频率的组的线中没有连接两个相互不同的复合节点中的节点的线,并且任意一侧的节点已经被排列。那么,如果没有遗留具有高调用频率的组的线,步骤404的检查结果为“否”。处理前进到步骤416。
如果具有高调用频率的组的线中没有连接的两个相互不同的复合节点中的节点的线,并且已经排列了任意一侧的节点,步骤408的检查结果为“否”。那么,处理前进到步骤412。
通过上述的处理,处理了从节点E至节点C的线、从节点A至节点B的线、和从节点B至节点C的线。因此,在具有高调用频率的组中,留下了从节点C至节点D的线和从节点A至节点E的线。但是,这些线不是其中一个节点已经被排列的线,并且不连接两个不同复合节点。因此,在步骤408的检查结果为“否”。因此,处理前进到步骤412。
在步骤412,检查是否组成作为处理目标的线的两个节点中的一个节点组成复合节点,并且另一个节点还没有排列。如果在步骤412的检查结果为“是”,那么处理前进到步骤413。在本例中,在剩余的线中具有最高次序的从节点C至节点D的线具有组成复合节点E-C-B-A的节点C,和还没有排列的节点D。因此,在步骤412的检查结果为“是”。因而处理前进到步骤413。
在步骤413,使处理目标线的未排列节点与复合节点耦合。一旦未排列节点耦合于复合节点,未排列节点即使在程序的空间上也与复合节点耦合。
首先,确定把未排列节点排列在复合节点的哪一侧。具体地讲,是判断在组成复合节点的节点中,是在复合节点的左边界还是右边界包括了组成处理目标线的节点的中心位置,判断是通过到达左和右边界所需的高速缓存行数作出的。于是,确定把未排列节点排列在朝向中心位置的一侧。
在这种情况下,如果未排列节点的排列造成冲突,那么使不是组成复合节点的节点从组成复合节点的节点偏移,直到解决冲突。但是,当在不是组成复合节点的节点的任何排列位置都不能避免冲突时,把不是组成复合节点的节点的排列位置返回到初始排列位置。然后,处理前进到步骤410。
在组成复合节点E-C-B-A的节点E,C,B,A中,从节点C至节点D的处理目标线的中心位置,如图7的第一行所示,在部分C1和C2之间。因此,到达复合节点E-C-B-A的左边界所需的高速缓存行数是三,而到达复合节点E-C-B-A的右边界所需的高速缓存行数也是三。所以,可以把未排列节点排列在复合节点E-C-B-A的左右任意一侧。在所示的情况中,确定把节点D排列在复合节点E-C-B-A的左侧。
在这种情况下,当节点D的部分D1和D2紧接着节点E的部分E1的左侧时,在节点D的部分D1和D2与节点C的部分C1和C2之间可能会造成冲突。因此,为了避免冲突,把节点D的部分D1和D2排列在离开节点E的部分E1的两个高速缓存行距离的位置上(见图7的第三行)。
接下来,在这种场合,相当于两个高速缓存行的空白区形成在节点D的部分D1和D2的右侧。那么,在步骤410的验查结果为“是”。因此,处理前进到步骤411。
在步骤411,在节点D的部分D1和D2右侧的两个高速缓存行的空白区中,排列具有低调用频率组中的具有最高次序的节点。在所示情况中,在上述空白区中排列节点G(见图7的第四行)。接着,在更新了不可用组后,处理前进到步骤407。然后,处理返回到步骤404。在节点D的场合,其上的节点C被节点D直接调用的高速缓存行的“颜色”是蓝(b)和黄(y),不可用组变为D{b,y}(见图7的第三行)。
重复进行上述步骤404,405,408,412,413,410,411和407的处理,直到发现在具有高调用频率组的遗留线中没有这样的线,其不连接两个相互不同的复合节点中的节点,而是连接相对两端的节点之一,该线的一个节点组成复合节点而另一侧的节点尚未排列,并且任意一端的节点已经排列。那么,如果没有留下的具有高调用频率组的线,在步骤404的检查结果为“否”。处理前进到步骤416。
如果发现在具有高调用频率组的遗留线中没有这样的线,其不连接两个相互不同的复合节点中的节点,而连接相对两端的节点之一,该线的一个节点组成复合节点而另一侧的节点尚未排列,并且任意一端的节点已经排列。在骤412检查的结果为“否”。那么,处理前进到步骤414。
通过上述处理,处理了从节点E至节点C的线,从节点A至节点B的线,从节点B至节点C的线,和从节点C至节点D的线。因此,在具有高调用频率的组中,仅留下了从节点A至节点E的线。但是,这个线不是具有高调用频率组的遗留线中的不连接两个相互不同的复合节点中的节点,而是连接线相对两端的节点之一的线,该线的一个节点组成复合节点而另一侧的节点尚未排列,并且任意一端的节点已经排列。因此,在步骤412的检查结果为“否”。那么,处理前进到步骤414。
在步骤414,检查是否组成处理目标线的两个节点中的一个节点组成了复合节点,而另一个节点尚未排列。如果在步骤414的检查结果为“是”,处理前进到步骤415。在本例中,在遗留线中有最高的次序的从节点A至节点E的线,具有组成复合节点E-C-B-A的两个节点,并且节点E尚未排列。因此,在步骤414的检查结果为“是”。那么,处理前进到步骤415。
在步骤415,消除组成处理目标线的节点之间的冲突。即,如果在组成处理目标线的节点之间产生冲突,将最靠近复合节点边界的一个节点向边界以外偏移,直到解决了冲突。但是,当在该节点的任何偏移位置都不能避免冲突时,把该节点返回到最初排列的位置。然后,处理前进到步骤410。
在所示实施例中,处理目标线是从节点A至节点E的线。可以从图7的第四行看到,在节点A与E之间造成冲突。在组成从节点A至节点E的线的节点A和E中,节点A更靠近复合节点E-C-B-A的边界。因此,把节点A偏移到边界之外。在所示情况中,由于可以通过把节点A偏移一高速缓存行避免冲突,因而将节点A排列在偏移一高速缓存行的位置上(见图7的第五行)。
接下来,在所示情况下,在节点A的右侧形成了一高速缓存行的空白区。因此,在步骤410的判断结果为“是”。因而处理前进到步骤411。
在步骤411,节点A右侧的一高速缓存行的空白区中,排列遗留在具有低调用频率组中的节点。在本例中,排列节点F之后(见图7的第六行),处理前进到步骤407。在更新不可用组之后,处理返回到步骤404。在节点A的场合,在其上节点E和B是以被节点A直接调用的关系排列的高速缓存行的“颜色”是红(r)和绿(g),不可用组变为A{r,g}(见图7的第五行)。同样,在节点B的场合,在其上节点C是以被节点B和节点A直接调用的关系排列的高速缓存行的“颜色”是蓝(b)和黄(y)。因此,不可用组成为B{b,y}(见图7的第五行)。
重复进行上述步骤404,405,408,412,414,415,410,411和407的处理,直到没有留下连接同一复合节点中的节点的线。如果没有遗留的具有高调用频率组中的线,步骤404判断的结果为“否”。那么处理前进到步骤416。
在步骤416,关于具有低调用频率的组中的剩余节点,排列是通过简单的深度优先选取进行的。当通过上述处理将多个复合节点相互排列开时,根据调用的频率给每个复合节点赋予优先次序,以确定最后的排列。然后,处理序列结束。
在图8中示出了通过上述过程的排列优化处理得到的排列信息的一个实例。
作为前提,假设过程A和B包括在一个文件名为“test1.o”的源程序文件中,函数E,F和G包括在一个文件名为“test2.o”的源程序文件中,过程C和D是包括在文件名为“1ibc.a”的库文件中的标准库过程。此外,还假设一个高速缓存行的大小为32字节(0×20)。
在图8中,“GROUP1”是在把输出节作为一组处理的情况中给予的段名。“! LOAD”代表一个段的类型。这个字段是固定的。在所示情况中,“LOAD”代表要在存储器中装载的段。“ RX”代表一个段的属性,它显示了段的读出/写入/执行属性。在一个指令部分(文本代码)的情况下,它固定为“ RX”。“A0×1000”代表对准条件,对准条件表示当段在存储空间排列时的对准条件。在所示情况中,示出了对准条件为“0×1000”的情况。
另一方面,“_D_LIB”,“_G_test2”等是代表通过耦合相同类型和属性的输入节形成的组的输出段名。“$PROGBITS”代表输入节的类型。在文本代码的场合,输入节的类型固定为“$PROGBITS”。“?AX”代表表示存储器的占据/可写/可执行等属性的节属性。在文本代码的场合,它固定为“ AX”。
“A0×20”代表在输出节中排列输入节时的对准条件。由于出于每高速缓存行排列的考虑,对准条件是作为一个高速缓存行的大小的0×20。“_D_test1”,“_G_test2”等代表要在输出节中排列的输入节的名。“1ibc.a”,“test2.0”等代表包括在输入节中的文件名。当输出节是由多个文件的相同输入节集合形成的时候,可以描述多个文件名。
如上所述,通过提供每个过程的输入节名,利用排列条件可以指定过程的排列顺序。如上所述,利用所示实施例的结构,在剖析器37剖析时,向把可再排列库变换为可每过程排列的可再排列库的库产生部分43提供了有关所有过程的收集动态信息,根据动态信息产生确定所有过程的优化排列的排列信息,和根据排列信息排列所有过程。因此,可以减少高速缓冲存储器上所有组成目标程序的过程之间的冲突。与之结合,可以减少频繁使用的过程的高速缓存丢失。借此,在计算机或CPU执行目标程序时可以提高执行速度。
在这方面,当要编译的源程序中包括七个过程并且是以顺序次序描述的时候,把源程序编译成目标程序时A至G各过程的高速缓存行数如图5中所示,如果根本不提供优化部分40进行的过程的排列优化处理,源程序中的过程A至G以描述的次序编译成目标程序。因此,如图9中所示,造成过程C与E之间产生冲突。
另一方面,在本发明中,不区分过程的类型,所有过程同样地处理并且排列是可每过程排列的,完全消除冲突的可能性高。在如图6中所示的过程调用图中,如图10中所示,过程C和D是标准库过程。如在现有技术中,如果把过程C和D置于过程的排列优化处理目标之外,即使在使用上述发表的文献中公开的高速缓存行着色法,由于下面的原因,也不可能完全避免冲突。在现有技术中,当在源程序中描述了多个标准库过程的一个调用指令时,一旦要在链接器中建立链接,从库存储部分读出多个对应的标准库过程,并集中地排列在现有技术主存储器的特定存储区中。这不可能指明每个过程的排列。
图11示出了在把标准库过程C和D排除在过程排列优化处理之外的情况中,优化部分进行的过程的排列优化处理的方法。在这种情况中,由于标准库过程C和D被排除在排列优化处理之外,从过程E至过程C的线和从过程B至过程C的线自然也被排除在处理之外。因此,如图11的第五行中所示,可以避免过程E和过程C的冲突。(第二实施例)以下讨论根据本发明的程序变换系统的第二实施例。
图12是显示根据本发明的程序变换系统的第二实施例的结构的方框图。在图12中,与图1中所示的相同元件用相同的参考号标识,并且忽略了对这些相同元件的详细描述,以便避免冗长的描述,保证描述足够简明,以便于对本发明的清晰理解。
在图12所示的程序变换系统的所示实施例中,除了库产生部分43之外也为存储在第一库存储部分41中的可再排列库提供了链接器36。以下是提供这种构造的原因。
即,当可再排列库的数量很大时,要用很长的时间把存储在第一库存储部分41中的可再排列库变换为可每过程排列的可再排列库。
因此,对于可再排列库的一部分,不用库产生部分43把可再排列库变换为可每过程排列的可再排列库,而通过链接器36建立对可每过程排列的可再排列库的直接链接。
在这种情况下,例如,可以用链接器36根据存储在第一信息存储部分38中的动态信息或每个过程的代码量判断直接提供给链接器36的可再排列库。
如上所述,利用上述构造,可以在比第一实施例更短的时间内产生最终目标程序。(第三实施例)以下将讨论根据本发明的程序变换系统的第三实施例。
图13是显示根据本发明的程序变换系统的第三实施例的结构的方框图。在图13中,与图12中所示相同的元件用相同的参考号标识,并忽略了对这些相同元件的详细描述,以便避免冗长的描述,保证描述足够简明,以便于对本发明的清晰理解。
在程序变换系统的第三实施例中,新提供了一个编译器44和一个剖析器45,替代图12中所示的编译器35和剖析器37。
与图12中所示的剖析器37不同,剖析器45仅具有简单地读出存储在第三程序存储部分33中的可执行临时目标程序和执行读出的临时目标程序的功能。另一方面,在把源程序编译为可执行临时目标程序时,编译器44把一个计算剖析器45执行临时目标程序时实际执行的过程的次数的计数代码插入到临时目标程序中。借此,剖析器45可以通过执行临时目标程序收集包括过程之间调用关系,各过程的调用次数等的动态信息,并把得到的动态信息存储在第一信息存储部分38中。
以下将参考图14讨论上述构造的程序变换系统的第三实施例的操作。
首先,在图14所示的步骤1401中,编译器44把从第一程序存储部分31读出的源程序(见图2)编译成带有插入计数代码的可执行临时目标程序,存储在第二程序存储部分32中。
在步骤1402,链接器36建立存储在第二程序存储部分32中的插入了计数代码的临时目标程序与存储在第一库存储部分41中的可再排列库之间的链接,以产生可执行临时目标程序,存储在第三程序存储部分33中。
在步骤1403,剖析器45执行从第三程序存储部分33中读出的临时目标程序。在这种情况中,由于计数代码插入在临时目标程序中,因而收集了由过程之间的调用关系、每个过程的调用次数等构成的动态信息。把得到的动态信息存储在第一信息存储部分38中。
在步骤1404,优化部分40根据存储在第一信息存储部分38中的动态信息,通过进行对所有过程的排列优化产生排列信息,存储在第二信息存储部分39中。步骤1404的处理实际上与第一实施例中步骤305的处理相同。因此,省略了对这一步骤的详细描述,以便避免冗长的描述,保证描述足够简明,以便于对本发明的清晰理解。
在步骤1405,库产生部分43通过识别每个过程把存储在第一库存储部分41中的可再排列库变换成可每过程排列的可再排列库,存储在第二库存储部分42中。步骤1405的处理实际上与第一实施例中步骤301的处理相同。因此,省略了对这一步骤的详细描述,以便避免冗长的描述,保证描述足够简明,以便于对本发明的清晰理解。
在步骤1406,编译器35把源程序编译为可再排列目标程序,并随后用与在步骤1405中库产生部分43的处理方法相同的处理,变换成可每过程排列的可再排列目标程序,存储在第二程序存储部分32中。
在步骤1407,链接器36根据存储在第二信息存储部分39中的排列信息建立可每过程排列的可再排列目标程序与可每过程排列的可再排列库之间的链接,以产生可执行最终目标程序,存储在第四程序存储部分34中。此后,处理序列结束。
利用上述实施例的构造,即使剖析器45没有收集动态信息的功能,也能获得与第一实施例实际相同的效果。
尽管本发明是通过它的示范实施例图示和说明的,但是熟悉本领域的技术人员应当懂得,可以对其进行上述和各种其它改变、删除和添加,而不脱离本发明的精神和范围。因此,不应当认为本发明仅限于上述特定实施例,而是包括有关附属权利要求中提出的特征的,能够在包含范围内实现的所有可能的实施例及其等同物。
例如,尽管本发明在上述实施例中,是以用于从一个源程序产生一个最终目标程序的范例图示和说明的,但不应当把本发明限于说明的实施例。即,理所当然,本发明可以用在把多个源程序编译成各自的可再排列目标程序,然后用链接器36链接产生的可再排列目标程序以产生一个最终目标程序这样的场合。
另一方面,在上述的各实施例中,各程序存储部分31至34,各信息存储部分38和39和库存储部分41和42是用相互不同的存储介质构成的。但是,本发明并不限于所示实施例。也就是说,各存储部分可以用共同的存储介质的不同存储区形成。
在这种情况下,各程序存储部分31至34和库存储部分41和42是存储需要相对大的存储容量的程序或可再排列库,因此可以用FD,HD或CD-ROM构成。另一方面,由于各信息存储部分38和39是存储需要相对小的存储容量的数据,这些信息存储部分38和39可以用诸如RAM,ROM之类的半导体存储器形成。
另一方面,在上述实施例中的各装置是以硬件构造说明的。本发明并不限于所述实施例中显示的构造。也就是说可以用具有CPU(中央处理器)、ROM、RAM之类的内存储器、FDD(软盘驱动器)、HDD(硬盘驱动器)、CD-ROM驱动器之类的外存储器以及输出装置和输入装置的计算机构成程序变换系统,上述编译器35和44,链接器36和剖析器37和45可以由CPU构成,并且可以把实现上述功能的程序变换程序存储在诸如包括ROM等的半导体存储器或FD、HD、CD-ROM之类的存储介质中。
在这种情况下,上述内存储器或外存储器可以作为各程序存储部分31至34,各信息存储部分38和39,以及库存储部分41和42使用。把程序变换程序从存储介质装载到CPU,以控制CPU的操作。CPU响应程序变换程序的启动,发挥编译器35和44、链接器36和剖析器37和45的功能。在程序变换程序的控制下,执行上述处理。
如上所述,利用上述本发明的构造,可以避免高速缓冲存储器上各种过程之间的冲突。也可以防止频繁使用的过程的高速缓存丢失。借此,当计算机或CPU执行时,可以加快执行速度。
尽管本发明是通过它的示范实施例图示和说明的,但是熟悉本领域的技术人员应当懂得,可以对其进行上述和各种其它改变,删除和添加,而不脱离本发明的精神和范围。因此,不应当认为本发明仅限于上述特定实施例,而是包括有关附属权利要求中提出的特征的,能够在包含范围内实现的所有可能的实施例及其等同物。
权利要求
1.程序变换方法,用于把由编程语言描述的源程序变换为数据处理系统可执行语言所描述的目标程序,该程序变换方法包括第一处理,将所述源程序中使用的至少一部分过程、函数或子程序变换为一种使得所述目标程序可以被存储在所述数据处理系统的主存储器的任意存储区内的形式;第二处理,根据在所述源程序变换为所述目标程序的处理过程中获得的有关于所述过程、函数或子程序的信息,在所述主存储器的存储区中对应于一高速缓冲存储器的高速缓存行的所述存储区内排列所述第一处理中变换的或未变换的过程、函数或子程序,而不造成高速缓存冲突;和第三处理,根据排列的结果产生所述目标程序。
2.如权利要求1所述的程序变换方法,其中所述过程、函数或子程序至少是使用者在所述源程序中定义的、使用者定义并检验的、以所述编程语言在一处理系统中预先准备的、和以指令代码形式预先准备的过程、函数或子程序中的一种。
3.如权利要求1所述的程序变换方法,其中所述信息是通过执行从所述源程序变换的一个临时目标程序得到的,并且是由指示所述过程、函数或子程序实际被调用的次数的信息和指示过程、函数或子程序之间的调用关系的信息组成的。
4.如权利要求1所述的程序变换方法,其中所述信息是通过执行从所述源程序变换的一个临时目标程序得到的,并且是由指示所述过程、函数或子程序实际被调用的次数的信息和指示过程、函数或子程序之间的调用关系的信息组成的,在所述第二处理中,所述过程、函数或子程序根据调用频率被划分为多个组,和将所述过程、函数或子程序排列在所述主存储器的存储区中对应于一个高速缓冲存储器的高速缓存行的所述存储区内。
5.程序变换方法,用于把由编程语言描述的源程序变换为数据处理系统可执行语言描述的目标程序,该程序变换方法包括第一处理,当在所述数据处理系统中使用所述目标程序时,将所述源程序中使用的过程、函数或子程序的至少一部分变换为一种在所述数据处理系统的一个主存储器的任意存储区中存储的形式;第二处理,将所述源程序变换为所述目标程序,和与之结合,关于所述目标程序,把所述源程序中使用者定义的过程、函数或子程序变换为可在所述主存储器的任意区中存储的形式;第三处理,链接所述第一处理中变换的过程、函数或子程序和所述第二处理中获得的目标程序;第四处理,利用执行通过所述第三处理得到的目标程序,收集由指示过程、函数或子程序实际被调用的次数的信息和指示所述过程、函数或子程序之间的调用关系的信息构成的动态信息;第五处理,根据所述动态信息,在所述主存储器的存储区中对应于高速缓冲存储器的高速缓存行的所述存储区中排列所述过程、函数或子程序,同时避免高速缓存冲突;和第六处理,根据所述排列信息,通过链接所述第一处理中变换的所述过程、函数或子程序和在所述第二处理中获得的目标程序产生最终目标程序。
6.如权利要求5所述的程序变换方法,其中所述过程、函数或子程序至少是使用者在所述源程序中定义的、使用者定义并检验的、以所述编程语言在一处理系统中预先准备的,和以指令代码形式预先准备的过程、函数或子程序中的一种。
7.如权利要求5所述的程序变换方法,其中在所述第二处理中,所述过程、函数或子程序根据调用频率被划分为多个组,和将所述过程、函数或子程序排列在所述主存储器的存储区中对应于一个高速缓冲存储器的高速缓存行的所述存储区内。
8.程序变换方法,用于把由编程语言描述的源程序变换为数据处理系统可执行语言描述的目标程序,该程序变换方法包括第一处理,将所述源程序变换为一个临时目标程序,和与之结合,在执行所述临时目标程序时,插入对所述过程、函数或子程序实际被调用的次数计数的代码;第二处理,把使用者在所述源程序中定义的、使用者定义并检验的、在处理系统中以所述编程语言预先准备的、和以指令代码形式预先准备的过程、函数或子程序中的一个与通过所述第一处理获得的所述临时目标程序链接;第三处理,利用执行通过所述第二处理得到的目标程序,收集由指示过程、函数或子程序实际被调用的次数的信息和所述过程、函数或子程序之间的调用关系的信息组成的动态信息;第四处理,根据所述动态信息,在所述主存储器的存储区中对应于高速缓冲存储器的高速缓存行的所述存储区中排列所述过程、函数或子程序,同时避免高速缓存冲突;和第五处理,在所述源程序中将被使用的过程、函数或子程序中由使用者在所述源程序中定义的一个、由使用者定义并检验的一个、在处理系统中以所述编程语言预先准备的一个、和以指令代码形式预先准备的一个中至少一部分变换为可在所述主存储器的任意存储区中存储的一种形式,其中所述目标程序按照在所述数据处理系统中实际使用的形式存储;第六处理,在把所述源程序变换为所述目标程序之后,关于所述目标程序,把使用者在所述源程序中定义的过程、函数或子程序变换为一种可在所述主存储器的任意区中存储的形式;第七处理,根据所述排列信息,通过链接在所述第五处理中变换的所述过程、函数或子程序和在所述第六处理中获得的目标程序产生最终目标程序。
9.如权利要求8所述的程序变换方法,其中在所述第四处理中,所述过程、函数或子程序根据调用频率被划分为多个组,和将所述过程、函数或子程序排列在所述主存储器的存储区中对应于一个高速缓冲存储器的高速缓存行的所述存储区内。
10.程序变换系统,用于把由编程语言描述的源程序变换为数据处理系统可执行语言描述的目标程序,所述程序变换系统包括;过程变换装置(43),用于将所述源程序中使用的过程、函数或子程序的至少一部分变换为一种使得所述目标程序可以被存储在所述数据处理系统的主存储器的任意存储区中的形式;优化装置(40),用于根据在所述源程序至所述目标程序的变换处理过程中获得的有关所述过程、函数或子程序的信息,把在所述过程变换装置中变换的或未变换的过程、函数或子程序排列在所述主存储器存储区中对应于一个高速缓冲存储器的高速缓存行的所述存储区内,而不会造成高速缓存冲突;和产生装置(36),用于根据排列的结果产生所述目标程序。
11.如权利要求10所述的程序变换系统,其中所述过程、函数或子程序是使用者在所述源程序中定义的、使用者定义并检验的、预先在处理系统中以所述编程语言准备的,和预先以指令代码形式准备的过程、函数或子程序的至少一种。
12.如权利要求10所述的程序变换系统,其中所述信息是通过执行从所述源程序变换来的临时目标程序而获得的,并且是由指示过所述过程、函数或子程序实际被调用的次数的信息和指示过程、函数或子程序之间的调用关系的信息构成的。
13.如权利要求10所述的程序变换系统,其中所述信息是通过执行从所述源程序变换来的临时目标程序而获得的,并且是由指示过所述程、函数或子程序实际被调用的次数的信息和指示过程、函数或子程序之间的调用关系的信息构成的,在所述优化装置(40)中,根据调用频率把所述过程、函数或子程序划分为多个组,和将所述过程、函数或子程序排列在所述主存储器存储区中的对应于一个高速缓冲存储器的高速缓存行的所述存储区内。
14.程序变换系统,用于把由编程语言描述的源程序变换为数据处理系统可执行语言描述的目标程序,所述程序变换系统包括过程变换装置(43),用于将所述源程序中使用的过程、函数或子程序的至少一部分变换为一种当所述目标程序在所述数据处理系统中使用时用于在所述数据处理系统的主存储器的任意存储区中存储的形式;程序变换装置(35),用于把所述源程序变换为所述目标程序,和与之结合,关于所述目标程序,把使用者在所述源程序中定义的过程、函数或子程序变换为一种可以存储在所述主存储器的任意存储区中的形式;链接装置(36),用于链接在所述过程变换装置中变换的过程、函数或子程序和在所述程序变换装置中获得的目标程序;动态信息收集装置(37),用于利用执行通过所述链接装置获得的目标程序,收集由指示过程、函数或子程序实际被调用的次数的信息和指示过程、函数或子程序之间的调用关系的信息构成的动态信息;和优化装置(40),用于根据所述动态信息,在所述主存储器存储区中对应于高速缓冲存储器的高速缓存行的所述存储区中排列所述过程、函数或子程序,同时避免高速缓存冲突;所述链接装置(36)根据所述排列信息,通过链接在所述过程变换装置变换的所述过程、函数或子程序和在所述程序变换装置获得的目标程序产生最终目标程序。
15.如权利要求14所述的程序变换系统,其中所述优化装置(40),根据调用频率把所述过程、函数或子程序划分为多个组,和将所述过程、函数或子程序排列在所述主存储器存储区中的对应于一个高速缓冲存储器的高速缓存行的所述存储区内。
16.程序变换系统,用于把由编程语言描述的源程序变换为数据处理系统可执行语言描述的目标程序,所述程序变换系统包括程序变换装置(35),用于将所述源程序变换为一临时目标程序,和与之结合,在执行所述临时目标程序时,插入计算所述过程、函数或子程序被实际调用的次数的代码;链接装置(36),用于将所述源程序中使用者定义的、使用者定义并检验的、在处理系统中以所述编程语言预先准备的、和以指令代码形式预先准备的过程、函数或子程序中的一个与通过所述程序变换装置获得的所述临时目标程序链接;动态信息收集装置(37),用于利用执行通过所述链接装置获得的目标程序,收集由指示过程、函数或子程序实际被调用的次数的信息和指示所述过程、函数或子程序之间的调用关系的信息构成的动态信息;优化装置(40),用于根据所述动态信息,在所述主存储器存储区中对应于高速缓冲存储器的高速缓存行的所述存储区内排列所述过程、函数或子程序,同时避免高速缓存冲突;和过程变换装置(43),用于把要在所述源程序中使用的过程、函数或子程序中的一个由使用者在所述源程序中定义的、使用者定义并检验的、在处理系统中以所述编程语言预先准备的、以指令代码形式预先准备的过程、函数或子程序中至少一部分变换为可以存储在其中存储着要在所述数据处理系统中实际使用的所述目标程序的所述主存储器的任意存储区中的一种形式;所述程序变换装置(35)将所述源程序变换为所述目标程序,关于所述目标程序,把使用者在所述源程序中定义的过程、函数或子程序变换为一种可以存储在所述主存储器的任意区中的形式,并且所述链接装置(36)根据所述排列信息,通过链接在所述过程变换装置变换的所述过程、函数或子程序和在所述程序变换装置中获得的目标程序产生一个最终目标程序。
17.如权利要求16所述的程序变换系统,其中在所述优化装置(40)中,根据调用频率把所述过程、函数或子程序划分为多个组,和将所述过程、函数或子程序排列在所述主存储器存储区中的对应于一个高速缓冲存储器的高速缓存行的所述存储区内。
全文摘要
一种用于把源程序变换为数据处理系统可执行语言描述的目标程序的程序变换方法,包括将所述源程序中使用的至少一部分过程、函数或子程序变换为一种使得目标程序可以被存储在数据处理系统的主存储器的任意存储区中的形式;根据上述处理过程获得的有关于过程、函数或子程序的信息,在主存储器对应于一高速缓冲存储器的高速缓存行的存储区中设置在第一处理中变换的或未变换的过程、函数或子程序,而不造成高速缓存冲突;和根据排列的结果产生目标程序。
文档编号G06F12/08GK1228558SQ9910082
公开日1999年9月15日 申请日期1999年2月23日 优先权日1998年2月16日
发明者磯崎博子 申请人:日本电气株式会社
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1