预编译托存托管代码的制作方法

文档序号:6426862阅读:97来源:国知局
专利名称:预编译托存托管代码的制作方法
技术领域
本发明涉及预编译系统,尤其涉及用于预编译托存应用程序代码的计算机系统。
背景技术
许多应用程序和库以诸如MICROSOFT 间语言(MSIL)等的中间格式分发。这些中间语言二进制代码(在MICROSOFT . NET的情况下,也称为托管汇编件)通常在使用即时(JIT)编译器的虚拟机环境中在运行时动态地被编译。动态编译的一种替换方案是经由本机生成(NGen)的预编译。NGen从中间语言生成机器码和运行时数据结构并将它们持久存储在盘上的文件中。由NGen产生的映像被称为本机映像或NGen映像。不同于JIT编译的代码,NGen映像中的代码和数据结构可以跨进程共享。对于通常跨多个进程共享的库和框架,NGen是非常有用的,因为它将每一个托管进程的工作集减到最少。因此,NGen降低了系统的总存储器利用率。NGen在用于使得客户机侧应用程序的启动时间最小化方面也非常有用。若干托管平台/应用程序正在使用NGen。然而,不幸的是,在这些当前的平台中非常难以使用NGen。由于在终端用户机器上创建NGen映像,所以NGen命令通常通过框架/ 应用程序的安装程序来链接。通常,这涉及写入调用命令行工具(在MICROSOFT .NET的情况下是ngen. exe)的定制动作(诸如MIR0S0FT WINDOWS Installer动作)。定制动作不容易编写。此外,NGen映像可能由于各种原因(诸如在对应的库/汇编件被服务/更新时)而变得无效,且需要在每次发生时通过经由命令行工具发出显式命令来重新生成。当代的浏览器和其他应用程序允许通常包括托存软件代码的插件,托存软件代码与主存浏览器/应用程序交互以提供附加功能。使用插件的一种原因是增加安全性;主存浏览器限制托存代码(其通常是不受信任的)可以执行的动作。因特网已经变得非常危险,恶意网站常常尝试引起用户下载和运行可以损坏用户的计算机系统或破坏用户的数据的有害代码。因而,web浏览器常常包括对可以运行的代码的限制,以及可以在用户的计算机系统上执行动作的插件。插件增加了由浏览器提供的沙箱的大小,这是因为它们允许 web上的更多功能,同时降低了所安装的不受信任的应用程序的数量。一个这样的插件是 MICROSOFT SILVERLIGHT ,其提供允许应用程序开发者创建被主存在浏览器中的丰富的 web应用程序的平台,这些web应用程序通常包括动画、向量图形和/或媒体(例如,音频/ 视频)内容播放。另一示例插件是AD0BE FLASH 。虚拟执行环境通常使主机应用程序(主机本身可以以本机或托管代码来编写)定制托存托管代码在其中运行的环境的各方面成为可能。例如,主机可以指定与安全性相关的设置(以便设立沙箱),并记载动态链接库(DLL)(例如,以便指示从哪里加载DLL)。类似 NGen的提前编译器通常不访问这些设置,这是因为作为运行主机应用程序的一部分而生成它们。例如,这些设置在安装时通常不是已知的。当前的解决方案期望开发者运行主机应用程序,记录设置,且然后使得该信息对编译器可用。往往不存在提供此信息的受支持的方式,且即使是存在时,该过程也是手动的和冗长的。因此,托存托管代码通常不是预编译的,这导致经受性能和资源使用率的损失。

发明内容
在此描述托存(hosted)预编译系统,该托存预编译系统提供了允许提前编译在主机中运行的托管代码的方式。在可获得任何配置设置之后,主机在应用程序运行时触发提前编译。主机可以选择要编译哪些模块、何时编译它们、以及在什么地方持久存储所生成的映像。这使运行时环境免于推断应用程序设置,调度初始编译工作,以及跟踪何时映像变得无效且需要重新生成。映像在将要使用映像的应用程序的上下文中按需生成和重新生成。托存预编译系统标识应用程序是否在另一主机应用程序中运行,并让主机截取模块加载。在检测到模块加载时,主机能够触发预编译,为加载器提供模块现有的预编译映像,或者不做任何事情。运行时环境/平台确认任何主机供应的预编译映像的完整性,并提供应用程序编程接口(API)以便告知主机映像何时变得无效和加载失败。该平台也提供API以便使主机在与主机相关的任何时刻触发对二进制代码的编译,并同步地或在后台进程中生成映像。由此,托存预编译系统使得对于托存应用程序预编译成为可能。提供本发明内容以便以简化形式介绍将在以下的具体实施方式
中进一步描述的一些概念。本发明内容并不旨在标识出所要求保护的主题的关键特征或必要特征,也不旨在用于限定所要求保护的主题的范围。


