生成和高速缓存软件代码的制作方法

文档序号:6533052阅读:123来源:国知局
生成和高速缓存软件代码的制作方法
【专利摘要】本文所描述的主题内容的各方面涉及生成和高速缓存软件代码。在各方面,目标设备可接收要安装的软件。该软件可包括尚未被编译的源代码。目标设备可以安装该软件并且指示包的该源代码要被编译成中间代码或可执行代码,该中间代码或可执行代码被持久存储。如果目标设备在该软件被编译之前接收到要执行该软件的请求,则目标设备可以没有延迟地编译和执行该软件。如果目标设备在该软件被编译之后接收到要执行该软件的请求,则目标设备可以获得和执行经编译的代码。以上行为还可被应用于从在目标设备远程的服务器处获得的脚本代码。
【专利说明】生成和高速缓存软件代码
[0001]直量
[0002]可以在各种环境中找到脚本语言。例如,许多因特网浏览器具有允许网页基于用户输入或其它数据来定制其行为的脚本语言。还可在因特网浏览器外部的环境中找到脚本语言。关于脚本语言的一个问题是与已经被编译的常规程序相比它们可能较慢——尤其在启动时以及可能地伴随每一执行。
[0003]在此要求保护的主题不限于解决任何缺点或仅在诸如上述环境中操作的各个实施例。相反,提供该背景仅用以示出在其中可实践在此描述的部分实施例的一个示例性【技术领域】。
[0004]
[0005]简单来说,本文所描述的主题内容的各方面涉及生成和高速缓存软件代码。在各方面,目标设备可接收要安装的软件。该软件可包括尚未被编译的源代码。目标设备可以安装该软件并且指示包的源代码要被编译成中间代码或可执行代码,该中间代码或可执行代码被持久存储。如果目标设备在该软件被编译之前接收到要执行该软件的请求,则目标设备可以没有延迟地编译和执行该软件。如果目标设备在该软件被编译之后接收到要执行该软件的请求,则目标设备可以获得和执行经编译的代码。以上行为还可应用于从目标设备远程的服务器获得的脚本代码。
[0006]提供本概述是为了简要地标识在以下详细描述中进一步描述的主题的一些方面。本概述并不旨在标识出所要求保护的主题的关键特征或必要特征,也不旨在用于限制所要求保护的主题的范围。
[0007]除非上下文清楚地指出,否则短语“此处所描述的主题”指的是【具体实施方式】中描述的主题。术语“方面”应被当作“至少一个方面”。标识【具体实施方式】中所描述的主题的各方面不旨在标识所要求保护的主题的关键特征或必要特征。
[0008]上述各方面和此处所描述的主题的其它方面是借助于示例说明的,并且不受附图限制,附图中相同的标号指示相似的元素。
[0009]附图简沭
[0010]图1是表示其中可结合本文所描述主题内容的各方面的示例性通用计算环境的框图;
[0011]图2是表示本文所描述的主题内容的各方面可在其中操作的系统组件的示例性安排的框图;
[0012]图3解说了可根据本文所描述的主题内容的各方面来使用的示例性数据结构;
[0013]图4是表示本文所描述的主题内容的各方面可在其中操作的环境的组件的示例性安排的框图;以及
[0014]图5-6是概括地表示根据本文所描述的主题的各方面的可发生的示例性动作的流程图。
[0015]详细描沭
[0016]定义
[0017]如本文所使用的,术语“包括”及其变体被当作开放式术语,表示“包括但不限于”。除非上下文另外清楚地指示出,否则术语“或”被当作“和/或”。术语“基于”被当作“至少部分地基于”。术语“一个实施例”和“一实施例”被当作“至少一个实施例”。术语“另一实施例”被当作“至少一个其他实施例”。
[0018]如本文所使用的,诸如“一”和“该”等术语包括了所指示的项或动作中的一个或多个。具体而言,在权利要求书中,对某一项的引用一般表示存在至少一个这样的项,并且对一动作的引用表示执行该动作的至少一个示例。
[0019]本文中有时可使用术语“第一”、“第二”、“第三”等等。没有其他上下文,权利要求中对这些术语的使用不意在暗示排序,而是用于标识的目的。例如,短语“第一版本”和“第二版本”不一定意味着第一版本是真正的第一个版本或是在第二版本之前创建的,或甚至是第一版本是在第二版本之前被请求或操作的。相反,这些短语用于标识不同的版本。
[0020]标题仅是为了方便;关于给定话题的信息可在其标题指示该话题的节之外被寻找到。
[0021]其他显式或隐式定义可包括在下文中。
[0022]示例性操作环境
[0023]图1示出可在其上实现本文所描述的主题的各方面的合适的计算系统环境100的示例。计算系统环境100仅为合适的计算环境的一个示例,并非旨在对本文所描述的主题的各方面的使用范围或功能提出任何限制。也不应该将计算环境100解释为对示例性操作环境100中示出的任一组件或其组合有任何依赖性或要求。
[0024]本文所描述的主题的各方面可与众多其他通用或专用计算系统环境或配置一起操作。可适用于这里所述的主题的各方面的已知计算系统、环境或配置的例子包括个人计算机,服务器计算机,手持或膝上型设备,多处理器系统,基于微控制器的系统,机顶盒,可编程消费电子设备,网络PC,微型计算机,大型计算机,个人数字助理(PDA),游戏设备,打印机,包括机顶盒、媒体中心或其他家电的家电设备,嵌入汽车或附加到汽车的计算设备,其他移动设备,包括任何上述系统或设备的分布式计算环境等等。
[0025]本文所描述的主题的各方面可在由计算机执行的诸如程序模块等计算机可执行指令的一般上下文中描述。一般而言,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。本文所描述的主题的各方面也可以在其中任务由通过通信网络链接的远程处理设备执行的分布式计算环境中实现。在分布式计算环境中,程序模块可以位于包括存储器存储设备在内的本地和远程计算机存储介质中。
[0026]参考图1,用于实现本文所描述的主题的各方面的示例性系统包括计算机110形式的通用计算设备。计算机可包括能够执行指令的任何电子设备。计算机110的组件可包括处理单元120、系统存储器130以及将包括系统存储器的各种系统组件耦合至处理单元120的系统总线121。系统总线121可以是若干类型的总线结构中的任一种,包括使用各种总线体系结构中的任一种的存储器总线或存储器控制器、外围总线、以及局域总线。作为示例,而非限制,这样的架构包括工业标准架构(ISA)总线、微通道架构(MCA)总线、增强型ISA(EISA)总线、视频电子技术标准协会(VESA)局部总线、也称为夹层(Mezzanine)总线的外围部件互连(PCI)总线、扩展外围部件互连(PC1-X)总线、高级图形端口(AGP)、以及PCIExpress (PCIe)。
[0027]处理单元120可以连接到硬件安全设备122。安全设备122可以存储并能够生成密钥,所述密钥可用于保护计算机I1的各个方面。在一个实施例中,安全设备122可以包括可信平台模块(TPM)芯片、TPM安全设备等等。
[0028]计算机110通常包括各种计算机可读介质。计算机可读介质可以是能由计算机110访问的任何可用介质,并包含易失性和非易失性介质以及可移动、不可移动介质。作为示例而非限制,计算机可读介质可包括计算机存储介质和通信介质。
[0029]计算机存储介质包括以用于存储诸如计算机可读指令、数据结构、程序模块或其它数据等信息的任何方法或技术来实现的易失性和非易失性、可移动和不可移动介质。计算机存储介质包括但不限于,RAM、ROM、EEPR0M、闪存或其它存储器技术、CD-ROM、数字多功能盘(DVD)或其它光盘存储、磁盒、磁带、磁盘存储或其它磁存储设备、或可以用来储存所期望的信息并可由计算机110访问的任一其它介质。
[0030]通信介质通常以诸如载波或其他传输机制等已调制数据信号来体现计算机可读指令、数据结构、程序模块或其他数据,并包括任何信息传送介质。术语“已调制数据信号”是指使得以在信号中编码信息的方式来设定或改变其一个或多个特征的信号。作为示例而非限制,通信介质包括有线介质,诸如有线网络或直接线连接,以及无线介质,诸如声学、RF、红外线和其他无线介质。上述的任意组合也应包含在计算机可读介质的范围内。
[0031]系统存储器130包括易失性和/或非易失性存储器形式的计算机存储介质,如只读存储器(ROM) 131和随机存取存储器(RAM) 132。包含诸如在启动期间帮助在计算机110内的元件之间传输信息的基本例程的基本输入/输出系统133 (B1S)通常存储在ROM 131中。RAM 132通常包含处理单元120可立即访问和/或当前正在操作的数据和/或程序模块。作为示例而非限制,图1示出了操作系统134、应用程序135、其它程序模块136和程序数据137。
[0032]计算机110也可以包括其它可移动/不可移动、易失性/非易失性计算机存储介质。仅作为示例,图1示出了从不可移动非易失性磁介质中读取或向其写入的硬盘驱动器141,从可移动非易失性磁盘152中读取或向其写入的磁盘驱动器151,以及从诸如⑶ROM或其他光学介质等可移动非易失性光盘156中读取或向其写入的光盘驱动器155。可以在该示例性操作环境中使用的其他可移动/不可移动、易失性/非易失性计算机存储介质包括磁带盒、闪存卡和其他固态存储设备、数字多功能盘、其他光盘、数字录像带、固态RAM、固态ROM等等。硬盘驱动器141可通过接口 140连接至系统总线121,而磁盘驱动器151和光盘驱动器155可通过诸如接口 150之类的用于可移动非易失性存储器的接口连接至系统总线 121。
[0033]以上讨论并在图1中示出的驱动器及其相关联的计算机存储介质为计算机110提供了对计算机可读指令、数据结构、程序模块和其他数据的存储。例如,在图1中,硬盘驱动器141被示为存储操作系统144、应用程序145、其它程序模块146和程序数据147。注意,这些组件可与操作系统134、应用程序135、其它程序模块136和程序数据137相同,也可与它们不同。操作系统144、应用程序145、其他程序模块146和程序数据147在这里被标注了不同的附图标记是为了说明至少它们是不同的副本。
[0034]用户可以通过输入设备,如键盘162和定点设备161 (通常被称为鼠标、跟踪球或触摸垫)向计算机110输入命令和信息。其它输入设备(未示出)可包括话筒、操纵杆、游戏手柄、圆盘式卫星天线、扫描仪、触敏屏、写字板、姿势捕捉设备等。这些以及其它输入设备通常通过耦合到系统总线的用户输入接口 160连接到处理单元120,但也可通过诸如并行端口、游戏端口或通用串行总线(USB)之类的其它接口和总线结构来连接。
[0035]监视器191或其它类型的显示设备也经由诸如视频接口 190之类的接口连接至系统总线121。除了监视器以外,计算机还可包括诸如扬声器197和打印机196之类的其它外围输出设备,它们可通过输出外围接口 195来连接。
[0036]计算机110可使用到一个或多个远程计算机(诸如,远程计算机180)的逻辑连接而在联网环境中操作。远程计算机180可以是个人计算机、服务器、路由器、网络PC、对等设备或其它常见网络节点,且通常包括上文相对于计算机110描述的许多或所有元件,但在图1中只示出存储器存储设备181。图1中所示的逻辑连接包括局域网(LAN) 171和广域网(WAN) 173,但也可以包括其它网络。这样的联网环境常见于办公室、企业范围计算机网络、内联网和因特网中。
[0037]当在LAN联网环境中使用时,计算机110通过网络接口或适配器171连接到LAN170。当在WAN联网环境中使用时,计算机110可包括调制解调器172或用于通过诸如因特网等WAN 173来建立通信的其他装置。可为内置或可为外置的调制解调器172可以经由用户输入接口 160或其他合适的机构连接至系统总线121。在联网环境中,相关于计算机110所示的程序模块或其部分可被存储在远程存储器存储设备中。作为示例而非限制,图1示出了远程应用程序185驻留在存储器设备181上。应当理解,所示的网络连接是示例性的,并且可使用在计算机之间建立通信链路的其它手段。
[0038]生成和高速缓存代码
[0039]如先前所提及的,与已经被编译的常规程序相比,脚本语言对于用户而言可能显得较慢,尤其在初始启动时。
[0040]图2是表示本文所描述的主题内容的各方面可在其中操作的系统组件的示例性安排的框图。图2中示出的各组件是示例性的且不意味着包括一切的可能需要或包括的组件。在其他实施例中,结合图2描述的组件和/或功能可被包括在其他组件(示出或未示出)中或者被放置在子组件中而不背离此处所描述的主题的各方面的精神或范围。在某些实施例中,结合图2所描述的组件和/或功能可跨多个设备地分布。
[0041]转向图2,系统205可包括脚本组件210、存储220、通信机制225、和其它组件(未示出)。系统205可包括一个或多个计算设备。这些设备可包括,例如,个人计算机,服务器计算机,手持式或膝上型设备,多处理器系统,基于微控制器的系统,机顶盒,可编程消费电子产品,网络PC,小型计算机,大型计算机,蜂窝电话,个人数字助理(PDA),游戏设备,打印机,包括机顶盒、媒体中心或其他电器在内的电器,汽车嵌入式或附连的计算设备,其他移动设备,包括以上系统或设备中的任一种的分布式计算环境等。
[0042]在系统205包括单个设备的情况下,可被配置为充当系统205的示例性设备包括图1的计算机110。在系统205包括多个设备的情况下,该多个设备中的每个设备都可包括与图1的计算机110类似地配置或不同地配置的计算机。
[0043]脚本组件210可包括安装器215、代码生成器216、高速缓存管理器217、执行管理器218和其它组件(未示出)。如这里所使用的,术语组件要被当作包括以下的全部或一部分来理解:设备、一个或多个软件模块或其部分的集合、一个或多个软件模块或其部分与一个或多个设备或其部分的某种组合等等。
[0044]通信机制225允许系统5和其它实体通信。例如,通信机制225可允许系统205与其它实体通信以获得可高速缓存在系统205上的包和/或脚本代码。通信机制255可以是结合图1描述的网络接口或适配器170、调制解调器172或用于建立通信的任何其它机制。
[0045]存储220是能够提供对数据的访问的任何存储介质。此处使用的访问可包括读数据、写数据、删除数据、更新数据、以及包括以上两个或更多个的组合等。存储可包括易失性存储器(例如,RAM、存储器内的高速缓存等等)和非易失性存储器(例如,持久存储)。
[0046]术语数据要被宽泛地看作包括可由一个或多个计算机存储元素表示的任何东西。逻辑上,数据可被表示成易失性或非易失性存储器中的一系列I和O。在具有非二进制存储介质的计算机中,数据可根据存储介质的能力来表示。数据可被组织成不同类型的数据结构,包括诸如数字、字母等之类的简单数据类型,分层、链接或其他相关数据类型、包括多个其他数据结构或简单数据类型的数据结构等等。数据的某些例子包括信息、程序代码、程序状态、程序数据、其他数据等等。
[0047]存储220可包括硬盘存储、其他非易失性存储、诸如RAM之类的易失性存储器、其它存储、以上的某种组合等,并可以分布在多个设备中。存储220可以是外部的、内部的、或包括装置205内部和外部的组件。
[0048]为了降低启动和执行时间,降低存储器覆盖区,为了能够进行保护以防篡改,以及出于其它原因,代码生成器216可以将源代码编译成字节代码或者某种其它中间代码或可执行代码。代码包括指示计算机要采取的动作的指令。代码还可包括含除了计算机要采取的动作之外的信息的数据、资源、变量、定义、关系、关联等等。例如,代码可包括图像、网页、HTML、XML、其它内容等等。在一实施例中,代码可被包括在软件项目中。软件可包括或参考含除了计算机要采取的动作、配置信息等之外的信息的一个或多个代码部分、数据、资源、变量、定义、关系、关联等等。
[0049]由代码所指示的动作可被编码在源代码语言中,该源代码语言包括脚本和非脚本语目、中间语目、汇编语目、二进制代码、其它语目、以上的某种组合等等。
[0050]安装器215可以在系统205上安装包。包可包括一个或多个软件应用。安装器215可包括部署扩展处理程序,该部署扩展处理程序允许基于所安装的包、包被安装在其上的目标机器、包是否包括脚本代码或者其它准则来执行定制动作。
[0051]在一个实现中,当安装器215遇到其中具有脚本代码的包时,安装器215可以将与该包的各组件相对应的元素添加到队列或其它数据结构以供对包的代码进行预编译。
[0052]代码生成器216可以从该数据结构中取出元素并且从与每一元素相对应的代码中生成字节代码、可执行代码、或某种其它代码。元素可包括包含脚本的文件、文件的一部分(例如,嵌入在HTML页面内的脚本)、经编译代码等等。出于简化的目的,术语字节代码在本文中常常被用来表示代码生成器216生成的代码。然而,要理解的是,代码生成器216不限于生成和高速缓存字节代码,并且在其它实现中,可以生成和高速缓存其它类型的代码,包括先前提及的那些类型的代码。
[0053]在一个实现中,代码生成器216可以在生成字节代码之前等待,直到包已经被完全安装并且与该包相对应的元素被置于数据结构中以供编译。在另一实现中,代码生成器216可以在元素在数据结构中可用时或者源代码模块被安装时马上开始生成字节代码。在这一其它实现中,在一个示例中,如果包安装失败,则代码生成器216可以去除所生成的字节代码。在另一示例中,代码生成器216可以从其停止的点(例如,在恢复供电并且机器被重新引导之后)恢复生成。在一个实现中,代码生成器216可被实现为当系统205空闲(例如,不在安装包或执行消耗系统205的处理带宽的其它任务)时、当系统205正在电源线(例如,代替电池电源)上操作时、在一天中定义的或可配置的时间等等要执行的过程。
[0054]在此使用的术语“进程”及其变体可包括一个或多个传统的进程、线程、组件、库、执行任务的对象等等。可以硬件、软件、或硬件和软件的组合来实现进程。在一实施例中,无论如何命名,进程是能够执行或者用于执行动作的任何机制。进程可分布在多个设备或单个设备上。
[0055]在一个实现中,代码生成器216还可用于在运行时(例如在遇到代码时)生成代码。例如,如果用户安装软件并且想要在包括该软件的整个包的字节代码被生成之前运行该软件,则代码生成器216可被按需采用来生成该软件的代码。换言之,不要求用户在该用户被允许执行包的软件之前等待代码生成器216为整个包生成字节代码。另外,可能存在其中组件的源代码已经改变并且其中代码生成器216可被部署以在加快的基础上生成该组件的字节代码的其他情况。
[0056]此外,代码生成器216可被按需采用来编译代码和高速缓存代码。例如,在因特网浏览器应用中,去往新的代码的链接可被动态地发现。例如,web文档可包括去往要被下载和执行的其它代码的链接。代码生成器216可被采用来编译由这些链接指代的代码并且高速缓存经编译的代码以加速对该代码的后续执行。
[0057]代码生成器216可实现在“沙箱”中或者使用“沙箱”来生成代码。沙箱是对于其可访问的数据具有有限权限的环境。在一种实现中,代码生成器216可被实现为具有有限权限的过程。该过程可被传递去往该过程可以读取并写入的字节代码文件的句柄并且可以被给予对源代码的只读访问。出于安全目的,该过程可能无法访问除了以上提及的那些资源之外的其它资源。
[0058]在一个实现中,代码生成器216可被主存在虚拟环境中。虚拟环境是由计算机来模仿或模拟的环境。虚拟环境可模仿或模拟物理机器、操作系统、一个或多个接口的组、以上各项的部分、或以上各项的组合等等。在机器被模仿或被模拟时,该机器有时被称为虚拟机。对于在虚拟机上执行的软件来说,虚拟机是一种看上去是物理机器的机器。该软件可将文件保存在诸如虚拟硬盘驱动器、虚拟软盘等之类的虚拟存储设备中,可从虚拟CD处读取文件,可经由虚拟网络适配器来进行通信等等。
[0059]虚拟环境可能受限地访问或者无法访问虚拟环境外部的数据或其它资源。由此,虚拟环境可以提供用于编译不被信任的代码的合适环境而不必担心该代码是否会影响该虚拟环境的主机。
[0060]在将字节代码写入文件之后,该过程可电子地签署或者以其它方式“密封”该文件以使得能够检测到对文件的任何修改。密封文件可以采用本领域技术人员将理解的许多加密和/或文件系统形式。例如,在一个实现中,文件系统可以在密封时在文件上设置扩展属性。如果之后文件被修改,则该扩展属性可被改变以指示文件不再是密封的。
[0061]将字节代码写入存储220在本文有时被称为高速缓存字节代码。高速缓存管理器217可用于将字节代码存储在存储220上并且按需提供对字节代码的访问。高速缓存管理器217可确保字节代码被持久存储在存储220上以使得字节代码在系统205重启之后是可用的。高速缓存管理器217还可将字节代码的副本存储在主存储器、高速的高速缓存存储器、视频存储器、包括易失性和非易失性存储器的其它存储器(按需)等等中以加速对字节代码的访问。
[0062]此外,尽管术语文件在此处有时被使用,但要理解,在其它实现中,字节代码可被写入易失性和/或非易失性存储器、数据库或其部分(例如,记录)、或某种其它存储而不背离此处描述的主题内容的各方面的精神或范围。
[0063]如果超过一个用户安装了包,则一种实现可以将该包的字节代码的多个副本或者仅一个副本高速缓存在存储220中。在包的目标为超过一个处理器架构(例如,32位和64位)的情况下,代码生成器216可以为每个处理器架构生成和高速缓存定标的字节代码。
[0064]在一些实现中,可能存在用于再次生成包的字节代码的若干触发。例如,如果包括字节代码的文件的密封已经被破坏(例如,检测到篡改),则存储介质可能变得受到破坏,或者其它数据指示高速缓存可能是无效的或者不是完整的,这可以充当要再次生成包的字节代码的触发。在该情形中,如果执行管理器218确定密封已经被破坏,则执行管理器218可以指令代码生成器216再次生成该包的字节代码。代码生成器216可以用与代码生成器216第一次如何生成字节代码(例如,通过将与包的组件相对应的元素置于队列或其它数据结构中以指示需要生成字节代码)相类似的方式来再次生成字节代码。
[0065]作为另一示例,如果使用字节代码的环境已经被升级至新的版本,则这可触发再次生成该字节代码。例如,如果因特网浏览器或另一执行环境已经被升级至具有不同字节代码语法或句法的新版本,则这可以触发再次生成适用于新版本的字节代码。在该示例中,触发可以在用户试图执行与字节代码相关联的软件时发生。这可以致使字节代码在使用时被生成并且可以避免同时再次生成所有已安装包的字节代码。
[0066]作为另一示例,如果周期性维护任务检测到执行环境已经被升级至具有不同字节代码语法或句法的新版本,则这可以触发再次生成适用于新版本的字节代码。
[0067]作为另一示例,如果要安装包的新版本,则这可充当再次生成字节代码的触发。
[0068]作为另一示例,如果字节代码出于某种原因被删除,则这可充当再次生成字节代码的触发。
[0069]在一个示例中,如图3所示,源代码和相对应的字节代码可被存储在存储220中。图3解说了可根据此处所描述的主题内容的各方面来使用的示例性数据结构。在一个实现中,图3中所解说的数据结构可具有表,该表指示数据结构中可用的源代码文件和字节代码表示。该表还可包括指示源代码文件和字节代码表示位于数据结构中的何处的数据。数据结构可被存储在文件中或被表示为文件、存储在数据库中、或者存储在另一存储中而不背离本文描述的主题内容的各方面的精神或范围。
[0070]转向图3,数据结构305可具有源代码和搭配的相对应的字节代码。如果存储220被实现为文件系统,数据结构305可改进获取数据的效率因为这可降低访问字节代码所需的文件句柄等的数目。在源代码驻留在包中而非一个或多个网页等中的情况下,搭配源代码和相对应的字节代码可以是默认行为。如果需要,该默认行为可被取代。
[0071]在另一实现中,在存储220被实现为文件系统的情况下,可能存在针对包的一个或多个组件中的每一个的单独字节代码文件。尽管在一些场景中这可能是较低效的,但这可能具有其它优点和用途。例如,该实现可在源代码可驻留在包的外部(例如,一个或多个网站处)时和/或在源代码可动态生成时使用。
[0072]作为另一示例,这可在其中存在自然隔离的体验的情况下在其中主机或用户可能想要清除与单个网站相关联的所有信息的情况下使用。
[0073]作为另一示例,这可在其中浏览器被预先通知给定网站上的资源的场景中使用。在该示例中,浏览器可预先取得网站的资源以使得即便在没有网络连接时也可使用该网站。在该示例中,甚至可以为网站中更深的页面生成字节代码而不必遭遇对HTML标记中页面的脚本文件的显式引用。
[0074]确定是要在单个文件中寻找源代码和相对应的字节代码还是为每一源代码/字节代码对寻找独立的文件可基于正在执行包的环境。如果环境是web浏览器,则高速缓存管理器可以为与每一源代码组件相对应的字节代码寻找独立的文件。如果环境是应用框架或其中提前已知所有源代码组件(因为它们来自包)的另一环境(例如,如上所述的预先通知网站的示例),则高速缓存管理器可以为要在单个文件中搭配的整个包寻找字节代码。
[0075]不是包的每一源代码元件都可在数据结构305中具有相对应的字节代码。例如,出于各种原因,不为包的一个或多个组件创建字节代码可能是合乎需要的。在这些情形中,组件的源代码和字节代码可从数据结构305中略去。
[0076]另外,数据结构305可以是映射用于在两个或更多个包之间共享的存储器。例如,在一些情形中,不同的包可具有一个或多个相同源组件。在这些情形中,可以利用存储器映射来共享相同源组件的字节代码以使得存储器中不需要字节代码的多个副本。此外,数据结构305中的字节代码可以是只读的以使得当存储器被映射用于共享时它不会改变。
[0077]参照图2和3,在执行代码时,执行管理器218可以找到引用执行管理器218正在解析的文档(例如,HTML、XML、文字处理或其它文档)中的源代码的引用(例如,HTTP或其它引用)。执行管理器218可以首先通过询问数据结构305来查看与引用相对应的字节代码的当前版本是否驻留在高速缓存中。如果字节代码驻留在高速缓存中,则执行管理器218可以获取字节代码以供执行。如果字节代码不驻留在高速缓存中,则执行管理器218可以从源代码位置获取源代码并且可以致使源代码被编译和执行而没有延迟(例如,不必等待代码生成器216完成队列中找到的任何待决编译请求)。
[0078]在一个实现中,源代码的字节代码可驻留在源代码的平行目录中。例如,如果源代码驻留在 C:\PackageName\SourceCode\sourcecodename.scriptfile 中,则如果字节代码存在则字节代码可驻留在 C: \PackageName\SomeName\bytecodename.bytecodefile。
[0079]在另一实现中,源代码可驻留在远程设备上。
[0080]图4是表示本文所描述的主题内容的各方面可在其中操作的环境的组件的示例性安排的框图。图4中示出的各组件是示例性的且不意味着包括一切的可能需要或包括的组件。在其他实施例中,结合图4描述的组件和/或功能可被包括在其他组件(示出或未示出)中或者被放置在子组件中而不背离此处所描述的主题的各方面的精神或范围。在某些实施例中,结合图4所描述的组件和/或功能可跨多个设备地分布。
[0081 ] 转向图4,环境405可包括目标设备410、网络415、代码服务器417和其它组件(未示出)。目标设备410和代码服务器417可包括一个或多个计算设备。这些设备可包括,例如,个人计算机,服务器计算机,手持式或膝上型设备,多处理器系统,基于微控制器的系统,机顶盒,电视机、可编程消费电子产品,网络PC,小型计算机,大型计算机,蜂窝电话,个人数字助理(PDA),游戏设备,打印机,包括机顶盒、媒体中心或其他电器在内的电器,汽车嵌入式或附连的计算设备,其他移动设备,包括以上系统或设备中的任一种的分布式计算环境等。可被配置成用作目标设备410或代码服务器417的示例性设备包括图1的计算机110。
[0082]在一实施例中,网络415可包括因特网。在一实施例中,网络415可包括一个或多个局域网、广域网、直接连接、虚拟连接、专用网络、虚拟专用网络、以上的某种组合等。
[0083]代码服务器417可以将代码提供给目标设备410。在一个实施例中,代码服务器417可以是web服务器。在另一实施例中,代码服务器417可以是组织的专用网络内部的其上包括代码的机器。在其它实施例中,代码服务器417可包括能够将源代码提供给目标设备410的任何设备。
[0084]目标设备410是代码可在其上执行的设备。目标设备410可包括编译环境420、以及执行环境425、安装器430和存储435。安装器430可与图2的安装器215类似地实现和动作而存储435可与图2的存储220类似地实现和动作。
[0085]编译环境420可包括其中源代码可被编译成字节代码的权限受限的环境。在一个实施例中,编译环境420可包括如上所述的虚拟环境。在另一实施例中,编译环境420可包括与先前所述的不同权限受限的环境。
[0086]执行环境425可包括在其中执行包的软件的环境。在一个实现中,执行环境425可包括因特网浏览器。在另一实现中,执行环境425可包括能够执行可包括源代码的包的软件的主机过程。
[0087]图5-6是概括地表示根据本文所描述的主题的各方面的可发生的示例性动作的流程图。为解释简明起见,结合图5-6描述的方法被描绘和描述为一系列动作。可以理解和明白,此处所描述的主题的各方面不受所示出的各动作和/或各动作次序的限制。在一个实施例中,各动作以如下描述的次序发生。然而,在其它实施例中,各动作可以并行地发生、以另一次序发生、和/或与此处未呈现和描述的其它动作一起发生。此外,并非所有示出的动作都是实现根据此处所描述的主题的各方面的方法所必需的。另外,本领域的技术人员将了解和明白,该方法也可以替代地经由状态图而被表示为一系列相互关联的状态或者被表示为事件。
[0088]转向图5,在框505处,动作开始。
[0089]在框510,接收到包括要安装在目标设备上的软件的源代码的包。例如,参考图4,目标设备410可以从代码服务器417获取包。作为另一示例,安装器430可被指令安装存在于存储435上的包。
[0090]在框515,包被安装在目标设备上。例如,参考图2,安装器215可将包安装在存储220 上。
[0091]在框520,将指示符置于数据结构(诸如队列等)中。数据指示符指示包的源代码要被编译成字节代码。可能存在置于数据结构中的针对包中的每一源代码文件的独立指示符。例如,参考图2,安装器215可将一个或多个标志置于存储在存储220中的数据结构中。
[0092]在框525,执行初始编译源代码的动作,除非在开始或完成这些动作之前接收到要执行包的软件的请求。编译源代码的这些动作可包括,例如:
[0093]1.迭代通过数据结构并且找到指示需要编译的(诸)指示符;
[0094]2.将步骤I中找到的每一适用源代码元素编译成字节代码或某一其它代码;
[0095]例如,参考图2,代码生成器216可迭代通过数据结构并且编译在数据结构内找到的标志的源代码文件。作为另一示例,代码生成器216可以迭代通过文件列表并且编译具有给定扩展(例如,“.js”或指示源文件的另一扩展)的任何文件。
[0096]在框530,经编译代码随后可被持久保存在非易失性存储器中。例如,参考图2,高速缓存管理器217可将代码生成器216生成的代码存储在存储220中。代码也可存储在非易失性存储器中,诸如存储器内的高速缓存或者RAM中,以提供快速加载和执行。
[0097]框535被置于动作520-530 —侧以指示在那些动作之前、期间或之后可能发生要执行包的软件的请求。如果接收到这样的请求,则在开始或完成520-530的动作之前可以执行其它动作。例如,如果在开始或完成框520-530的动作之前接收到这样的请求,则源代码可在加快的基础上被编译和执行。描述在接收到这样的请求的情况下可能发生什么的其它动作结合图6来描述。
[0098]在框540,可以执行其他动作(如果有的话)。例如,可以接收到再次生成触发事件。作为响应,框520-530的动作可潜在地用不同源代码(如果源代码已经改变)以及从不同源代码编译的不同第二代码来再次执行。
[0099]转向图6,在框605处,动作开始。
[0100]在框610,接收到要执行包括源代码的软件的请求。例如,参考图2,执行管理器218接收到要执行安装在存储220上的包的软件的请求。
[0101]在框615,作出关于代码是否已经被编译和存储在非易失性存储上的判断。如果是,则动作在框640继续;否则,动作在框620继续。例如,参考图2,执行管理器218利用高速缓存管理器217来确定包是否已经被编译和存储在存储220上。
[0102]确定源代码是否已经被编译可包括检查非易失性存储的已知位置中的经编译代码。该已知位置可与包的名称或其它标识符相对应。例如,已知位置可以是根据包命名的目录或者该目录的子目录。作为另一示例,已知位置可以是数据结构中引用的指示该代码的经编译代码(如果存在)位于何处的位置。作为另一示例,已知位置可以是从标识源代码的源位置(例如,代码服务器)(其中源位置能够通过网络抵达)的引用中导出的位置。作为又一示例,确定源代码是否已经被编译可涉及检查存储在文件中将包的字节代码与包的源代码搭配的数据结构。该数据结构可指示第二代码是否已经被生成和存储在文件中。
[0103]在框620,获取源代码。例如,参考图2,代码生成器216从存储220获取源代码。
[0104]在框625,从源代码生成字节代码(或其它代码)。例如,参考图2,代码生成器216从以上获取的源代码中创建字节代码、机器可执行代码、或某种其它中间代码。
[0105]在框630,执行代码(或从其导出的代码,诸如可执行代码或其它中间代码)。例如,参考图2,执行管理器218执行以上生成的代码。
[0106]在框635,代码被持久保存到非易失性存储。由框625表示的动作可结合以上的动作一起发生或者在稍后时段被执行。例如,参考图2和3,代码生成器216可利用高速缓存管理器217在数据结构305中搭配包的代码并且将数据结构305存储在存储220上以供在软件的后续执行中使用。作为另一示例,在稍后时间,代码生成器216可以再次获取源代码并且再次生成经编译代码并且将该经编译代码存储在存储220上。
[0107]在框640,如果代码已经被编译,则获取经编译代码。例如,参考图2,执行管理器218可从高速缓存管理器217获取字节代码。
[0108]在框645,执行所获取的代码(或从其导出的代码,诸如二进制代码)。例如,参考图4,可在执行环境425中执行该代码。
[0109]在框650处,可以执行其他动作(如果有的话)。例如,包括字节代码的文件可被存储器映射,并且经由存储器映射与多个进程共享。
[0110]作为另一示例,其它动作可包括检查经编译代码在被生成之后是否被修改,以及如果是,则再次获取源代码(其可能与原始源代码不同),再次编译源代码,以及将经编译代码存储在非易失性存储中以供在软件的后续执行中使用。
[0111]如从上述详细描述中可以看到,已经描述了关于生成和高速缓存软件代码的各方面。尽管本文所描述的主题的各方面易于作出各种修改和替换构造,但其某些说明性实施例在附图中示出并在上面被详细地描述。然而,应当理解,并不旨在将所要求保护主题的各方面限制于所公开的具体形式,而是相反地,目的是要覆盖落入本文所描述的主题的各方面的精神和范围之内的所有修改、替换构造和等效方案。
【权利要求】
1.一种至少部分地由计算机实现的方法,所述方法包括: 接收要安装在目标设备上的包括软件的源代码的包; 将所述包安装在所述目标设备上;以及 在执行所述软件之前执行第一组动作以初始地编译所述源代码,除非在开始或完成所述第一组动作之前接收到要执行所述软件的请求,所述第一组动作包括: 将所述源代码编译成第二代码,以及 将所述第二代码持久保存在非易失性存储器中。
2.如权利要求1所述的方法,其特征在于,还包括在开始或完成所述第一组动作之前接收到要执行所述软件的请求的情况下,在完成所述第一组动作之前执行第二组动作,所述第二组动作包括: 在所述目标设备上执行所述源代码或从其导出的可执行代码。
3.如权利要求1所述的方法,其特征在于,所述第一组动作还包括对非易失性存储器中的所述第二代码进行存储器映射以供执行两个或更多包的进程共享所述第二代码。
4.如权利要求1所述的方法,其特征在于,还包括将指示所述源代码要被编译成供所述目标设备的第二代码的指示符置于数据结构中,并且在所述数据结构中找到所述指示符,且其中将所述源代码编译成所述第二代码是响应于在所述数据结构中找到所述指示符来执行的。
5.如权利要求1所述的方法,其特征在于,还包括接收再次生成触发事件的指示并且作为响应潜在地用不同源代码和从所述不同源代码编译的不同第二代码来再次执行所述第一组动作。
6.一种具有计算机可执行指令的计算机存储介质,所述计算机可执行指令在被执行时执行以下动作,包括: 接收要执行包括源代码的软件的请求; 响应于所述请求,确定第二代码是否已经从所述源代码生成和存储在非易失性存储中; 如果在接收到所述请求之前已经生成了所述第二代码,则执行第一组动作,包括: 获取所述第二代码,以及 执行所述第二代码或从其导出的代码;以及 如果在接收到所述请求之前尚未生成所述第二代码,则执行第二组动作,包括: 获取所述源代码, 从所述源代码生成所述第二代码, 执行所述第二代码或从其导出的代码,以及 如果在接收到所述请求之前尚未生成所述第二代码,则执行第三组动作,包括: 将所述第二代码存储在所述非易失性存储中以供在所述软件的后续执行中使用。
7.如权利要求6所述的计算机存储介质,其特征在于,执行所述第三组动作还包括: 再次获取所述源代码;以及 从所述源代码再次生成所述第二代码。
8.如权利要求6所述的计算机存储介质,其特征在于,还包括检查所述第二代码在被生成之后是否被修改并且如果是则执行动作,所述动作包括: 再次获取所述源代码; 从所述源代码再次生成所述第二代码;以及 将所述第二代码存储在所述非易失性存储中以供在所述软件的后续执行中使用。
9.一种在计算环境中的系统,包括: 存储,用于存储包的数据,所述包包括软件的源代码; 安装器,用于将所述包安装在所述存储上,所述安装器还用于更新数据结构以指示所述源代码要被编译成第二代码; 代码生成器,用于检查所述数据结构以标识所述源代码并且将所述源代码编译成所述第二代码; 高速缓存管理器,用于将所述第二代码持久存储在所述存储上并且提供对所述存储上的所述第二代码的访问; 执行管理器,用于接收要执行所述软件的请求并且确定所述代码生成器是否已经将所述源代码编译成所述第二代码并且如果是则执行动作,所述动作包括: 获取所述第二代码,以及 执行所述第二代码或从其导出的代码;以及 如果否,则执行动作,所述动作包括: 获取所述源代码, 致使所述源代码被编译成所述第二代码,以及 执行所述源代码或从其导出的代码。
10.如权利要求9所述的系统,其特征在于,所述执行管理器还用于在接收到所述请求之前所述代码生成器尚未将所述源代码编译成所述第二代码的情况下致使所述第二代码被生成而没有延迟。
【文档编号】G06F9/30GK104137057SQ201380009208
【公开日】2014年11月5日 申请日期:2013年2月4日 优先权日:2012年2月13日
【发明者】J·费雪, M·W·杰克逊, Y·克力克, S·E·卢科, J·D·麦克盖塔, J·Z·米亚多维茨, S·J·斯坦纳 申请人:微软公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1