CN1160624C - 分配堆栈槽的方法与装置 - Google Patents
分配堆栈槽的方法与装置 Download PDFInfo
- Publication number
- CN1160624C CN1160624C CNB001070142A CN00107014A CN1160624C CN 1160624 C CN1160624 C CN 1160624C CN B001070142 A CNB001070142 A CN B001070142A CN 00107014 A CN00107014 A CN 00107014A CN 1160624 C CN1160624 C CN 1160624C
- Authority
- CN
- China
- Prior art keywords
- source code
- stack
- interference
- register
- duplicate instructions
- 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
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/441—Register allocation; Assignment of physical memory space to logical memory space
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本文披露了用于分配和使用堆栈空间的方法及装置。按照本发明的一个方面,一种计算机实现的在基于对象的系统中分配堆栈空间的方法包括获得适合编译的源代码并包括与变量相关联的定义。在寄存器分配期间,对堆栈槽和机器寄存器的处置几乎是类似的。这包括的步骤是,创建一干扰图,复制合并(copy coalescing),尝试对干扰图着色,并判断对干扰图着色的尝试是否成功。如果着色的尝试不成功,在源代码中插入的就不是的溢出代码,而是寄存器到寄存器复制命令(例如“reg-reg”复制命令)。“reg-reg”复制命令包括与堆栈槽和机器寄存器二者相关的复制命令。
Description
技术领域
本发明总体涉及用于改进软件应用程序的性能的方法与装置。更具体来说,本发明涉及以与分配寄存器基本相同的方式分配堆栈槽的方法与装置。
背景技术
为了提高与计算机程序的执行有关的效率,许多计算机程序被“优化”。对计算机程序优化的作用一般是去除实质上没有用的部分计算机程序代码。此外,对计算机程序优化会调整计算操作,以使总体计算的执行效率更高,由此降低对计算机资源的消耗。
配置优化器是为了有效地将计算机程序(例如用诸如C++、FORTRAN或Java字节码的程序设计语言编写的计算机程序)转换成为更快的程序。更快的或曰优化的程序一般包括与原始的或曰未转换的计算机程序基本上全部相同的可观察到的行为。具体来说,优化程序包括与其相关原始程序相同的数学行为。然而,优化程序一般用更少的计算来再造同一个数学行为。
本领域的熟练人员会明白,优化器一般包含一个寄存器分配程序,它用来控制在优化的或其它方式编译的内部程序表示内对寄存器的使用。寄存器分配程序分配能在其中存储与程序有关的数据的寄存器空间。寄存器是与计算机的处理器相关联的存取速度相对较快的位置—这种快速度是与计算机所关联的“常规”存储空间例如堆栈或堆空间的存取速度相比而言的。
一个处理器中的寄存器数是固定的。所以,当没有足够的寄存器空间可用于数据存储时,就标识“溢出代码”(spill code)。溢出代码是一种在寄存器全满时在堆栈槽与寄存器之间转移数据的代码。堆栈槽是分配程序用来在寄存器全满时保存信息的堆栈帧(stackframe)。优化程序通常包含一个专用的堆栈槽分配程序,用来按需要为溢出代码分配堆栈槽。当传输的参数多于寄存器能容纳的数量时,一般也需要堆栈槽。
图1a是一个代码段的示意图。源代码段104包括对变量的使用。例如,指令108包括使用一个在寄存器(例如寄存器R1)中存储的变量A。指令108将变量B设定为等于变量A与整数“1”的和。可以将变量B存入寄存器R2。变量A除了用于指令108,也用于指令112。如图所示,变量B用于指令114。
变量B的有效范围即“B有效范围”120的定义是段104内变量B必须保持有效的范围。就是说,B有效范围120是需要将变量B的值保留在寄存器(例如寄存器R2)中所在的“距离”。“A有效范围”122即变量B的值必须保留在寄存器中所在的距离与B有效范围重叠。重叠的有效范围120、122表示要在一定的距离内同时将变量A和B二者保留在各自的寄存器中。如图所示,第一个“C有效范围”124表示,变量C只是在变量D被设定之前一直在寄存器中有效的。因此,在某些情况下可以将变量C和变量D分配给同一个寄存器。
可以对与段104关联的干扰图进行着色,以便向段104分配寄存器,而不产生冲突(例如没有干扰)。着色以及随后的寄存器分配,可以用各种不同的过程来执行,这些过程包括但不限于Chaitin着色试探法(由设在美国纽约州Yorktown Heights的国际商用机器公司开发)和Briggs-Chaitin着色算法。图1b是与图1a的段104相关联的干扰图的示意图。干扰图132包括与变量A、B、C、D相关联的节点134。
在需要在相同时间有效的两个节点之间添加边线138。如图所示,在节点A134a与节点D134d之间有边线138a,由此变量A与变量D是同时有效的。类似地,节点B134b与节点C134c之间的边线也表示变量B与变量C也需要同时有效。
对干扰图132的处理使得当干扰图被成功地着色时,可以没有冲突地将寄存器分配给相关节点134。因此,用颜色为干扰图132着色一般涉及向干扰图132的节点134分配颜色,例如寄存器号。干扰图132表示,图1a所示的源代码的段104需要3个寄存器。节点A134a和节点B134b每个需要各自的寄存器,而节点C134c和节点D134d可以共享一个寄存器。
一般来说,干扰图不会总是以与CPU具有的寄存器数一样少地被着色,所以将会发生某些数据被溢出到堆栈槽的溢出。例如,在任何给定时刻,当两个变量或值试图占用一个寄存器时就会发生溢出。当两个值试图几乎同时占用一个寄存器时,由于寄存器分配程序已经到了不可能保证每个值有其自己的寄存器的地步,所以必须将其中一个值溢出到堆栈槽中。可以溢出到堆栈槽中的值的标志被视为是溢出候选对象(spill candidate)的标志。
寄存器分配程序是这样向干扰图分配颜色的—使由边线相连的两个节点具有相同的颜色。此外,寄存器分配程序试图使用不超过k种颜色,其中k是中央处理单元(CPU)中寄存器的数量(在Intel 80×86CPU中,k=8;在多数RISC CPU中,k=32)。如果不可能,或者如果用来对干扰图着色的算法找不到k着色(a k coloring),则一定有一些有效范围溢出。
对于有两个寄存器的假想机来说,图1b的干扰图132是不可着色的。例如假设将变量A和B所关联的有效范围确定为溢出候选对象。如图1c中所示,寄存器分配程序在定义(definitions)和使用(uses)指令的周围插入存储(stores)和加载(loads)指令。与此同时,必须分配堆栈槽,用于存储溢出代码。本例中将单独的堆栈槽用于有效范围A和有效范围B,但在同一时间,这两个有效范围中只有一个是有效的。图1d中给出了溢出程序(spilled program)104’的干扰图。图1d的干扰图180可以只用2个颜色(例如机器寄存器)着色。
本领域的熟练人员明白,存储(store)和加载(load)指令的使用,便于对值进行存储和检索。此外,存储(store)和加载(load)指令的使用是与堆栈空间的分配相关联的,更具体来说,是与堆栈槽的分配相关联的。图2示出与响应着色干扰图分配堆栈空间相关的步骤的过程流程图。与一段源代码相关联的分配存储器的过程开始于步骤202,在该步骤中,为该段源代码构建一个干扰图,例如图1b的干扰图132。
构建了干扰图后,就在步骤206对干扰图进行着色。如上所述,可以应用各种方法来对干扰图进行着色。一旦在步骤206中对干扰图进行着色后,就在步骤210判断出对干扰图进行着色是否成功。换言之,判断是否成功地为干扰图相关的每个变量分配了一个寄存器,而又没有冲突。
如果判定出对干扰图进行着色是不成功的,这意味着没有足够的寄存器能用于在没有干扰的条件下分配给该段源代码中的每个变量。于是,则过程流从步骤210转移到步骤211,在该步骤中获得作为溢出候选对象的有效范围的清单。就是说,确定可以溢出到堆栈槽的变量。
一旦确定了溢出候选对象,则在步骤218中,在源代码段中的定义(definitions)和使用(uses)指令的周围分配加载(load)指令和存储(store)指令。具体来说,在源代码段中变量的使用之前插入一个加载变量的加载命令,在源代码段中定义变量之后插入一个存储变量的存储指令。在分配了加载指令和存储指令(即stores和loads)之后,在步骤222为每个有效范围分配一个堆栈槽。一般来说,要用一个独立于寄存器分配程序的堆栈槽分配程序来分配堆栈槽。尽管堆栈槽分配程序是独立于寄存器分配程序的,应当明白,两种分配程序都可以包含在优化程序或编译程序中。分配堆栈槽使溢出候选对象能被溢出到堆栈槽。过程流从步骤222返回步骤202,在此构建新的干扰图。
返回到步骤210,如果判定出对干扰图进行着色是成功的,表明每个变量都被成功地关联到一个寄存器或者堆栈槽。因此,过程流转移到步骤226,在该步骤中,清理含有堆栈槽的堆栈。本领域的熟练人员知道,清理堆栈槽包括的一系列步骤是相当简单的。这种步骤通常包括转换堆栈槽向实际偏移地址(offsets)的引用并将偏移地址置于相关的溢出指令中。
如果寄存器分配程序只是为每个溢出候选对象分配一个堆栈槽,就会生成使用轻松的堆栈帧。大型堆栈帧,诸如那些不紧凑的堆栈帧,既耗费内存以及数据高速缓存,又没有明显的好处。大型帧在不能直接访问远离堆栈指针的偏移地址的机器上也会产生问题。例如,Sparc计算机要求第二个指令访问位于4096个字节以外的堆栈槽。分配程序通常尝试重复利用堆栈槽,为的是使堆栈帧最小化。本领域的熟练人员知道,经常用来重复利用堆栈槽的尝试法,其行为一般来说是不可预见的,由此会产生不可靠的(例如充满错误的)代码。
堆栈槽分配程序的实现经常是效率不高的,导致堆栈帧中充斥着一般不为大段程序使用的堆栈槽。这导致堆栈帧不必要地大,要求大量的存储空间,并由此导致程序执行速度的降低。此外,与堆栈槽分配程序的实现相关的尝试法(例如尝试重复利用堆栈槽)的操作方式是为特定目的而设置的。
因此,需要一种处理存储在堆栈中的值的有效方法。特别是,需要一种分配和使用堆栈空间的有效方法和装置,使得堆栈空间的分配和使用与寄存器的分配和使用相同。
发明内容
本发明涉及分配和使用堆栈空间。按照本发明的一个方面,一种计算机实现的在基于对象的系统中分配堆栈空间的方法包括获得适合编译的源代码并包括与变量相关联的定义。一旦获得了源代码,就在源代码中与变量相关联的定义之后顺序插入第一个复制(copy)指令。然后为第一个复制指令分配第一个堆栈槽,第一个堆栈槽与一个堆栈帧的大小确定的堆栈帧关联。在一个实施例中,该方法进一步包括创建一个与源代码相关联的干扰图,对干扰图进行着色,并判断对干扰图进行着色是否成功。如果进行着色尝试不成功,就将第一个复制指令插入源代码。
通过在变量的定义或使用的周围插入一个可能与加载(load)、存储(store)或寄存器-寄存器复制(register-register copy)相关的复制指令,就可以用与分配寄存器所用的相同的机构(mechanism)来分配堆栈槽。用相同的机构来分配寄存器和堆栈槽,能避免与要用一般来说是复杂的、独立的机构来分配堆栈槽值所相关的复杂性。所以,使用以分配寄存器所用的相同机构来执行的堆栈分配的源代码,一般来说执行效率更高并且更可靠。
本发明提供如下的方法和系统:
(一)一种用于在基于对象的系统中分配堆栈空间的、计算机实现的方法,该计算机实现的方法包含:
a)获得源代码,源代码适合编译,源代码包括与变量相关联的定义;
b)在源代码中插入第一个复制指令,第一个复制指令是在源代码中与变量相关联的定义之后顺序插入的;
c)为第一个复制指令分配第一个堆栈槽;
d)将第一个堆栈槽与一个堆栈帧关联,其中,将第一个堆栈槽与该堆栈帧关联包括确定该堆栈帧的大小。
(二)一种用来在与计算机系统关联的基于对象的系统中分配堆栈空间的计算机系统,该计算机系统包含:
一个处理器;
一个用于获得源代码的接收装置,源代码适合编译,源代码包括与变量相关联的定义;
一个用于在源代码中插入第一个复制指令的编译程序装置,第一个复制指令是在源代码中与变量相关联的定义之后顺序插入的;
一个用于为第一个复制指令分配第一个堆栈槽的寄存器分配装置,寄存器分配装置还被安排成用于分配机器寄存器;和
一个用于将第一个堆栈槽与一个堆栈帧关联的堆栈帧创建装置,其中,将第一个堆栈槽与该堆栈帧关联包括确定该堆栈帧的大小。
附图说明
通过阅读以下详细说明并研究各个附图,本发明的这些和其它优点将显而易见。
参考下面结合以下各附图所作的说明能彻底了解本发明。附图简介:
图1a是包括变量的有效范围的源代码的示意图。
图1b是与图1a的源代码104相关的干扰图的示意图。
图1c是增加了存储(store)指令和加载(load)指令的源代码示意图。
图1d是与图1c的代码104’相关联的干扰图的示意图。
图2是表示根据对干扰图的着色分配堆栈空间的相关步骤的过程流图。
图3a是按照本发明实施例的增加了复制(copy)指令的源代码示意图。
图3b是按照本发明实施例的一个命名空间(namespace)的示意图。
图4是表示按照本发明实施例的、根据对干扰图的着色分配堆栈槽的相关步骤的过程流图。
图5是一个适合实现本发明的通用计算机系统的示意图。
图6是一个由图5的计算机系统支持的、适合实现本发明的虚拟机的示意图。
具体实施方式
优化程序或编译程序经常含有一个堆栈槽分配程序,用来分配堆栈槽,以保存由于处理器的相关寄存器数量有限而不能在寄存器中存储的变量。堆栈槽分配程序通常是在寄存器分配期间当通过干扰图着色算法确定并非所有变量都能分配到寄存器而不致冲突时被启动的。与处理基于堆栈的变量的尝试法,如同例如试图释放与不使用的堆栈槽相关的空间时一样,经常导致在源代码的执行中发生故障。此外,堆栈槽的使用经常效率不高,这是因为堆栈帧中的许多堆栈槽只用于程序的一小部分。
通过以与对待机器寄存器一样的方式来处置基于堆栈的值或变量,就不需要用专用的堆栈槽分配程序。从寄存器分配过程中去除这种堆栈槽分配程序能提高用来减少寄存器使用的寄存器分配程序的稳定性。用寄存器分配程序来分配堆栈槽能减少堆栈槽的使用,并且一般能使堆栈帧更小、更紧凑,能减少高速缓存的覆盖面,改善运行期环境。此外,用寄存器分配程序来分配堆栈槽还能以对待寄存器一样的方式来处置堆栈槽,由此去除了伴随着通常用来处理堆栈槽中值的存储的试探法而产生的故障。
为了有效地按寄存器实现堆栈槽,可以使寄存器分配程序不再将存储和加载指令插入溢出代码的周围。相反,寄存器分配程序插入复制指令,复制指令的源和目的地既可以是真正的机器寄存器,也可以是堆栈槽。在分配成功后,随后进行一次清理,将以堆栈槽和寄存器为源和以堆栈槽和寄存器为目的地的复制指令转换为存储或加载指令。
本领域的熟练人员明白,寄存器分配程序可以执行复制合并(copycoalescing)以清除。因此,通过创建要在堆栈槽中存储的变量的副本,最终就可以用寄存器分配程序来通过清除堆栈槽中不用的副本而减少堆栈槽的使用。参看图3a来说明按照本发明实施例的包含复制指令的代码段。代码段304包括一个命令308或指令,它在变量C的定义中使用变量A和B。在所述实施例中,在变量的定义和变量的使用周围分配复制指令。于是,既然命令308使用变量A和B,那么就对变量A和B进行复制—这分别由命令310和312表示。在命令308之后插入一个复制命令314,以便创建变量C的副本。
堆栈槽和寄存器通常是命名空间的一部分。一般来说,命名空间的大小随命名空间所关联的堆栈槽的数量而不同。由于与处理器相关的寄存器的数量是固定的,因此命名空间通常是固定的,所以应当明白,命名空间的大小实际上取决于命名空间中包含的堆栈槽的数量,或者说取决于命名空间中包含的由堆栈槽生成的堆栈帧的大小。
图3b是按照本发明实施例的一个命名空间的示意图。命名空间352可以包含任何位数。一般来说,位的数量视特定计算系统的要求而变化很大。举例来说,位数的范围可以从50位左右到100位以上。应当明白,理论上讲,命名空间相关的位数可以是无限的。在所述实施例中,命名空间352是一个96位的命名空间。
命名空间352的第一个8位360是与保存整数的寄存器相关联的。就是说,第一个8位360实际上构成了8个整数寄存器。本领域的熟练人员明白,一般来说,与寄存器相关联的位的数量视与命名空间352相关联的计算平台而变化很大。例如,与Intel 80×86中央处理单元(CPU)所用寄存器相联系的是8位,而RISC(精简指令集计算机)CPU所用寄存器相联系的则是32位。位集364(即第9到第25位)是与存储浮点值的寄存器相关联的。
在所述实施例中,从位26的位置开始的各个位指的是与在堆栈上传送的输入参数相关联的堆栈槽。分配给输入参数的位数取决于被编译的子例程和所用的调用规约。有些参数可以传送到寄存器中。在分配了输入参数位之后,要分配输出参数位。通常要为被传送到被当前子例程调用的子例程的参数保留输出参数位。在分配了输出参数之后,就分配其余的所有位,用于代表溢出。
应当明白,用来将代码溢出到与命名空间352相关联的堆栈槽中的寄存器分配程序通常选择第一个空闲的堆栈槽,将值溢出到该堆栈槽中。
通过有效地顺序将代码溢出到堆栈槽中,由堆栈槽构成的堆栈帧就会相当紧凑,这是因为在被占用的堆栈槽之间一般不会有空堆栈槽。此外,被占用的堆栈槽之间没有有空堆栈槽,能使堆栈帧的大小调整得正好满足需要。具体来说,堆栈帧的大小对应于被使用的最高堆栈槽。例如,当命名空间的第30位是被填充的最后一位时,与命名空间352相关联的堆栈帧的大小就是4个字或者16个字节。
尽管可以由于各不同的原因来分配堆栈槽,在所述实施例中,堆栈槽是在寄存器分配过程期间没有空闲的寄存器可用时被分配的。寄存器分配过程经常与干扰图着色过程相关联。现在参看图4来说明按照本发明实施例的、对源代码执行干扰图着色的相关步骤。过程开始于步骤404,在该步骤中为特定源代码段创建或“建立”一个干扰图。该源代码一般可以是一段可以几乎以任何适当的程序设计语言(例如C程序设计语言)编写的软件应用程序。正如前文所述,干扰图的创建,一般涉及表示与源代码中的变量或值相关联的有效范围以及表示有效范围之间的干扰。
一旦建立了干扰图,就在步骤408对干扰图进行着色。对干扰图着色涉及没有冲突或干扰地将寄存器分配给不同的变量。应当明白,用来为干扰图着色以进行寄存器分配的方法是多种多样的。这种方法包括—但不限于—Briggs-Chaitin寄存器分配法、Chow式分配法和线性扫描分配法。
在步骤412判断对干扰图的着色是否成功。换言之,判断是否可以在没有冲突的条件下为干扰图相关的所有变量分配寄存器。如果判定出对干扰图进行着色是不成功的,这意味着没有足够的寄存器能用于在没有干扰的条件下分配给与干扰图相关的所有变量。于是,则过程流从步骤412转移到步骤416,在该步骤中获得与干扰图相关的、作为溢出候选对象的有效范围的清单。就是说,确定可以溢出到堆栈槽的值。
确定了溢出候选对象之后,在步骤420中,在溢出候选对象相关的定义和使用指令的周围有效地分配或插入复制(copy)指令。在所述实施例中,在溢出候选对象相关的定义指令(definitions)之后并在溢出候选对象相关的指令—例如使用(uses)指令—之前分配一个复制指令。在定义和使用指令的周围0分配的复制指令通常呈现为寄存器到寄存器(即“reg-reg”)复制指令。如本发明所指出的那样,复制指令所用的“寄存器”可以是实际机器寄存器,也可以是堆栈槽。本领域的熟练人员明白,复制指令可能涉及在堆栈上放置值,但一般不要求在栈上放置值。
在步骤420中将复制指令分配到溢出候选对象相关的定义和使用指令的周围之后,过程流返回到步骤402,建立新的干扰图。所建立的新的干扰图包括能被着色到堆栈槽寄存器的有效范围。
返回到步骤412对着色是否成功的判断,如果判定出着色是成功的,则表明不在需要溢出。换言之,如果确定出着色是成功的,则不需要另外的堆栈槽来存储变量。于是,过程流转移到步骤428,在该步骤中,对与在定义和使用指令周围分配的复制命令相关联的每个副本进行评估,判定它是存储指令、加载指令还是寄存器到寄存器复制指令。这种判定是为了将复制指令转换成一个与现有的实际CPU硬件相对应的指令所必需的。
过程从步骤428转移到步骤432,在此确定包含在步骤424所分配的堆栈槽的堆栈帧的大小。尽管堆栈帧的大小取决于各种不同因素,在所述实施例中,堆栈帧的大小取决于相关命名空间(例如结合图3b所述的96位命名空间)中最大的堆栈槽。一旦确定了堆栈帧的大小,就在步骤436清理堆栈。清理堆栈一般包括将复制指令恰当地转换成加载指令和存储指令。清理堆栈之后,对源代码进行分配的过程即告结束。
图5表示一个适合实现本发明的典型的通用计算机系统。计算机系统1030包括任意数量的处理器1032(也称中央处理单元或CPU),处理器连接到存储器,包括主存储器1034(通常是随机存取存储器即RAM)和主存储器1036(通常是只读存储器即ROM)。
本领域的熟练人员明白,可以用计算机系统1030—或更具体来说—CPU 1032来支持一个虚拟机。下面将结合图6来叙述一个在计算机系统1030上支持的虚拟机的例子。本领域中众所周知,ROM的作用是向CPU 1032单向传输数据和指令,而RAM则一般用来双向传输数据和指令。CPU 1032一般可包含任意数量的处理器。主存储器1034和1036二者都可以包含任何合适的计算机可读的媒体。二级存储介质1038通常是海量存储器,也与CPU1032双向连接,提供额外的数据存储容量。海量存储器1038是一种计算机可读的介质,可用来存储包括计算机代码、数据等等的程序。海量存储器1038通常是诸如硬盘或磁带的存储介质,速度一般比主存储器1034、1036慢。海量存储器1038可以采用磁带机或纸带机的形式或采用某种其它已知的设备。应当明白,在适当的情况下,可以将海量存储器1038内存储的信息按部分RAM 1036的标准方式采用,充作虚拟存储器。诸如CD-ROM的特定主存储器也可以向CPU 1032单向传送数据。
CPU 1032也连接到一个或多个输入/输出设备1040,它们包括—但不限于—视频监视器、跟踪球、鼠标、键盘、麦克风、触摸感应显示器、传感器读卡机、磁带或纸带机、输入板、输入笔、语音或手写识别器或者其它已知的输入设备诸如计算机。最后,可以选择利用如1032概括表示的网络连接,将CPU 1032连接到计算机或电信网络,例如局域网、互连网或内部网。可以设想,利用这种网络连接,CPU 1032就可以在执行上述方法步骤的过程中从网络接收信息或者向网络输出信息。这种信息经常呈现为一系列要由CPU 1032执行的指令,可以例如以载波中体现的计算机数据信号的形式从网络接收或向网络输出。计算机硬件和软件领域的熟练人员应当熟悉上述的设备和材料。
如前文上述,虚拟机可以在计算机系统1030上执行。图6是一个由图5的计算机系统支持的、适合实现本发明的虚拟机。当执行一个计算机程序(例如用设在美国加州Palo Alto的Sun微系统公司开发JavaTM程序设计语言编写的计算机程序)时,向编译时环境1105内的编译程序1120提供源代码1110。一般来说,源代码110在软件开发者创建源代码1110时被译成了字节码1130。
字节码1130一般可以通过网络(例如图5的网络1012)复制、下载或以其它方式散布,或者在诸如图5的主存储器1034的存储器上存储。在所述实施例中,字节码1130是独立于平台的。就是说,字节码1130几乎可以在任何运行适当虚拟机1140的计算机系统上执行。例如,在JavaTM环境中,字节码可以在运行JavaTM虚拟机的计算机系统上执行。
字节码1130被提供给一个包含虚拟机1140的运行环境1135。运行环境1135一般可以由诸如图5的CPU 1032的处理器来执行。虚拟机1140包括编译程序1140、解释程序1142和运行系统1146。字节码1130一般既可以向编译程序1140也可以向解释程序1142提供。
当字节码1130被提供给编译程序1140时,字节码1130内含有的过程被编译成机器指令,如上所述。另一方面,当字节码1130被提供给解释程序1142时,字节码1130被每次一个字节码地读入解释程序。解释程序1144然后在每个字节码被读入解释程序1144时执行每个字节码所定义的操作。总之,解释程序1144几乎同时地处理字节码1130和执行字节码1130的相关操作。
当操作系统1160调用某个过程时,如果确定该过程是要以解释的过程调用的,运行系统1146可以从解释程序1144获得该过程。另一方面,如果确定该过程是要以编译的过程调用的,运行系统1146就启动编译程序1142。编译程序1142然后由字节码1130生成机器指令,并执行机器语言指令。一般来说,机器语言指令在虚拟机1140停止时被丢弃。
尽管只说明了本发明的若干实施例,应当明白,本发明可以以其它许多具体形式体现,而不偏离本发明的精神或范围。举例来说,分配堆栈空间和对干扰图着色的相关步骤是可以改变次序、删除或者添加的。总之,本发明的过程中涉及的步骤都可以改变次序、删除或者添加,而不偏离本发明的精神或范围。
尽管是就为保存溢出数据而分配堆栈槽对本发明作出说明的,应当明白,可以由于各种不同原因而分配堆栈槽。例如在图形应用中,有些操作,诸如将整数值转换成浮点值的操作,实际上会要求进行堆栈槽的分配。另一方面,可以分配堆栈槽来使参数能在堆栈上传送。因此,应将本文的举例视为示例性的而不是限制性的,本发明并不限于本文所述细节,而可以在本发明的精神和范围内加以修改。
Claims (11)
1.一种用于在基于对象的系统中分配堆栈空间的、计算机实现的方法,该计算机实现的方法包含:
a)获得源代码,源代码适合编译,源代码包括与变量相关联的定义;
b)在源代码中插入第一个复制指令,第一个复制指令是在源代码中与变量相关联的定义之后顺序插入的;
c)为第一个复制指令分配第一个堆栈槽;
d)将第一个堆栈槽与一个堆栈帧关联,其中,将第一个堆栈槽与该堆栈帧关联包括确定该堆栈帧的大小。
2.如权利要求1所述的计算机实现的方法,进一步包含:
e)创建一个与源代码相关联的干扰图,其中,创建与源代码相关联的干扰图包括为第一个复制指令分配第一个堆栈槽;
f)对干扰进行着色;
g)判断对干扰图进行着色成功的时间,其中,在判定出尝试对干扰图进行着色不成功的时候,就将第一个复制指令插入源代码。
3.如权利要求2所述的计算机实现的方法,进一步包含:
在判定出对干扰图进行着色不成功时,获得一个溢出候选对象,该溢出候选对象是与第一个堆栈槽相关联的。
4.如权利要求3所述的计算机实现的方法,进一步包括重复步骤b)、c)、e)和f),直到确定对干扰图进行着色成功为止。
5.如权利要求4所述的计算机实现的方法,其中,源代码包括变量的至少一次使用,获得源代码包括获得变量的至少一次使用。
6.如权利要求5所述的计算机实现的方法,进一步包括:
将第二个复制指令分配到源代码,第二个复制指令被安排成顺序地位于变量的至少一次使用之后;
为第二个复制指令分配第二个堆栈槽。
7.如权利要求6所述的计算机实现的方法,其中,第一个复制指令选自包括如下项的列表,所述列表包括:加载指令、存储指令和寄存器到寄存器复制指令。
8.如权利要求7所述的计算机实现的方法,进一步判断第一个复制指令是否是加载指令。
9.一种用来在与计算机系统关联的基于对象的系统中分配堆栈空间的计算机系统,该计算机系统包含:
一个处理器;
一个用于获得源代码的接收装置,源代码适合编译,源代码包括与变量相关联的定义;
一个用于在源代码中插入第一个复制指令的编译程序装置,第一个复制指令是在源代码中与变量相关联的定义之后顺序插入的;
一个用于为第一个复制指令分配第一个堆栈槽的寄存器分配装置,寄存器分配装置还被安排成用于分配机器寄存器;和
一个用于将第一个堆栈槽与一个堆栈帧关联的堆栈帧创建装置,其中,将第一个堆栈槽与该堆栈帧关联包括确定该堆栈帧的大小。
10.按照权利要求9的计算机系统,进一步包含:
一个用于创建与源代码相关联的干扰图的绘图器;
一个用于对干扰图进行着色的图形着色装置;
一个用于判断对干扰图进行着色是否成功的判断器,其中,在判定出对干扰图进行着色不成功时,就将第一个复制指令插入源代码。
11.按照权利要求9和10其中任何一项的计算机系统,其中,源代码包括变量的至少一次使用,该计算机系统进一步包括:
一个用于将第二个复制指令分配到源代码的分配器,第二个复制指令被安排成顺序地位于变量的至少一次使用之后,其中寄存器分配装置还被安排成用于为第二个复制指令分配第二个堆栈槽。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US09/298,318 US6434743B1 (en) | 1999-04-23 | 1999-04-23 | Method and apparatus for allocating stack slots |
JP09/298318 | 1999-04-23 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN1271887A CN1271887A (zh) | 2000-11-01 |
CN1160624C true CN1160624C (zh) | 2004-08-04 |
Family
ID=23149992
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CNB001070142A Expired - Lifetime CN1160624C (zh) | 1999-04-23 | 2000-04-24 | 分配堆栈槽的方法与装置 |
Country Status (6)
Country | Link |
---|---|
US (1) | US6434743B1 (zh) |
EP (1) | EP1046988A3 (zh) |
JP (1) | JP2000347876A (zh) |
CN (1) | CN1160624C (zh) |
AU (1) | AU773940B2 (zh) |
CA (1) | CA2306437A1 (zh) |
Families Citing this family (24)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6883168B1 (en) | 2000-06-21 | 2005-04-19 | Microsoft Corporation | Methods, systems, architectures and data structures for delivering software via a network |
US7000230B1 (en) | 2000-06-21 | 2006-02-14 | Microsoft Corporation | Network-based software extensions |
JP3763518B2 (ja) * | 2001-05-29 | 2006-04-05 | インターナショナル・ビジネス・マシーンズ・コーポレーション | コンパイラ、そのコンパイル方法およびプログラム |
US7124251B2 (en) * | 2002-06-24 | 2006-10-17 | Microsoft Corporation | Stack allocation system and method |
US7415672B1 (en) | 2003-03-24 | 2008-08-19 | Microsoft Corporation | System and method for designing electronic forms |
US7370066B1 (en) | 2003-03-24 | 2008-05-06 | Microsoft Corporation | System and method for offline editing of data files |
US7275216B2 (en) | 2003-03-24 | 2007-09-25 | Microsoft Corporation | System and method for designing electronic forms and hierarchical schemas |
US7913159B2 (en) | 2003-03-28 | 2011-03-22 | Microsoft Corporation | System and method for real-time validation of structured data files |
FR2857114B1 (fr) * | 2003-07-04 | 2005-09-30 | Arteris | Systeme et procede de communication entre des modules |
US7406660B1 (en) | 2003-08-01 | 2008-07-29 | Microsoft Corporation | Mapping between structured data and a visual surface |
US7334187B1 (en) | 2003-08-06 | 2008-02-19 | Microsoft Corporation | Electronic form aggregation |
US7937651B2 (en) | 2005-01-14 | 2011-05-03 | Microsoft Corporation | Structural editing operations for network forms |
US20060158023A1 (en) * | 2005-01-14 | 2006-07-20 | The Boler Company | Continuous radius axle and fabricated spindle assembly |
US8010515B2 (en) | 2005-04-15 | 2011-08-30 | Microsoft Corporation | Query to an electronic form |
CN100368992C (zh) * | 2005-06-16 | 2008-02-13 | 中国科学院计算技术研究所 | 一种解决多寄存器组冲突的方法 |
US8200975B2 (en) | 2005-06-29 | 2012-06-12 | Microsoft Corporation | Digital signatures for network forms |
US8001459B2 (en) | 2005-12-05 | 2011-08-16 | Microsoft Corporation | Enabling electronic documents for limited-capability computing devices |
US20090313743A1 (en) * | 2008-06-20 | 2009-12-24 | Craig Jason Hofmeyer | Pants with saggy pants control system |
GB2474522B (en) * | 2009-10-19 | 2014-09-03 | Advanced Risc Mach Ltd | Register state saving and restoring |
US9009692B2 (en) * | 2009-12-26 | 2015-04-14 | Oracle America, Inc. | Minimizing register spills by using register moves |
US9411715B2 (en) * | 2012-12-12 | 2016-08-09 | Nvidia Corporation | System, method, and computer program product for optimizing the management of thread stack memory |
US9015689B2 (en) * | 2013-03-14 | 2015-04-21 | Board of Regents on Behalf of Arizona State University | Stack data management for software managed multi-core processors |
CN104731555A (zh) * | 2013-12-23 | 2015-06-24 | 中兴通讯股份有限公司 | 一种避免寄存器冲突的方法及装置 |
US10409570B2 (en) * | 2016-10-19 | 2019-09-10 | Nxp Usa, Inc. | Feedback directed program stack optimization |
Family Cites Families (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5428793A (en) * | 1989-11-13 | 1995-06-27 | Hewlett-Packard Company | Method and apparatus for compiling computer programs with interproceduural register allocation |
US5249295A (en) * | 1990-06-20 | 1993-09-28 | Rice University | Digital computer register allocation and code spilling using interference graph coloring |
IL100986A (en) * | 1991-02-27 | 1997-01-10 | Digital Equipment Corp | Method for compiling code |
US5418958A (en) * | 1992-07-15 | 1995-05-23 | Sun Microsystems, Inc. | Register allocation by decomposing, re-connecting and coloring hierarchical program regions |
JP3299611B2 (ja) * | 1993-10-20 | 2002-07-08 | 松下電器産業株式会社 | 資源割付装置 |
US5987259A (en) * | 1997-06-30 | 1999-11-16 | Sun Microsystems, Inc. | Functional unit switching for the allocation of registers |
US6139200A (en) * | 1997-06-30 | 2000-10-31 | Sun Microsystems, Inc. | Register resource allocation feedback |
-
1999
- 1999-04-23 US US09/298,318 patent/US6434743B1/en not_active Expired - Lifetime
-
2000
- 2000-04-20 CA CA002306437A patent/CA2306437A1/en not_active Abandoned
- 2000-04-20 AU AU28920/00A patent/AU773940B2/en not_active Expired
- 2000-04-24 JP JP2000123160A patent/JP2000347876A/ja active Pending
- 2000-04-24 CN CNB001070142A patent/CN1160624C/zh not_active Expired - Lifetime
- 2000-04-25 EP EP00303452A patent/EP1046988A3/en not_active Withdrawn
Also Published As
Publication number | Publication date |
---|---|
JP2000347876A (ja) | 2000-12-15 |
CA2306437A1 (en) | 2000-10-23 |
CN1271887A (zh) | 2000-11-01 |
EP1046988A3 (en) | 2003-09-10 |
EP1046988A2 (en) | 2000-10-25 |
US6434743B1 (en) | 2002-08-13 |
AU773940B2 (en) | 2004-06-10 |
AU2892000A (en) | 2000-10-26 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN1160624C (zh) | 分配堆栈槽的方法与装置 | |
CN1186722C (zh) | 用于使用寄存器分配器建立调用约定序言和收尾程序代码的方法和装置 | |
CN1119756C (zh) | 用于进行静态初始化的方法和系统 | |
EP0428084B1 (en) | Method and apparatus for compiling computer programs with interprocedural register allocation | |
US8995070B2 (en) | Garbage collection based on functional block size | |
US6868488B2 (en) | Binned remembered sets | |
US6505283B1 (en) | Efficient memory allocator utilizing a dual free-list structure | |
CN106663019A (zh) | 处理值类型 | |
US20020087589A1 (en) | Methods and apparatus for optimizing garbage collection | |
US6701520B1 (en) | Preventing garbage collection of objects in object oriented computer programming languages | |
US9740716B2 (en) | System and method for dynamically selecting a garbage collection algorithm based on the contents of heap regions | |
CN1233797A (zh) | 在面向对象的系统中的位置特定的信息分配 | |
CN1786928A (zh) | 应用层高速缓存映像知晓和再分配的系统和方法 | |
JP4756231B2 (ja) | 掃除用のガーベッジコレクションの効果を高めるための方法、コンピュータ読み取り可能媒体、コンピュータシステム、及び、メモリ | |
JPH113269A (ja) | スタックの内容をサブスタックに分離することによる正確なガーベイジ・コレクションを補助するシステムと方法 | |
US6925639B2 (en) | Method and system for register allocation | |
CN1786927A (zh) | 应用层高速缓存映像知晓和再分配的系统和方法 | |
US8561042B2 (en) | System and method for reducing execution time of bytecode in java virtual machine | |
CN1191527C (zh) | 生成稀疏干扰图的装置与方法 | |
US20120310998A1 (en) | Efficient remembered set for region-based garbage collectors | |
EP1700209A2 (en) | Data layout mechanism to reduce hardware resource conflicts | |
US9411566B2 (en) | System and method for removal of arraycopies in java by cutting the length of arrays | |
CN115495226A (zh) | 内存管理方法、装置、设备及计算机可读存储介质 | |
US11755300B1 (en) | Systems and methods for array structure processing | |
Casper | Adapting and Evaluating Buddy Allocators for Use Within ZGC: ZGC's New Best Friend |
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 | ||
CX01 | Expiry of patent term |
Granted publication date: 20040804 |
|
CX01 | Expiry of patent term |