提前编译的制作方法

文档序号:6593400阅读:203来源:国知局
专利名称:提前编译的制作方法
提前编译背景背景和相关技术计算机和计算系统已经影响了现代生活的几乎每个方面。计算机通常在工作、 消遣、保健、运输、娱乐、家政管理等中都有涉猎。为了在计算机上执行,计算机应用程序通常从高级描述性代码被编译成低级机 器可理解代码。取决于在其中执行计算机程序的环境中使用的计算机语言,这可以用多 种不同的方式来实现。例如,计算机程序通常由程序员编写并被编译成处理器本机指令 集中可由处理器在低级读取的机器码,并以该低级机器可读码来提供给消费者。或者,程序员可以使用各种语言来开发以在提供给消费者之前未被编译成低级 本机可读机器语言的较高级语言来提供给消费者的程序。使用这些语言,编译可在应用 程序被执行时发生。在一些环境中,编译使用及时编译来进行。当及时编译确信某函数 将要运行时,及时编译恰好在运行该函数之前编译该函数。因此,通过不编译将不运行 的函数并且直至恰好在各个函数将要运行之前才编译它们来节省了处理资源。然而,这 一点的折衷是启动时间可能增加,因为为了执行特定函数必须进行编译。在此要求保护的主题不限于解决任何缺点或仅在诸如上述环境中操作的各个实 施例。相反,提供该背景仅用以示出在其中可实践在此描述的部分实施例的一个示例性 技术领域。简要概述本文描述的一些实施例涉及对后支配的(postdominate)函数进行预编译。一些 实施例可以在包括运行时编译的计算环境中实施。例如,一种方法包括用于编译各函数 的动作。该方法包括确定应用程序的某一函数已被调用。使用控制流图来确定该函数与 一个或多个其他函数之间的一个或多个后支配关系。基于该后支配关系来分配该一个或 多个其他函数以进行预编译。该控制流图可以用多种不同的方式来获得,包括与该应用 程序的元数据包含在一起,如通过该应用程序中包含的注释或分开的元数据。或者,该 控制流图可以作为对函数进行编译的过程的一部分来生成。提供本概述是为了以简化的形式介绍将在以下详细描述中进一步描述的一些概 念。本概述不旨在标识所要求保护的主题的关键特征或必要特征,也不旨在用于帮助确 定所要求保护的主题的范围。另外的特征和优点将在以下的描述中阐述,并且部分可从该描述中显而易见, 或者可以从此处的教示实践中习得。本发明的特征和优点可以通过在所附权利要求中特 别指出的手段和组合来实现并获取。本发明的特征将从以下描述和所附权利要求书中变 得完全显而易见,或者可通过如下所述对本发明的实践而获知。附图简述为了描述能够获得上述和其他优点和特征的方式,将通过参考附图中示出的各 具体实施例来呈现对以上简述的主题的更为具体的描述。应该理解,这些附图仅描绘了 各典型实施例,因此其不应被认为是对范围的限制,各实施例将通过使用附图用附加特征和细节来描述并解释,在附图中

