动态语言的优化执行的制作方法

文档序号:6534576阅读:167来源:国知局
动态语言的优化执行的制作方法【专利摘要】通过包括执行上下文和执行代码库的动态执行模块来执行动态语言的程序代码。程序代码的指令被转换为存储在执行代码库中的机器代码,执行上下文通过执行以及跨越执行跟踪程序的运行时状态和持久状态。使用执行代码库和执行上下文,动态执行模块使重复的机器代码生成最小化,同时保留了程序的动态方面。【专利说明】动态语言的优化执行【
技术领域
】[0001]本公开一般地涉及动态计算机程序语言和即时(just-in-time)代码生成领域。具体地,本公开描述了一种通过上下文跟踪和即时代码生成来优化执行动态计算机程序语言的系统、方法和过程。【
背景技术
】[0002]针对web开发和应用开发已大量采用了诸如PHP:超文本预处理器(PHP)、Python、Ruby和Perl的动态语言,因为它们使得开发者产率高。这些语言有许多特征有助于它们的多产特性,但是最重要的两个特征是运行时键入和将新数据动态地评价为代码的能力。这些特性允许开发者编写能够比以诸如C、Java或C++的语言编写的静态代码更灵活地使用的代码。例如,动态语言通过在运行时允许开发者有条件地从现有代码生成新的可执行代码以处理新数据,来使得能够进行更灵活的开发实践。[0003]动态语言的缺点在于它们的执行通常显著慢于静态语言(其可能强制编译时静态键入并且可能不允许动态代码执行)。由于在编译时函数和变量的类型是已知的,并且由于可执行代码的全范围是编译器已知的,所以可在程序的执行之前有效地将静态语言转换成机器代码。在动态语言的情况下,在代码被执行的时刻之前,可执行代码的全范围未知,并且许多函数和变量的类型可能未知。由于这些原因,动态语言无法在执行之前被完全地转换为机器代码。另外,即使向机器代码的运行时转换常常也是不可行的,因为即时编译过程本身可能需要大量执行资源,导致执行期间的性能下降。【
发明内容】[0004]所公开的配置包括一种通过动态执行模块来执行计算机程序的系统、方法和计算机可读介质。所公开的配置包括一种计算机实现的方法,其中,接收执行程序代码的第一请求。这里,所述程序代码包括初始代码和运行时条件代码。响应于第一请求,从初始代码生成执行资源,其中所述执行资源包括执行代码库(executioncodebase)和执行上下文(executioncontext)。所述执行代码库包括从初始代码生成的机器代码,并且所述执行上下文包括存储的对针对初始代码中的函数、变量和用户定义类型生成的元素的引用。执行代码库中的机器代码被执行,并且使用运行时条件代码来更新执行代码库和执行上下文。然后接收执行程序代码的第二请求,并且使用更新的执行上下文来执行更新的执行代码库中的机器代码。【专利附图】【附图说明】[0005]图1是示出执行环境中的动态执行模块的示例实施例的高级框图。[0006]图2是示出示例计算机的高级框图。[0007]图3是示出根据一个实施例的动态执行模块内的组件的详细视图的框图。[0008]图4是示出使用动态执行模块的一个实施例来执行程序代码的过程的流程图。【具体实施方式】[0009]附图和以下描述仅以例示方式描述特定实施例。本领域技术人员将容易从以下描述认识到在不脱离本文所述的原理的情况下可采用本文所示的结构和方法的替选实施例。现在将详细参照若干实施例,其示例示出于附图中。需要注意的是,只要可行,相似或相同的参考数字可用在图中并且可指示相似或相同的功能。[0010]图1示出在执行环境120中的程序代码100和动态执行模块101。执行环境120包括可托管并执行计算机程序指令的一个或多个计算机系统。在一个实施例中,执行环境120是单个计算机系统,例如web服务器。在另一实施例中,执行环境包括通过网络连接的若干算机系统,例如数据中心中的服务器计算机。[0011]例如,程序代码100包括以诸如?5^11〇11、?61'1、1^^、?即等的计算机语言的计算机源代码。程序代码100可包括初始代码106和运行时条件代码107。初始代码106包括在发起程序代码100的执行时被加载的计算机指令。例如,初始代码106可包括具有程序的"主函数"或"主循环"的文件。初始代码106在被执行时可加载调用运行时条件代码107的附加计算机程序指令。运行时条件代码107可基于在已发起执行之后确定的情况来有条件地加载。例如,运行时条件代码107可包括在运行时基于程序代码100的当前执行从数据库加载的计算机指令。[0012]动态执行模块101是执行环境120的组件,其使得程序代码100能够更有效地执行。动态执行模块101取代了用于诸如PHP、Perl、Python或Ruby的编程语言的标准虚拟机或解析器。动态执行模块101可以是在还执行执行环境120的其它进程的硬件上执行的软件模块,或者其可以在它自己的专用硬件资源上执行。当程序代码100在执行环境120中执行时,动态执行模块101管理并监视该执行以确保执行既快速还有效。动态执行模块101可通过使用即时机器代码生成、代码片段跟踪、机器代码重用、上下文跟踪以及其它技术来改善程序代码100的执行。本文中更详细地描述了这些技术中的一些。[0013]动态执行模块101包括执行资源102和执行支持模块105。执行资源102是为特定程序代码100生成的资源,其中一些资源可跨越相同代码的若干调用一直存在。执行资源102包括执行上下文103和执行代码库104。执行上下文103存储特定程序在执行时的动态运行时状态以及可跨越不同执行一直存在的程序代码100的结构和状态。执行上下文103包括结构,该结构存储对针对程序代码100中的函数、变量和用户定义类型(例如类、结构等)生成的元素的引用。执行上下文103可在程序代码100的调用之间被重置,以防止来自一个调用的动态值污染代码的下一调用。然而,执行上下文重置可被执行为使得保持非易失性数据(其可在调用之间迀移)。执行代码库104存储在程序的该执行以及先前执行期间从程序代码100生成的机器代码。执行代码库104用作从程序代码100生成的机器代码的缓存,使得在程序的调用之间不需要重复代码生成。执行上下文103用于跟踪执行代码库104中与程序的当前调用相关的机器代码部分(例如,用于当前调用的函数定义的机器代码等)。执行支持模块105为动态执行模块101提供运行时支持,例如即时机器代码生成、执行管理等。[0014]图1所示的实体利用一个或多个计算机或者这样的计算机内的模块来实现。图2是示出示例计算机200的高级框图。计算机200包括耦合到芯片集204的至少一个处理器202。芯片集204包括存储器控制器中心(hub)220和输入/输出(I/O)控制器中心222。存储器(memory)206和图形适配器212耦合到存储器控制器中心220,显示器218耦合到图形适配器212。存储装置208、键盘210、指示装置214和网络适配器216耦合到I/O控制器中心222。计算机200的其它实施例具有不同的架构。[0015]存储装置208是诸如硬盘驱动器、压缩盘只读存储器(⑶-ROM)、DVD或固态存储装置的非瞬时性计算机可读存储介质。存储器206保存处理器202所使用的指令和数据。指示装置214是鼠标、跟踪球或其它类型的指示装置,并且与键盘210组合使用以向计算机200输入数据。图形适配器212在显示器218上显示图像和其它信息。网络适配器216将计算机200親合到一个或多个计算机网络。[0016]计算机200适于执行计算机程序模块以提供本文所述的功能。如本文所用,术语"模块"是指用于提供指定功能的计算机程序逻辑。因此,模块可实现于硬件、固件和/或软件中。在一个实施例中,程序模块被存储在存储装置208上,被加载到存储器206中,并由处理器202执行。[0017]图1的实体所使用的计算机200的类型可根据实施例以及实体所需的处理能力而变化。例如,执行环境120可以包括一起工作以提供本文所述的功能的多个刀片服务器。计算机200可缺少上述组件中的一些,例如键盘210、图形适配器212和显示器218。[0018]图3是示出根据一个实施例的动态执行模块101内的组件的详细视图的高级框图。如前所述,动态执行模块101包括执行资源102和执行支持模块105。执行资源102进一步包括执行上下文103和执行代码库104。[0019]如前所述,执行上下文103存储捕获程序执行的当前运行时状态的数据以及可跨越程序调用一直存在以加速同一程序代码的未来执行的信息。执行上下文103包括函数表301、变量表302、分配表304、源表示库309和包含表(includetable)310。执行上下文103还可包括用于各种用户定义类型的表,例如类表303。用户定义类型所需的表将取决于动态执行模块101所执行的特定动态语言。在PHP的情况下,可使用类表303,但是在没有类的非面向对象的语言的情况下,类表303可没有必要,而可利用相似的表来跟踪其它用户定义类型。[0020]分配表304是数据结构,其包含初始代码106中定义的非易失性数据以及在运行时在程序的调用期间动态分配的元素。例如,分配表304存储程序代码100中声明的变量、结构和用户定义类型(例如类)。动态执行模块101可通过基于程序代码100的先前调用所使用的存储器在分配表304中预先分配空间并且通过在执行上下文103的重置之间保持分配表304中的非易失性数据,来减少程序代码100所进行的运行时存储器分配的量。跨越程序代码100的单独的执行一直存在的数据的示例包括全局常量、全局变量、全局类等。存储在分配表304中的元素可被变量表302和类表303中的条目引用。[0021]函数表301是按照名称和代码上下文将函数映射至执行代码库104中的编译的机器代码的数据结构。代码上下文是利用其调用函数的上下文,例如参数、包含、命名空间等。在动态语言中,函数调用的代码上下文可改变函数调用所执行的代码。例如,改变绑定至函数名称的代码的函数调用之前的条件包含语句可导致该函数调用与它在先前执行中所调用的不同的代码片段,即使函数名称和参数相同。[0022]当程序代码100被执行并且遇到对先前在相同代码上下文中(在程序代码100的先前执行中或者在早前时间的相同执行期间)定义的函数的调用时,该函数的机器代码生成将没有必要,因为可通过函数表301中的映射来访问相同代码上下文中针对相同函数先前生成的机器代码。另一方面,如果遇到新函数,或者如果在新的代码上下文中遇到已知函数,则可针对该函数生成新机器代码,并且可将对该机器代码的引用插入函数表301中的适当条目中。这样,过去已产生的机器代码可被重用,而不会牺牲基于上下文调用不同代码的动态生成的函数的灵活性。[0023]变量表302将变量名称映射至分配表304中存储的变量。类似地,用户定义类型可具有将那些类型的命名实例映射至分配表304中的分配的表。例如,类表303将类名称映射至分配表304中存储的类。可在运行时基于变量或用户定义类型的改变代码上下文来修改该映射。这使得动态执行模块101能够支持运行时对变量和用户定义类型的动态改变,同时在变量和用户定义类型是非易失性的情况下仍能够优化和重用。[0024]函数表301、变量表302以及用于用户定义类型的表(例如类表303)可使得没有被动态修改的无条件内置数据能够跨越程序代码100的独立执行而一直存在。无条件内置数据的该持续性可通过使内置非易失性数据所需的初始化最小化来加速程序代码100的新调用所需的初始设置。[0025]源表示库309包括程序代码100中已由动态执行模块101处理的指令的表示。源表示库309可按照能够更快访问指令结构以便于动态执行模块101处理的方式来存储程序代码100的指令。例如,在一个实施例中,来自程序代码100的指令按照控制流图(CFG)的形式存储在源表示库309中。在另一实施例中,程序代码100的指令按照抽象语法树(AST)的形式存储。这样的结构实施例可加速代码生成和代码索引。[0026]例如,假设程序代码100包括如下PHP指令:[0027]【权利要求】1.一种用于通过动态执行模块执行计算机程序的计算机实现的方法,所述方法包括:接收执行程序代码的第一请求,所述程序代码包括初始代码和运行时条件代码;响应于所述第一请求,从所述初始代码生成执行资源,所述执行资源包括执行代码库和执行上下文,所述执行代码库包括从所述初始代码生成的机器代码,W及所述执行上下文包括存储的对针对所述初始代码中的函数、变量和用户定义类型生成的元素的引用;使用所述执行上下文来执行所述执行代码库中的机器代码;响应于执行所述执行代码库中的机器代码,使用所述运行时条件代码来更新所述执行代码库和所述执行上下文;接收执行所述程序代码的第二请求;W及使用更新的执行上下文来执行更新的执行代码库中的机器代码。2.根据权利要求1所述的计算机实现的方法,其中,使用所述执行上下文来执行所述执行代码库中的机器代码还包括使用存储的引用来访问针对函数、变量和用户定义类型生成的元素。3.根据权利要求1所述的计算机实现的方法,其中,更新所述执行代码库还包括将从所述运行时条件代码生成的机器代码存储在所述执行代码库中。4.根据权利要求1所述的计算机实现的方法,其中,所述执行上下文还包括包含存储的对元素的引用的函数表、变量表和类表。5.根据权利要求4所述的计算机实现的方法,其中,更新所述执行上下文还包括在所述函数表、变量表和类表中存储对针对所述运行时条件代码中的函数、变量和类生成的元素的引用。6.根据权利要求5所述的计算机实现的方法,其中,所述执行上下文还包括源表示库,W及更新所述执行上下文还包括将所述运行时条件代码的一部分的表示存储在所述源表不库中。7.根据权利要求6所述的计算机实现的方法,其中,所述执行上下文还包括包含表,W及更新所述执行上下文还包括在所述包含表中生成条目,所述条目包括到所述源表示库中的引用和到所述执行代码库中的引用。8.根据权利要求1所述的计算机实现的方法,其中,所述执行上下文还包括分配表,所述分配表包括针对所述程序代码中的所述变量和用户定义类型分配的元素。9.根据权利要求1所述的计算机实现的方法,其中,所述程序代码、所述初始代码和所述运行时条件代码包括PHP计算机指令。10.-种用于通过动态执行模块执行计算机程序的计算机,所述计算机包括:非瞬时性计算机可读存储介质,所述非瞬时性计算机可读存储介质存储用于通过动态执行模块来执行计算机程序的可执行计算机程序指令,所述指令能够被执行W执行下述步骤:接收执行程序代码的第一请求,所述程序代码包括初始代码和运行时条件代码;响应于所述第一请求,从所述初始代码生成执行资源,所述执行资源包括执行代码库和执行上下文,所述执行代码库包括从所述初始代码生成的机器代码,W及所述执行上下文包括存储的对针对所述初始代码中的函数、变量和用户定义类型生成的元素的引用;使用所述执行上下文来执行所述执行代码库中的机器代码;响应于执行所述执行代码库中的机器代码,使用所述运行时条件代码来更新所述执行代码库和所述执行上下文;接收执行所述程序代码的第二请求;W及使用更新的执行上下文来执行更新的执行代码库中的机器代码;W及处理器,所述处理器用于执行所述计算机程序指令。11.根据权利要求10所述的计算机,其中,使用所述执行上下文来执行所述执行代码库中的机器代码还包括使用存储的引用来访问针对函数、变量和用户定义类型生成的元素。12.根据权利要求10所述的计算机,其中,更新所述执行代码库还包括将从所述运行时条件代码生成的机器代码存储在所述执行代码库中。13.根据权利要求10所述的计算机,其中,所述执行上下文还包括包含存储的对元素的引用的函数表、变量表和类表。14.根据权利要求13所述的计算机,其中,更新所述执行上下文还包括在所述函数表、变量表和类表中存储对针对所述运行时条件代码中的函数、变量和类生成的元素的引用。15.根据权利要求14所述的计算机,其中,所述执行上下文还包括源表示库,W及更新所述执行上下文还包括将所述运行时条件代码的一部分的表示存储在所述源表示库中。16.根据权利要求15所述的计算机,其中,所述执行上下文还包括包含表,W及更新所述执行上下文还包括在所述包含表中生成条目,所述条目包括到所述源表示库中的引用和到所述执行代码库中的引用。17.根据权利要求10所述的计算机,其中,所述执行上下文还包括分配表,所述分配表包括针对所述程序代码中的所述变量和用户定义类型分配的元素。18.根据权利要求10所述的计算机,其中,所述程序代码、所述初始代码和所述运行时条件代码包括PHP计算机指令。19.一种存储用于通过动态执行模块执行计算机程序的可执行计算机程序指令的非瞬时性计算机可读存储介质,所述指令能够被执行W执行下述步骤:接收执行程序代码的第一请求,所述程序代码包括初始代码和运行时条件代码;响应于所述第一请求,从所述初始代码生成执行资源,所述执行资源包括执行代码库和执行上下文,所述执行代码库包括从所述初始代码生成的机器代码,W及所述执行上下文包括存储的对针对所述初始代码中的函数、变量和用户定义类型生成的元素的引用;使用所述执行上下文来执行所述执行代码库中的机器代码;响应于执行所述执行代码库中的机器代码,使用所述运行时条件代码来更新所述执行代码库和所述执行上下文;接收执行所述程序代码的第二请求;W及利用更新的执行上下文来执行更新的执行代码库中的机器代码。20.根据权利要求19所述的计算机可读介质,其中,所述程序代码、所述初始代码和所述运行时条件代码包括PHP计算机指令。【文档编号】G06F15/16GK104471557SQ201380038085【公开日】2015年3月25日申请日期:2013年6月17日优先权日:2012年6月18日【发明者】所罗门·布洛斯,杰里米·休格曼申请人:谷歌公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1