图1是示出一种实施方式中的托存预编译系统的组件的框图。图2是示出一种实施方式中的托存预编译系统加载模块的处理的流程图。图3是示出一种实施方式中的托存预编译系统加载由托存环境使用的模块的处理的流程图。图4是示出一种实施方式中的托存预编译系统执行相关模块的主机发起的重新编译的处理的流程图。
具体实施例方式在此描述托存预编译系统,该托存预编译系统提供了允许提前编译在主机中运行的托管代码的方式。在可获得任何配置设置之后,主机在应用程序运行时触发提前编译。 主机可以选择要编译哪些模块(例如,DLL)、何时编译它们、以及在什么地方持久存储所生成的映像。这使运行时环境免于推断应用程序设置,调度初始编译工作,以及跟踪何时映像变得无效且需要重新生成。映像在将要使用映像的应用程序的上下文中按需生成和重新生成。托存预编译系统标识应用程序是否在另一主机应用程序中运行,并让主机截取模块加载。在检测到模块加载时,主机能够触发预编译,为加载器提供模块现有的预编译映像,或者不做任何事情。运行时环境/平台确认任何主机供应的预编译映像的完整性,并提供应用程序编程接口(API)以便告知主机映像何时变得无效和加载失败。该平台也提供API以便使主机在与主机相关的任何时刻触发对二进制代码的编译,并同步地或在后台进程中生成映像。当在另一应用程序主机中运行时,系统可以自动地将托管二进制代码(例如,MSIL、Java字节代码)预编译为机器码。系统给主机应用程序提供对要预编译的二进制代码、要使用的编译策略和存储所生成的映像的位置的完全控制。在所给定的预编译的二进制代码被确定为无效时(例如,因为相应的DLL改变,它们的依赖关系已经被改变,或针对其而构建它们的平台的版本改变),系统与主机通信。系统在运行应用程序的上下文中触发预编译,且由此所生成的映像将在应用程序的上下文中正确地工作。由此,托存预编译系统使得对于托存应用程序预编译成为可能,并通过产生本机映像来允许这样的环境具有与非托存环境不相上下的性能。在托管代码(例如,MSIL或Java字节代码)在另一主机应用程序中运行时,托管运行时环境(例如,MICROSOFT NET公共语言运行时环境(CLR))执行不同的代码路径以加载相关模块(例如,DLL)。作为其确定所给定的模块是否具有有效的预编译形式的逻辑的一部分,运行时加载器使主机应用程序选择从其中加载预编译的二进制的位置。运行时环境确认主机供应的二进制代码并且加载二进制代码并执行代码(照常)或确定二进制代码是无效的并向主机提供回调通知。主机可以监听该回调并使用运行时环境提供的API来触发新的(有效的)预编译的二进制的生成。借助于这样的回调或无需这样的回调,主机可以触发二进制代码的编译——在任何时刻且用于任何二进制代码集。所生成的映像完全在主机的控制下。运行时环境负责协调存在于机器上的预编译二进制代码的多个版本或副本(例如,一个在主机高速缓存中,一个在机器范围的高速缓存中),并负责确保所加载的映像是有效的和最新的。主机负责确定何时编译托管二进制代码(例如,在应用程序安装时、应用程序更新安装时、在特定映像在加载时被确定是无效时等等)、如何编译它们(同步地或异步地)以及管理所生成的预编译的映像(存储的大小、 如何快速地从存储检索映像、何时从存储删除或收回映像等等)。图1是示出一种实施方式中的托存预编译系统的组件的框图。系统100包括主机检测组件110、主机接口组件120、主机通知组件130、映像接收组件140、映像确认组件150、 编译组件160、映像存储组件170、映像数据存储180和执行引擎190。在此进一步详细描述这些组件中的每一个。主机检测组件110确定应用程序代码何时在托存环境中运行。应用程序可以自己(例如,单独)运行或可以由托存环境(例如,在应用程序沙箱内)执行。可以在诸如 MICROSOFT . NET运行时环境等用于两种类型的应用程序的运行时环境内实现系统100。主机检测组件110可以检测哪种应用程序类型正在运行并执行在此进一步描述的用于托存环境的逻辑。托存环境呈现不同的环境,因为主机的目的常常是控制安全设置、可访问的资源,或强加其他应用程序限制。运行时环境执行不妨碍主机的设置的逻辑,且主机检测组件 110允许运行时环境确定这样的主机的存在。在一些实施方式中,主机可以直接地告知运行时环境主机已经提供托存环境。在其他情况中,运行时环境可以基于所修改的安全设置或其他设置来自动地检测托存环境。主机接口组件120提供接口,托存环境可以通过该接口调用系统,例如以便从存储中间语言代码的模块编译映像。例如,主机接口可以包括API,该API允许主机指定要从中间语言编译为用于特定计算机的本机二进制映像的特定文件或文件目录的路径,该二进制映像将在该特定计算机上运行。主机可以在诸如在可以使先前所编译的二进制映像无效的事件发生时等的任何时刻使用主机接口。例如,在主机应用程序接收软件更新之后,应用程序可以重新编译任何先前所编译的二进制代码,或在初始的安装和执行之后,主机可以在第一时间将模块编译为本机的二进制映像。本领域普通技术人员应认识到,主机接口组件120可以使用各种编程普通技术和以各种编程语言(例如,组件对象模型(COM)接口、 MICROSOFT . NET类、web服务等等)来给出接口。主机通知组件130在与由主机环境使用的相关模块相关的事件发生时就通知主机。例如,当映像绑定器/加载器确定先前编译的二进制映像不再有效时,主机通知组件 130可以通知主机。映像可以由于诸如安全设置的改变、用于从其编译映像的模块接收的更新、对一个或多个平台二进制映像的更新、对主机应用程序的更新等的各种原由此变得无效。组件130还通知主机何时加载模块,使得主机可以提供到存储所编译的二进制映像的主机控制的映像高速缓存的路径。运行时环境可以使用高速缓存来寻找先前所编译的映像,并将由主机使用的新近所编译的映像存储在其中。映像接收组件140从主机接收到包含一个或多个先前所编译的二进制映像的位置的路径。允许主机控制在何处存储映像允许计算机系统包括在相同的计算机系统上独立地操作的多个分离的主机。主机高速缓存也将主机与由平台运行时环境提供的任何机器范围的高速缓存隔离开来。主机应用程序常常预期比正常应用程序环境更高的隔离级别,且由此可以预期对与主机一起使用的模块的更高的控制级别。映像接收组件接收特定主机在其中存储其二进制映像的位置,并搜索该位置以确定是否存在要被加载的模块的二进制映像。如果存在二进制映像,则映像接收组件140调用映像确认组件150来确定二进制映像是否是有效的。映像确认组件150确定所接收的二进制映像是否是与托存环境相关的相关模块的有效的经编译版本。在二进制映像反映当前编译通过使用当前设置的相关模块来产生的输出时,二进制映像是有效的。如果编译产生不同的二进制映像,则二进制映像不再是有效的且将被重新编译。映像确认组件150可以以各种方式确定映像是否是有效的,例如通过清查参加编译映像的所有输入和比较指示在相关模块的最近编译之后任何输入参数是否改变的时间戳。输入可以包括其他模块、安全或其他设置、主机组件等等。如果这些中的任一个已经改变,则映像确认组件150可以通知二进制映像不再是相关模块的有效的经编译版本,并调用编译组件160来产生新的二进制映像。编译组件160将被编写特定的语言的软件代码编译成机器可执行二进制指令。编译在此一般地使用,且可以包括多个步骤,例如句法分析、词汇分析、相关分析、编译、链接和软件程序的其他典型的构建步骤。编译组件160以不是本机可执行代码(例如,编程语言或中间代码)形式的输入开始,并产生可由物理机或虚拟机本机执行的输出。编译组件 160可以以文件或格式将输出存储在映像数据存储180 (例如,具有与原始的相关模块文件名称相关的文件名)或其他高速缓存(例如,全局汇编件高速缓存(GAC)或主机控制的高速缓存)中。映像存储组件170在托存环境控制下存储所编译的二进制映像。例如,编译组件 160可以在产生新的二进制映像时就通过主机通知组件130通知主机,使得主机可以将映像存储组件170引导到存储二进制映像的位置。映像存储组件170与主机通信,以便确定在哪里存储所编译的映像。主机也可以通过调用主机接口组件120在启动或在另一时刻提供存储位置。
映像数据存储180是由托存环境提供的用于高速缓存与托存环境相关的所编译的二进制映像的存储设备。映像数据存储180可以包括一个或多个文件、文件系统、数据库、基于云的存储服务或用于持久存储数据的任何其他设备。映像数据存储180由主机控制并允许主机将与托存环境一起使用的映像和可以被安装在计算机系统上的他二进制映像隔离开来。执行引擎190提供应用程序和相关模块在其中执行的上下文。取决于编程语言和由编程语言提供的更高级别的结构,执行引擎190可以是像操作系统执行处理器指令的流那样简单,或者像解码和执行沙箱中的指令的虚拟机环境那样复杂。执行引擎执行由系统 100提供的所编译的二进制映像。在其上实现托存预编译系统的计算设备可以包括中央处理单元、存储器、输入设备(例如,键盘和指点设备)、输出设备(例如,显示设备)和存储设备(例如,盘驱动器或其他非易失性存储介质)。存储器和存储设备是可以用实现或允许系统的计算机可执行指令(例如,软件)编码的计算机可读存储介质。另外,数据结构和消息结构可以经由诸如通信链路上的信号等的数据传输介质来存储或传输。可以使用诸如因特网、局域网、广域网、 点对点拨号连接、手机网络等的各种通信链接。可以在各种操作环境中实现系统的各实施方式,操作环境包括个人计算机、服务器计算机、手持式或膝上型计算机设备、多处理器系统、基于微处理器的系统、可编程消费性电子设备、数码相机、网络PC、小型计算机、大型计算机、包括上面的系统或设备中的任一种的分布式计算环境等等。计算机系统可以是手机、个人数字助理、智能电话、个人计算机、 可编程消费性电子设备、数码相机等等。可以在由一个或多个计算机或其他设备执行的诸如程序模块等的计算机可执行指令的一般的上下文中描述系统。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。通常,在各种实施方式中,程序模块的功能可以按照需要组合或分布。图2是示出在一种实施方式中托存预编译系统加载模块的处理的流程图。在框 210开始,系统接收模块加载请求。模块加载请求可以来自主机、来自执行应用程序的用户或来自另一源。模块可以是应用程序可执行文件、相关模块(例如,DLL)、插件或由软件程序使用的其他模块。模块加载请求可以通过提供到模块的文件系统路径或用于定位模块的其他标识符(例如,全局唯一标识符(GUID)、ProgID或其他标识符)来标识模块。在框220 继续,系统确定模块是否在托存环境内加载。托存环境可以在将环境标识为托存环境的运行时环境内配置设置。一旦运行应用程序或加载模块,运行时环境就检测事件并确定是否通知托存环境。在判定框230继续,如果系统在托存环境内操作,则系统在框240继续,否则系统在框250继续。在框240继续,系统执行如参考图3进一步描述的托存模块加载。托存加载通常涉及搜索主机提供的模块高速缓存以及在托存环境的指导下编译模块。在框250继续,系统执行传统的、非托存模块加载。传统的加载可以包括搜索用于存储所编译的二进制映像的全局汇编件高速缓存或其他机器范围的位置。在框250之后,这些步骤结束。图3是示出在一种实施方式中托存预编译系统加载由托存环境使用的模块的处理的流程图。在框310开始,系统通知托存环境在托存环境中加载模块的尝试。例如,系统可以调用由主机环境注册的回调函数并传送指示模块系统正在加载的参数。系统可以通过名称、路径或其他标识符指定模块。在框320继续,系统接收用于存储与加载模块相关的二进制映像的位置,其中该位置由托存环境管理。位置可以包括主机提供的高速缓存,例如在由托存环境管理的特定的文件系统目录中。通过提供位置,主机可以指导系统在不同于默认的机器范围的位置的位置处查找二进制映像,使得主机可以适合于在托存环境中使用的映像(例如,用某些安全设置或其他配置参数来编译)。在框330继续,系统确认在所接收的位置处被访问的所存储的二进制映像。确认可以包括确定二进制映像在其下被编译的设置并将该设置与当前的设置进行比较、确定关于依赖关系(所指定的映像所依赖的模块)或主机模块的版本信息等等。确认确定所存储的二进制映像是否适合于执行。如果二进制映像不适合于执行,则系统将重新编译模块以产生新的二进制映像。因为编译是耗费时间的过程,尤其是当许多模块要被加载时,所以系统在策略上避免使用各种试探法的重新编译。在判定框340继续,如果系统确定所存储的二进制映像是有效的,则系统转到框 380并使得所存储的映像准备执行,否则系统在框350继续以开始产生新的、经更新的二进制映像的过程。在应用程序的首次运行时,主机可以完全不查找任何映像(即,先前的编译没有发生)。此情况与查找无效的映像相似且不单独地示出。在框350继续,系统通知托存环境所存储的二进制映像是无效的。主机可以以各种方式响应该通知。例如,主机可以完全忽视该通知,存储二进制映像是不能用于所运行的稍后调度的编译的信息,或立即指导系统以重新编译模块以产生新的二进制映像。托存环境通过在此描述的主机接口接收通知。在框360继续,系统接收生成加载模块的新二进制映像版本的主机请求。在无效映像的通知期间或稍后,系统可以接收生成映像的请求。例如,主机可以在由主机确定是适当的时刻周期性地重新编译任何无效的映像。系统给主机提供决定对编译的控制。托存环境出于各种目的执行各种任务,且可能希望在特定时刻或在特定条件下避免重新编译。由此,托存环境可以指定更适合于主机的用于重新编译的稍后时刻。一旦从主机接收最终生成新的二进制映像的请求,系统就调用编译器来从特定的模块产生映像。在框370继续,系统在主机提供的位置存储新的二进制映像。该位置可以包括主机高速缓存或由主机管理的其他存储设备。主机可以使用其自己的策略来管理存储位置。 例如,主机可以周期性地使得被存储在该位置的所有的映像无效,以强迫重新生成映像。主机从事确定为什么产生新的映像和何时产生新的映像。在框380继续,系统使得映像准备执行。如果所存储的映像是有效的,则使得所存储的映像准备执行。如果映像是通过编译新近生成的,则使得新映像准备执行。准备执行随编程环境、语言、操作系统和/或机器体系结构而变化,但是可以包括诸如将映像映射到存储器中、安排任何分支位置、分配存储器空间等的步骤。在准备执行后,二进制映像准备好运行或由其他二进制映像调用。在框380之后,这些步骤结束。图4是示出在一种实施方式中托存预编译系统执行相关模块的主机发起的重新编译的处理的流程图。图3描述由运行时环境发起的模块加载。图4描述其中主机已经确定其想要带外(例如,以某种主机确定的时间表)重新编译二进制映像的情况。在框410开始,系统从主机接收输入模块,其中输入模块提供要编译的软件代码。输入模块可以包括先前从一个或多个编程语言源文件和/或资源文件编译的模块存储中间语言代码。在框420 继续,系统接收在其处存储从输入模块生成的所编译的二进制映像的输出位置。输出位置是由主机管理的用于存储由主机使用的二进制映像的位置(例如,与主机相关联的文件系统目录)。在框430继续,系统从主机接收二进制映像生成请求。该请求可以包括一个或多个编译设置、安全配置参数、优化设置和用于从输入模块生成二进制映像的其他信息。在框 440继续,系统确定影响与所编译的二进制映像相关联的输出代码的一个或多个主机环境设置。诸如MICROSOFT . NET等的一些环境提供可以取决于与模块相关联的信任级别而导致不同的二进制输出的信任模型。例如,环境可以为由不受信任的模块调用的API而不是为受信任的模块而执行附加的安全检查。在框450继续,系统定位影响与所编译的二进制映像相关联的输出代码的任何模块依赖关系。例如,模块可以包括指定被存储在相关模块中的相关代码的导入指令。系统可以在主题输入模块的编译期间使用此信息。在框460继续,系统使用所确定的主机环境设置和其他信息从所接收的输入模块构建二进制映像。构建可以包括将中间代码转换为所关联的机器本机的指令。中间代码可以在虚拟机上运行,而本机的指令在物理处理器(例如,中央处理单元(CPU))上运行。构建可以基于所检测的处理器或其他环境设置来产生优化的代码。在框470继续,系统在主机提供的输出位置处存储所构建的二进制映像,用于随后的执行。主机可以维持所构建的二进制映像的高速缓存,用于响应于模块加载或执行请求。系统通知主机何时需要特定的二进制映像,且主机可以从输出位置提供任何先前所构建的映像。在框480继续,系统通知主机完成了二进制映像生成。如果所构建的进程遭遇错误,则系统可以在通知中提供错误并告知主机没有产生二进制映像。对于成功的构建,主机可以使用该通知来触发其他动作,例如在托存环境中执行应用程序。在框480之后,这些步
骤结束ο在一些实施方式中,托存预编译系统仅预编译一些模块。是否预编译特定的映像的决定是留给主机的性能决定。主机可以具有影响决定的知识,例如被频繁地更新的特定模块导致不预编译而是在每次使用时编译的决定。对于诸如偶尔改变的那些模块等的其他模块,主机可以选择预编译,使得二进制映像是可用的且不会过度地延迟使用模块的程序的执行。在一些实施方式中,托存预编译系统允许主机选择同步编译或异步编译。对于一些模块,主机可以决定等待编译完成,例如在主机具有用于执行模块的即时使用时的情况。 在其他情况,主机可以允许编译组件以其自己的时间表来完成并通知主机编译何时完成 (例如,异步地)。在一些实施方式中,在应用程序改变时,托存预编译系统从主机接收抛弃所编译的映像指示。主机控制映像数据存储且可以及时指定使高速缓存无效和清除所编译的二进制代码的点。在一些实施方式中,主机可以通过等待来迟钝地直到映像的下一个请求才抛弃映像,确定是否到了抛弃映像的时间,且如果是这样,则抛弃映像。在一些实施方式中,托存预编译系统基于应用程序的权限级别来确定在什么地方寻找所编译的二进制映像。例如,对于拥有较少权限的模块,系统可以使用主机提供的或应用程序提供的位置,但是允许更受信任的应用程序将所编译的映像放在全局汇编件高速缓存(GAC)或本机的映像高速缓存(OTC)中。将更多的所编译的映像放在GAC中允许更多应用程序共享相同的所编译的二进制映像(由此,如果可以公共地将映像映射在存储器中的话,则节省盘空间和存储器使用)。然而,如果应用程序将映像放在不按预期执行的地方,则将映像放在GAC可能引入安全风险。由此,对于受信任的应用程序,系统可以优选GAC,但是对于较不受信任的应用程序,系统可以使用应用程序供应的高速缓存。在一些实施方式中,托存预编译系统将额外的信息提供给主机应用程序。例如,系统可以允许主机执行名称解析并请求模块的特定的版本。然后,想要使用模块的特定版本的主机可以申请该模块。系统跟踪全部依赖关系版本,且可以具有在相同的时间被存储在系统上的相同的本机映像的多个版本以满足主机请求。在一些实施方式中,托存预编译系统允许主机应用程序禁止确认或进一步控制确认。确认映像可以是耗费时间的过程,且对于某些严格界定的情况,一些主机(例如, MICROSOFT SILVERLIGHT 或MICROSOFT ASP. NET)可能想要跳过确认的全部或一部分。 因此,主机可以将系统配置为跳过确认或通知主机确定是否在特定的情况(例如,在特定的模块的加载期间)执行确认。从上文将会认识到,虽然在此已出于说明目的描述了托存预编译系统的具体实施例,但是可以做出各种修改而不背离本发明的精神和范围。相应地,本发明不受限制,只受所附的权利要求书的限制。
权利要求
1.一种用于在中间语言中加载模块以供托存环境使用的计算机实现的方法,所述方法包括接收210模块加载请求;确定220所述模块是否正在托存环境内加载;将在所述托存环境中加载模块的尝试通知310给所述托存环境;接收320用于存储与所述加载模块相关的二进制映像的位置,其中所述位置由所述托存环境管理;确认330在所接收的位置被访问的所存储的二进制映像;当确定340所存储的二进制映像无效时,通知350所述托存环境所存储的二进制映像是无效的;接收360生成所述加载模块的新二进制映像版本的主机请求;将所述新二进制映像存储370在主机所提供的位置;以及使所述映像准备380执行,其中上述步骤由至少一个处理器来执行。
2.如权利要求1所述的方法,其特征在于,接收所述模块加载请求包括接收执行应用程序的用户的指示,其中所述请求包括到所述模块的文件系统路径。
3.如权利要求1所述的方法,其特征在于,确定所述模块是否正在托存环境中加载包括检测所述托存环境在将所述环境标识为托存的运行时环境内配置一个或多个设置。
4.如权利要求1所述的方法,其特征在于,将加载所述模块的所述尝试通知给所述托存环境包括调用由所述主机环境注册的回调函数以及标识正被加载的所述模块。
5.如权利要求1所述的方法,其特征在于,接收用于存储所述二进制映像的所述位置包括接收由所述托存环境管理的主机提供的高速缓存的位置。
6.如权利要求1所述的方法,其特征在于,接收用于存储所述二进制映像的所述位置允许所述主机环境将适合在所述托存环境中使用的映像与其他系统范围的映像隔离开来。
7.如权利要求1所述的方法,其特征在于,确认所存储的二进制映像包括确定所述二进制映像在其下被编译的设置和将所述设置与当前设置进行比较。
8.如权利要求1所述的方法,其特征在于,确认所存储的二进制映像包括确定所存储的二进制映像的版本信息并将所述版本信息与所述模块的版本信息进行比较。
9.如权利要求1所述的方法,其特征在于,通知所述托存环境所存储的二进制映像是无效的包括调用由所述主机环境注册的回调函数并指示需要编译所述模块。
10.如权利要求1所述的方法,其特征在于,接收生成所述新二进制映像的所述主机请求包括在已经处理所存储的二进制映像是无效的通知之后的稍后的主机确定的时刻接收所述请求。
11.如权利要求1所述的方法,其特征在于,接收生成所述新二进制映像的所述主机请求包括调用编译器以便从所述加载模块产生所述映像。
12.如权利要求1所述的方法,其特征在于,存储所述新二进制映像包括将所述二进制映像存储在由所述主机管理的主机高速缓存内。
13.一种用于预编译托存应用程序代码的计算机系统,所述系统包括 被配置成执行软件指令的处理器和存储器;主机检测组件110,所述主机检测组件110被配置成确定应用程序代码是否在托存环境中运行;主机接口组件120,所述主机接口组件120被配置成提供所述托存环境可以用来调用所述系统以便从存储中间语言代码的模块编译映像的接口;主机通知组件130,所述主机通知组件130被配置成在发生与由所述主机环境使用的模块相关的一个或多个事件时通知主机;映像接收组件140,所述映像接收组件140被配置成从所述主机接收到包含一个或多个先前编译的二进制映像的位置的路径;映像确认组件150,所述映像确认组件150被配置成确定所接收的二进制映像是否是与所述托存环境相关的模块的有效的已编译版本;编译组件160,所述编译组件160被配置成将以特定语言编写的软件代码编译成机器可执行二进制指令;映像存储组件170,所述映像存储组件170被配置成在所述托存环境控制下存储所编译的二进制映像;以及映像数据存储180,所述映像数据存储180被配置成提供用于高速缓存与所述托存环境相关的所编译的二进制映像的存储设备。
14.如权利要求13所述的系统,其特征在于,所述主机接口组件还被配置成提供应用程序编程接口(API),所述主机可以通过所述API来指定到要从中间语言编译为用于特定计算机的本机二进制映像的特定文件或文件目录的路径,所述二进制映像将在所述特定计算机上运行。
15.如权利要求13所述的系统,其特征在于,所述映像确认组件还被配置成接收指示是否执行确认的配置设置,并且其中所述主机通知组件还被配置成当确定作为执行确认的结果先前编译的二进制映像不再有效时通知所述主机。
全文摘要
在此描述托存预编译系统,该托存预编译系统提供了允许提前编译在主机中运行的托管代码的方式。在可获得任何配置设置之后,主机在应用程序运行时触发提前编译。主机可以选择要编译哪些模块、何时编译它们、以及在什么地方持久存储所生成的映像。在检测到模块加载时,主机能够触发预编译,为加载器提供模块现有的预编译映像,或者不做任何事情。运行时环境/平台确认任何主机供应的预编译映像的完整性,并提供应用程序编程接口(API)以便告知主机映像何时变得无效和加载失败。该平台也提供API以便使主机在与主机相关的任何时刻触发对二进制代码的编译,并同步地或在后台进程中生成映像。
文档编号G06F9/45GK102279765SQ201110170869
公开日2011年12月14日 申请日期2011年6月13日 优先权日2010年6月14日
发明者B·T·福斯托尔, D·L·德特勒夫斯, K·B·弗雷, R·克里希纳斯瓦米, S·比斯沃斯 申请人:微软公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1