图1示出多个控制流图和后支配图示例;图2示出多核计算系统;以及图3示出预编译应用程序代码的方法。详细描述本文描述的一些实施例允许在及时编译类环境中确定后支配关系,以便在执行 一应用程序时确定将调用一函数,使得可以预编译该函数以在执行各函数时降低启动时 间。一些实施例可以在诸如java和.net 等及时编译环境中实施,后支配关系将各函数的 执行联系起来。说明性地,如果一函数后支配另一第二函数,则如果执行该第二函数, 则该函数被保证在某一将来时间执行。可以参考示出各函数入口之间的关系的有向控制流图来确定后支配关系。可以 构造后支配图以便为后支配关系提供证明。可为应用程序整体或应用程序的各部分构造 控制流图。可为应用程序的各单独函数构造控制流图。可以在函数编译时来构造控制流 图。在编译时,函数可被分解成其基本块。基本代码块具有单个入口点和单个出口 点。因此,为了构造控制流图,可以扫描代码以标识入口和出口点。由于入口点从另一 点接受控制而标识出它们,而出口点将控制转移给另一点。图1示出后支配图102。 图102表示包括main(主)函数和printf(打印)函数 的两个函数。图102被示为具有两个节点,main节点104和printf节点106。这两个节 点由边108连接。诸如边108等边表示函数调用。在所示示例中,如果曾经执行过函数 main 104,则将对函数printf 106进行调用108。 因而,函数printf 106后支配函数main 104。尽管传统上,后支配描述有向图中的各节点之间的关系,但如此处所使用的, 后支配可包括各节点的入口点之间的关系。例如,图1还示出有向图110。有向图110是 包括函数main的入口块112、printf函数的具有第一自变量(即“Hello(你好)”)的入口 块114、以及printf函数的具有第二不同自变量(即“Bye(再见)”)的入口块116的控制 流图。这一有向图110可以从诸如以下伪码等代码中生成“如果χ则printf "Hello" 否则printf “Bye” ”。在所示示例中,如果函数112执行,则根据控制流进入入口 114 或116,函数printf将执行。节点114和116是同一函数的不同调用(具有不同的自变 量)。然而,入口块114和入口块116两者都调用同一 printf函数。如此处所使用的,除 非另外指出,否则这仍然是后支配关系。如此,printf的入口后支配main函数的入口块 节点112。即使printf的各调用中没有一个单独地后支配main 112,情况也是如此。因 此,后支配图102是控制流图110的有效后支配图。为了说明反例,图1还示出控制流有向图120。有向图120包括函数main的入 口块节点122、函数printf的入口块节点124、以及函数delete(删除)的入口块节点126。 这一示例示出了 print函数的入口块124以及delete函数的入口块126中没有一个后支配 main函数的入口块122。具体而言,如果main函数被执行,则唯一保证是控制将流向 printf函数的入口或流向delete函数的入口。然而,因为printf函数和delete函数是不同 的函数,所以main函数和printf及delete函数之间没有后支配关系。
如上所述,后支配是基于对诸如图1中示出的图110和120等图的检查来确定 的。可以在诸如图102等后支配图中为后支配关系提供证明。可以用多种不同的方式 来获得图以进行检查。例如,在一个实施例中,该图可以被构造成对函数进行编译的结 果。例如,在编译一函数时,该函数可被分解成各基本块。在确立了后支配关系时,后支配已执行函数的各个函数可被分配给资源以便编 译。注意,这些函数的性质可以是它们在相当长时间期间将不执行,然而,基于后支配 关系,它们仍然将在某一时间被调用执行。因此,并非及时编译,在基于它们将被调用 执行的后支配关系而仍然已知的情况下,各个函数可被提前编译。现在参考图2,示出了本文描述的一些特征可能在其中有用的一示例实施例。图 2示出多核系统200。多核系统200包括多个处理器,包含处理器202、处理器204、处 理器206以及处理器208。处理器202、204、206以及208连接到存储器210。存储器210通常包括可在处 理器202、204、206以及208中的一个或多个上执行的计算机可执行指令。另外,除这 些计算机可执行指令之外,存储器210可包括用高级程序设计语言编写的计算机可执行 指令,其中这些指令旨在在处理器上执行之前编译。现在说明一个示例实施例,存储器210可以从持久存储212加载将要执行的计算 机程序应用的全部或部分。计算机程序应用可包括要在被处理器执行之前要进行编译的 高级机器指令。可以选择来自该计算机程序应用的函数来执行。可以使用诸如处理器 202等处理器之一来编译这一函数。如以下将更详细地描述的,在编译过程期间,可以构 造或参考控制流图。可以使用对控制流图的参考来确定在处理器202上执行的函数与该 计算机程序应用中的其他函数之间的后支配关系。各实施例可以确定正在执行的函数与计算机程序应用中的另一函数之间存在后 支配关系。可以将后支配正在执行的函数的各个函数分配给适当的资源,使得随后可以 编译该后支配的函数以供将来执行。在一个实施例中,这包括将后支配的函数分配给多 处理器系统中的与原始函数在其上执行的处理器不同的处理器。例如,在以上示出的示 例中,如果原始函数在处理器202上执行,则后支配函数的编译任务可被分配给处理器 204、206 或 208 之一。各实施例还可以使用虚拟资源来实现。例如,系统可包括用于在单个处理器上 分配多个线程的功能作为在单个处理器上对多个虚拟处理器的实现。因此,在一个实施 例中,尽管函数是在一虚拟处理器上执行的,但可以将该函数的后支配的函数调度在不 同的虚拟处理器上以供预编译。在一替换实施例中,可以实现排队解决方案。具体而言,在包括单个处理器的 一个示例实施例中,当在该处理器上执行一函数时,可以作出其他函数可能后支配该函 数的判定。然而,因为原始函数正在该处理器上执行,所以不停止该函数的执行来对后 支配的函数进行预编译是合乎需要的。因此,相反,后支配的函数可被排队以便后续在 处理器和其他适当的资源可自由用于执行预执行编译时来进行编译。可以实现一些实施例,其中应用程序的代码包括注释,其中这些注释包括控制 流图或后支配图。在这些实施例中,在调用或编译一函数时,这些注释可被用来确定后 支配所调用的函数的其他函数。这些后支配函数随后可以通过使用计算系统中的空闲资源来进行预编译,如上所述,诸如例如使用多个实际或虚拟处理器的空闲资源。一些实施例还可实现概率预编译。例如,使用统计分析,可以确定在调用第一 函数时第二函数被调用的概率。如果这一概率足够高,例如处于预指定阈值内,则如以 上针对后支配示例所描述的,可以使用计算系统中的空闲资源来预编译第二函数。统计 分析可以用多种不同的方式来发生。例如,计算系统可以监视函数调用以确定所发生的 模式。或者,应用程序开发者可以提供关于在第一函数被调用的情况下第二函数被调用 的概率的信息。这可以例如作为对应用程序代码的注释来提供或作为可以提供给该代码 的独立元数据来提供。在一个实施例中,注释可包括一个或多个后支配图。以下讨论现在引用多种方法以及可以执行的方法动作。应当注意,虽然以特定 次序讨论了这些方法动作,但除非具体指出或因为一动作依赖于在该动作执行之前完成 的另一动作而需要特定排序,否则不一定需要特定排序。现在参考图3a,示出了方法300。方法300可以在包括运行时编译的计算环境 中实施。方法300包括用于编译各函数的动作,包括预编译一些函数。该方法包括确定 应用程序的某一函数已被调用(动作302)。例如,方法300可以确定诸如图1所示的具 有入口块112的函数main等函数已被调用。方法300还包括使用控制流图来确定该函数与一个或多个其他函数之间的一个 或多个后支配关系(动作304)。例如,图1示出具有入口块114和116的printf函数后 支配具有入口块112的main函数。注意,在函数的单个入口后支配另一函数的入口的情 况下,后支配关系也可以存在。方法300还包括基于该后支配关系来分配该一个或多个其他函数以进行预编译 (动作306)。基于后支配关系来分配一个或多个其他函数以进行预编译的一些实施例的 细节将在以下更详细地讨论。可以实施方法300,以使得方法300还包括附加动作。例如,在一个实施例中, 作为确定该函数已被调用的结果,启动编译器。该编译器被配置成读入该函数。在该编 译器处,该函数可被分解成各基本块。从这些基本块构造控制流图,使得该控制流图在 该控制流图中表示这些基本块。在一替换实施例中,控制流图可被包括在元数据中。如此,方法300可包括分 析与应用程序相关联的元数据。如所述的,元数据包括包含该应用程序的一个或多个函 数的控制流图。在一个实施例中,该元数据可包括对该应用程序的注释。在一替换实施 例中,该元数据包括可以提供给运行该应用程序的系统的该应用程序外部的数据。现在在以下讨论可以如何实现基于后支配关系来分配一个或多个其他函数以进 行预编译的多个示例。在一个实施例中,方法300还可以在包括多核系统的计算环境中 实施。在该实施例中,分配一个或多个其他函数可包括将该一个或多个其他函数分配给 与编译该函数的处理器不同的处理器。例如,图2示出该系统包括多个处理器。当处理 器202可能正在编译该函数时,可以分配其他处理器204、206以及208之一来处理其他 后支配的函数中的一个或多个。在一替换实施例中,分配一个或多个其他函数包括将该一个或多个其他函数分 配给与编译该函数的虚拟处理器不同的虚拟处理器。在又一替换实施例中,分配一个或多个其他函数包括将该一个或多个其他函数
7分配到队列中,以便可以使用被确定为空闲的资源来编译该一个或多个其他函数。如上所述,确定该函数与一个或多个其他函数之间的一个或多个后支配关系可 包括基于任何函数的调用的集体集合——与该函数的任何一个调用相对——来确定后支 配。例如,图1示出包括由同一 printf函数的入口节点114和116示出的两个调用的控制 流图110。因此,函数printf的入口后支配具有入口 112的main函数。如上所述,可以实施在其中执行各函数的概率分析的各实施例。例如,方法 300还可包括通过概率分析来基于对已被调用的函数或后支配已被调用的函数的函数中的 至少一个的分析以确定一个或多个附加函数可能被调用。可以基于后支配关系和/或作 为后支配关系的补充或替换的其他准则来分配该一个或多个附加函数以由空闲资源进行 预编译。例如,可以分配该一个或多个附加函数以由多核系统中的空闲处理器来进行编 译,由空闲虚拟处理器进行编译,或被分配到队列系统以便在系统资源可用时可以预编 译该一个或多个附加函数。在一个实施例中,通过概率分析确定一个或多个附加函数可能被调用包括参考 该应用程序的元数据。例如,该元数据可以是可被提供给执行该应用程序的系统的外部 数据的一部分。在一替换实施例中,元数据可包括对该应用程序的注释。本文的各实施例可以包括含有各种计算机硬件的专用或通用计算机,这将在以 下做出更详细的讨论。各实施例还可包括用于承载或其上储存有计算机可执行指令或数据结构的计算 机可读介质。这样的计算机可读介质可以是可由通用或专用计算机访问的任何可用介 质。作为示例而非限制,这样的计算机可读介质可以包括RAM、ROM、EEPROM, CD-ROM或其他光盘存储、磁盘存储或其他磁存储设备,或可以用来携带或存储计算机 可执行指令或数据结构的形式的所需程序代码装置并可由通用或专用计算机访问的任何 其他介质。当通过网络或另一通信连接(硬连线、无线,或硬连线或者无线的组合)向 计算机传输或提供信息时,该计算机适当地将该连接视为计算机可读介质。如此,任何 这样的连接被适当地称为“计算机可读介质”。上面各项的组合也应该包括在计算机可 读介质的范围内。计算机可执行指令包括例如使通用计算机、专用计算机或专用处理设备执行某 一功能或一组功能的指令和数据。尽管用结构特征和/或方法动作专用的语言描述了 本主题,但可以理解,所附权利要求书中定义的主题不必限于上述具体特征或动作。相 反,上述具体特征和动作是作为实现权利要求的示例形式公开的。在不偏离本发明的精神或必要特征的情况下,本发明能以其他具体形式来实 现。所描述的实施例在各个方面都只作为说明性的,而不是限制性的。因此,本发明的 范围由所附权利要求书而不是由前面的描述指出。在权利要求的等效方案内的含义和范 围内的所有更改都将包括在它们的范围内。
权利要求
1.一种在包括运行时编译的计算环境中的对函数进行编译的方法,所述方法包括确定应用程序的一函数已被调用(302);使用控制流程图(110)来确定所述函数与一个或多个其他函数之间的一个或多个后 支配关系(304);以及基于所述后支配关系来分配所述一个或多个其他函数来进行预编译(306)。
2.如权利要求1所述的方法,其特征在于,还包括作为确定所述函数已被调用的结果,启动编译器,其中所述编译器被配置成读入所 述函数;在所述编译器处将所述函数分解成各基本块,以及构造所述控制流图,所述控制流图在该控制流图中表示所述基本块并且各边表示控 制在各基本块之间的转移;
3.如权利要求1所述的方法,其特征在于,还包括分析与所述应用程序相关联的元数 据,所述元数据包括包含所述应用程序的一个或多个函数的控制流图或后支配者图。
4.如权利要求3所述的方法,其特征在于,所述元数据包括对所述应用程序的注释。
5.如权利要求3所述的方法,其特征在于,所述元数据包括所述应用程序的外部数据。
6.如权利要求1所述的方法,其特征在于,所述计算环境包括多核系统,并且其中分 配所述一个或多个其他函数包括将所述一个或多个其他函数分配给与编译所述函数的处 理器不同的处理器。
7.如权利要求1所述的方法,其特征在于,分配所述一个或多个其他函数包括将所述 一个或多个其他函数分配给与编译所述函数的虚拟处理器不同的虚拟处理器。
8.如权利要求1所述的方法,其特征在于,分配所述一个或多个其他函数包括将所述 一个或多个其他函数分配到队列中,以便可以使用被确定为空闲的资源来编译所述一个 或多个其他函数。
9.如权利要求1所述的方法,其特征在于,确定所述函数与一个或多个其他函数之间 的一个或多个后支配关系包括与所述函数的整体相对而基于函数的一个或多个调用的入 口来确定后支配。
10.如权利要求1所述的方法,其特征在于,还包括通过概率分析来基于对已被调用的函数或后支配已被调用的函数的函数中的至少一 个的分析以确定一个或多个附加函数可能被调用;以及基于所述后支配关系来分配所述一个或多个附加函数以由空闲资源进行预编译。
11.如权利要求10所述的方法,其特征在于,通过概率分析来基于对已被调用的函数 或后支配已被调用的函数的函数中的至少一个的分析以确定一个或多个附加函数可能被 调用包括参考所述应用程序的元数据。
12.如权利要求10所述的方法,其特征在于,通过概率分析来基于对已被调用的函数 或后支配已被调用的函数的函数中的至少一个的分析以确定一个或多个附加函数可能被 调用包括参考对所述应用程序的注释。
13.如权利要求10所述的方法,其特征在于,通过概率分析来基于对已被调用的函数 或后支配已被调用的函数的函数中的至少一个的分析以确定一个或多个附加函数可能被调用包括确定概率存在于预指定阈值内。
14.一种在包括运行时编译的计算环境中的对函数进行编译的方法,所述方法包括确定应用程序的一函数已被调用(302);分析对所述应用程序的注释,所述注释包括包含所述应用程序的一个或多个函数的 后支配图(102);使用所述后支配图(102)来标识所述函数与一个或多个其他函数的入口之间的一个 或多个后支配关系(304);以及基于所述后支配关系来分配所述一个或多个其他函数来进行预编译(306)。
15.如权利要求14所述的方法,其特征在于,所述计算环境包括多核系统,并且其中 分配所述一个或多个其他函数包括将所述一个或多个其他函数分配给与编译所述函数的 处理器不同的处理器。
16.如权利要求14所述的方法,其特征在于,分配所述一个或多个其他函数包括将所 述一个或多个其他函数分配给与编译所述函数的虚拟处理器不同的虚拟处理器。
17.如权利要求14所述的方法,其特征在于,分配所述一个或多个其他函数包括将所 述一个或多个其他函数分配到队列中,以便可以使用被确定为空闲的资源来编译所述一 个或多个其他函数。
18.—种在计算环境中的包括计算机可执行指令的计算机可读介质,所述指令在被处 理器执行时被配置成使得以下动作得到执行确定应用程序的一函数已被调用(302);作为确定所述函数已被调用的结果,启动编译器,其中所述编译器被配置成读入所 述函数;在所述编译器处将所述函数分解成各基本块;构造控制流图(110),所述控制流图在该控制流图中表示所述基本块;使用所述控制流程图(110)来确定所述函数与一个或多个其他函数的入口之间的一 个或多个后支配关系(304);以及基于所述后支配关系来分配所述一个或多个其他函数以由与编译所述函数的处理器 不同的处理器或虚拟处理器中的至少一个来进行预编译(306)。
19.如权利要求18所述的方法,其特征在于,所述计算环境包括多核系统,并且其中 分配所述一个或多个其他函数包括将所述一个或多个其他函数分配给与编译所述函数的 处理器不同的处理器。
20.如权利要求18所述的方法,其特征在于,分配所述一个或多个其他函数包括将所 述一个或多个其他函数分配给与编译所述函数的虚拟处理器不同的虚拟处理器。
全文摘要
对后支配的函数进行预编译。一些实施例可以在包括运行时编译的计算环境中实施。例如,一种方法包括用于对函数进行编译的动作。该方法包括确定应用程序的某一函数已被调用。使用控制流程图来确定该函数与一个或多个其他函数之间的一个或多个后支配关系。基于该后支配关系来分配该一个或多个其他函数来进行预编译。
文档编号G06F9/45GK102016799SQ200980114744
公开日2011年4月13日 申请日期2009年3月6日 优先权日2008年4月21日
发明者M·B·格莱斯 申请人:微软公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1