CN107408055B - 代码缓存系统 - Google Patents
代码缓存系统 Download PDFInfo
- Publication number
- CN107408055B CN107408055B CN201680019416.5A CN201680019416A CN107408055B CN 107408055 B CN107408055 B CN 107408055B CN 201680019416 A CN201680019416 A CN 201680019416A CN 107408055 B CN107408055 B CN 107408055B
- Authority
- CN
- China
- Prior art keywords
- code
- source code
- instruction
- serialized
- level
- 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.)
- Active
Links
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
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/3017—Runtime instruction translation, e.g. macros
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/90—Details of database functions independent of the retrieved data types
- G06F16/95—Retrieval from the web
- G06F16/957—Browsing optimisation, e.g. caching or content distillation
- G06F16/9574—Browsing optimisation, e.g. caching or content distillation of access to content, e.g. by caching
-
- 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
-
- 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/443—Optimisation
- G06F8/4434—Reducing the memory space required by the program code
-
- 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/443—Optimisation
- G06F8/4441—Reducing the execution time required by the program code
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/448—Execution paradigms, e.g. implementations of programming paradigms
- G06F9/4488—Object-oriented
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45504—Abstract machines for programme code execution, e.g. Java virtual machine [JVM], interpreters, emulators
- G06F9/45529—Embedded in an application, e.g. JavaScript in a Web browser
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L67/00—Network arrangements or protocols for supporting network services or applications
- H04L67/50—Network services
- H04L67/56—Provisioning of proxy services
- H04L67/568—Storing data temporarily at an intermediate stage, e.g. caching
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Databases & Information Systems (AREA)
- Data Mining & Analysis (AREA)
- Computer Networks & Wireless Communication (AREA)
- Signal Processing (AREA)
- Devices For Executing Special Programs (AREA)
- Memory System Of A Hierarchy Structure (AREA)
- Stored Programmes (AREA)
Abstract
本发明提供了一种用于代码缓存的系统和方法。接收等待执行的初级源代码的第一指示。针对与该初级源代码相对应的缓存数据检查资源缓存。在该资源缓存中的缓存未命中之后,获得从该初级源代码编译的第一可执行代码。选择在该初级源代码中引用的二级源代码。获得从所选择的二级源代码编译的第二可执行代码。将该第一可执行代码和该第二可执行代码串行化成串行化代码。将该串行化代码作为缓存数据存储在该资源缓存中。
Description
技术领域
本主题技术涉及对可执行代码进行缓存,并且具体地,涉及一种用于对可执行代码进行编译、将可执行代码串行化和对可执行代码进行缓存并且在执行之前将所缓存的可执行代码去串行化的源代码。
背景技术
虚拟机(VM)被用于在按需编译(还称为即时(Just in Time)(JIT)编译)之后执行软件代码,在该按需编译中,在执行代码之前立即执行对代码的编译或者对代码的部分进行按需编译(例如,怠惰地)。当将代码嵌入在资源(例如,web页面内的资源)中时,资源能够利用其被再现在客户端装置上运行的应用(例如,浏览器)内的速度取决于执行嵌入的代码的速度。客户端装置的用户可以在相同的工作会话(例如,web浏览器会话)内或者跨多个独立的工作会话重复地访问相同的资源。然而,如果每当用户访问资源时必须对代码进行编译,则针对每次编译可能需要很长的时间。
发明内容
在各个方面中,所公开的主题能够被实施在一种系统中。该系统包括:一个或多个处理器。该系统还包括存储器。该存储器包括指令,该指令在被执行时使一个或多个处理器实施方法。指令包括用于接收等待执行的初级源代码的第一指示的代码。指令包括用于响应于接收到第一指示,检查与用于初级源代码相对应的缓存数据的资源缓存的代码。指令包括用于在资源缓存中的缓存未命中之后,获得从初级源代码编译的第一可执行代码的代码。指令包括用于选择在初级源代码中引用的二级源代码的代码。指令包括用于获得从所选择的二级源代码编译的第二可执行代码的代码。指令包括用于将第一可执行代码和第二可执行代码串行化成串行化代码的代码。指令包括用于将串行化代码作为缓存数据存储在资源缓存中的代码。
这些和其它实施方式能够包括以下特征中的一个或多个:指令可以包括用于获得从在第一执行上下文中执行第一可执行代码的执行结果的代码,其中,基于执行结果来选择二级源代码。可以基于二级源代码的大小、第二可执行代码的大小、在初级源代码中引用二级源代码的预测、在初级源代码中引用二级源代码的次数、在初级源代码中引用二级源代码的频率、或者二级源代码的编译时间中的一个或多个来选择二级源代码。指令可以包括用于接收等待在第二执行上下文中执行的初级源代码的第二指示的代码,其中,在第一指示之后接收第二指示。指令可以包括用于响应于接收到第二指示,检查用于与初级源代码和所选择的二级源代码相对应的缓存数据的资源缓存的代码。指令可以包括用于在资源缓存中的缓存命中之后,从资源缓存检索包括串行化代码的缓存数据的代码。指令可以包括用于将检索到的串行化代码去串行化成第三可执行代码的代码。指令可以包括用于提供用于在第二执行上下文中执行的第三可执行代码的代码。
这些和其它实施方式能够包括以下特征中的一个或多个:第一执行上下文和第二执行上下文能够是用于代码执行的两个不同的虚拟机环境。初级源代码能够是web页面中的脚本,并且第一执行上下文和所述第二执行上下文能够是在其内执行脚本的web浏览器会话。初级源代码能够是web页面的顶层脚本。第一可执行代码可以包括引用的集,该引用的集包括特定于第一执行上下文的固定存储器地址,该固定存储器地址被嵌入在第一可执行代码中。包括用于将第一可执行代码串行化的代码的指令可以包括用于用非特定于第一执行上下文的抽象地址来替换嵌入的存储器地址的代码。
在一个创新性方面中,所公开的主题能够被实现在一种系统中。该系统包括:一个或多个处理器。该系统还包括存储器。该存储器包括指令,该指令在被执行时使一个或多个处理器实施方法。指令包括用于接收等待执行的初级源代码的第一指示的代码。指令包括用于响应于接收到第一指示,检查用于与初级源代码相对应的缓存数据的资源缓存的代码。指令包括用于在资源缓存中的缓存未命中之后,获得从初级源代码编译的第一可执行代码的代码。指令包括用于基于初级源代码的大小、在预定义时间段内执行初级源代码的次数、或者初级源代码的编译时间中的一个或多个来将第一可执行代码串行化成串行化代码的代码。指令包括用于将串行化代码作为缓存数据存储在资源缓存中的代码。
这些和其它实施方式能够包括以下特征中的一个或多个:指令可以包括用于至少基于二级源代码的大小、在初级源代码中引用二级源代码的次数、二级源代码的编译时间、或者其组合来选择在初级源代码中引用的二级源代码。指令可以包括用于获得从二级源代码编译的第二可执行代码的代码。指令可以包括用于将第二可执行代码串行化成串行化代码的代码。指令可以包括用于获得从在第一执行上下文中执行第一可执行代码的执行结果的代码,其中,基于执行结果来选择二级源代码。指令可以包括用于接收等待在第二执行上下文中执行的初级源代码的第二指示的代码,其中,在第一指示之后接收第二指示。指令可以包括用于响应于接收到第二指示,检查与初级源代码和选择的二级源代码相对应的缓存数据的资源缓存的代码。指令可以包括用于在资源缓存中的缓存命中时,从资源缓存检索包括串行化代码的缓存数据的代码。指令可以包括用于将检索到的串行化代码去串行化成第三可执行代码的代码。指令可以包括用于提供用于在第二执行上下文中执行的第三可执行代码的代码。
这些和其它实施方式可以包括以下特征中的一个或多个:第一执行上下文和第二执行上下文可以是用于代码执行的两个不同的虚拟机环境。第一可执行代码可以包括引用的集,该引用的集包括在第一可执行代码中嵌入的存储器地址,并且包括用于将第一可执行代码串行化的代码的指令可以包括用于用抽象地址来替换嵌入的存储器地址的代码。
在一个创新性方面中,所公开的主题能够被实现在一种包括能够由计算机执行的指令的计算机可读介质中。该指令包括用于使计算机接收等待执行的初级源代码的第一指示的代码。该指令包括用于使计算机响应于接收到第一指示,检查与初级源代码相对应的缓存数据的资源缓存的代码。该指令包括用于在资源缓存中的缓存未命中之后,使计算机获得从初级源代码编译的第一可执行代码的代码。该指令包括用于使计算机获得从在第一执行上下文中执行第一可执行代码的执行结果的代码。该指令包括用于使计算机基于执行结果来选择在初级源代码中引用的二级源代码的代码。该指令包括用于使计算机获得从选择的二级源代码编译的第二可执行代码的代码。该指令包括用于使计算机将第一可执行代码和第二可执行代码串行化成串行化代码的代码。该指令包括用于使计算机将串行化代码作为缓存数据存储在资源缓存中的代码。
这些和其它实施方式能够包括以下特征中的一个或多个:第一可执行代码包括引用的集,该引用的集包括在第一可执行代码中嵌入的存储器地址,并且使计算机将第一可执行代码串行化的指令可以包括用于使计算机用抽象地址来替换嵌入的存储器地址的指令。执行结果可以指示在初级源代码中引用二级源代码的次数是在执行初级源代码时执行的。指令可以包括用于使计算机接收等待在第二执行上下文中执行的初级源代码的第二指示的代码,其中,在第一指示之后接收第二指示。指令可以包括用于使计算机响应于接收到第二指示,检查与初级源代码和选择的二级源代码相对应的缓存数据的资源缓存的代码。指令可以包括用于在资源缓存中的缓存命中时,使计算机从资源缓存检索包括串行化代码的缓存数据的代码。指令可以包括用于使计算机将检索到的代码去串行化成第三可执行代码的代码。指令可以包括用于使计算机提供用于在第二执行上下文中执行的第三可执行代码的代码。第一可执行代码和第二可执行代码能够是用于代码执行的两个不同的虚拟机环境。指令可以包括用于使计算机获得与第一可执行代码相关联的第一执行简档和与第二可执行代码相关联的第二执行简档的代码。指令还可以包括用于使计算机将第一执行简档和第二执行简档串行化的代码。指令还可以包括用于使计算机将串行化第一执行简档和第二执行简档存储在资源缓存中的代码,其中,将检索到的串行化代码去串行化包括将第一执行简档和第二执行简档去串行化。
理解的是,本主题技术的其它配置将会从以下详细描述对本领域的技术人员变得显而易见,其中,通过图示的方式来示出和描述本主题技术的各种配置。如将会实现的是,本主题技术能够具有其它不同的配置,并且在所有修改不脱离本主题技术的范围的情况下,其若干细节能够在各个其它方面中进行修改。因此,附图和详细描述在本质上被认为是说明性的而不是限制性的。
附图说明
在随附权利要求书中阐述了本主题技术的特征。然而,出于解释之目的,在以下的附图中阐述了本主题技术的几种实施方式。
图1图示了其中可以处理代码缓存的示例网络环境。
图2图示了可以向其提供代码缓存的客户端装置。
图3是代码缓存平台的流程图,通过该代码缓存平台可以提供将脚本串行化成缓存代码并且将该缓存代码去串行化成可执行代码。
图4A至图4B图示了过程的示例,通过该过程可以提供将脚本串行化成缓存代码。
图5概念性地图示了利用其来实施本主题技术的一些实施方式的示例电子系统。
具体实施方式
术语表
抽象化(Abstracting)(抽象化(Abstraction)):抽象化是利用用于重新创建引用(例如,重定位数据)的指令来将对象(例如,代码)中的引用替换为存储器地址和用于执行上下文特定的其它对象,使得能够在新的执行上下文中重新创建对象的过程。
串行化(Serializing(串行化(Serialization))):串行化是生成对象的表示(例如,编译的可执行代码)作为能够被传输的并且包括对象的数据以及关于对象的信息(诸如,对象的类型或者在对象中存储的数据的类型)的序列数据的过程。
去串行化(Deserializing(去串行化(Deserialization)):去串行化是从串行化对象的序列数据中提取和生成对象(例如,编译的可执行代码)的过程。
源代码:源代码是指定要由计算机执行并且使用人类可读的计算机语言编写的计算机指令的集合。
可执行代码:可执行代码是可由计算机执行并且通过对源代码进行解析和编译产生的机器语言指令的集合。
执行上下文(执行环境):执行上下文是定义计算机系统或者在其内执行可执行代码的计算机系统(例如,虚拟机)的软件仿真的操作参数的集。
重定位数据:重定位数据是用于在当前执行上下文中恢复对存储器位置或者对象的抽象代码引用的指令或者信息。
以下阐述的详细描述旨在作为对本主题技术的各种配置的描述,并且不旨在表示其中可以实践本主题技术的唯一配置。将附图并入本文,并且构成详细描述的一部分。详细描述包括具体细节,目的是提供对本主题技术的透彻理解。然而,将会清楚的并且显而易见的是,本主题技术不限于本文所阐述的具体细节,并且可以在没有这些具体细节的情况下实践本主题技术。在一些实例中,以框图形式来示出结构和部件以便避免模糊本主题技术的概念。
当试图通经由计算装置来访问资源时,资源的加载时间是用户体验的重要组成部分。资源可以是从计算装置内的本地存储器加载的应用、文件或者文档或者诸如例如在从网络加载的web页面内的文件或者文档的网络资源。然而,需要在执行资源内嵌入的诸如例如JavaScript代码的动态脚本之前对动态脚本进行编译,并且这样能够减慢加载资源的过程。因此,需要的是,通过将编译的代码缓存到资源缓存中并且在随后的会话期间重新使用用于对资源的未来访问的缓存代码,来提高在计算装置上再现资源的效率。
可以通过编译程序来将源代码变换成可由计算机执行的低级机器代码。然后可以存储机器代码用于执行。可替代地,解释器能够被用于立即(on the fly)直接地分析并且执行源代码程序的结果。解析和编译以产生可执行代码的在应用或者文档(诸如,例如web页面)中嵌入的源代码(例如,JavaScript代码)在用于加载资源的关键路径上。可执行代码在由计算机处理器执行时使处理器根据指令执行任务。机器语言是计算机在硬件中实施的本机指令的集。为了加快加载过程,能够例如以二进制格式来将编译的代码串行化并且对其进行缓存。一旦对可执行代码进行了缓存,在随后执行脚本时,不再必须对源代码进行重新解析和重新编译,并且能够从缓存中将可执行代码去串行化并且执行。
在编译代码的串行化期间,能够将代码的状态转换成能够从执行环境传输至其它执行环境的形式。串行化过程将数据结构或者对象状态翻译成能够基于在串行化对象中嵌入的信息来在相同或者另一上下文(例如,执行环境)中重新构造的格式。串行化可以从编译的代码中为代码的各种分量和为对诸如例如表示常数的数据结构、字符串文字、对象文字,包括按需编译所需要的重定位数据的函数对象、共享代码段、对执行环境(例如,VM)的引用等的代码引用的对象提供可执行代码。
图1图示了其中可以处理代码缓存的示例网络环境100。网络环境100包括客户端装置101a和101n以及服务器109a和109m。虽然在图1中示出了两个客户端装置101a和101n以及两个服务器109a和109m,但是本主题技术不限于此,并且能够应用于两个以上的客户端装置和服务器或者仅一个客户端装置和/或服务器。客户端装置101a和101n以及服务器109a和109m能够通过网络105来彼此通信。服务器109a或109m能够包括与客户端装置和计算机可读存储装置(未示出)类似的计算装置。
客户端装置101a和101n中的每个能够表示各种形式的处理装置。示例处理装置能够包括台式计算机、膝上型计算机、手持计算机、个人数字助理(PDA)、蜂窝电话、网络设备、照相机、智能电话、增强型通用分组无线电服务(EGPRS)移动电话、媒体播放器、导航装置、电子邮件装置、游戏机、或者任何这些数据处理装置的组合或者其它数据处理装置。客户端装置101a和101n以及服务器109a和109m可以被提供对在其它客户端装置101a和101n或者服务器109a和109m中的任何上执行的或者存储的应用软件的访问,或者可以接收在其它客户端装置101a和101n或者服务器109a和109m中的任何上的应用软件。
服务器109a和109m可以是具有处理器、存储器、和用于向客户端装置101a和101n提供内容的通信能力的任何系统或者装置。在一些示例方面中,服务器109a或者109m能够是例如计算机服务器的单个计算装置。在其它实施方式中,服务器109a或者109m能够表示一起工作以执行服务器计算机的动作(例如,云计算)的一个以上的计算装置。进一步地,服务器109a或者109m能够表示各种形式的服务器,包括但不限于,web服务器、应用服务器、代理服务器、web服务器、或者服务器群。
在一些方面中,客户端装置101a和101n可以通过通信接口(未示出)无线地通信,该通信接口(未示出)可以包括在必要时的数字信号处理电路系统。通信接口可以提供用于各种模式或者协议下的通信,例如,全球移动通信系统(GSM)语音呼叫、短消息服务(SMS)、增强型短消息服务(EMS)、或者多媒体短消息服务(MMS)消息传递、码分多址(CDMA)、时分多址(TDMA)、个人数字蜂窝(PDC)、宽带码分多址(WCDMA)、CDMA2000、或者通用分组无线电系统(GPRS)等。例如,可以通过射频收发器(未示出)发生该通信。此外,可以例如,使用蓝牙、WiFi、或者其它这种收发器发生短程通信。
在一些方面中,网络环境100能够是跨网络(例如,网络105)的分布式客户端/服务器系统。网络105能够是连接任何数量的移动客户端、固定客户端、和服务器的例如局域网(LAN)、广域网(WAN)、互联网、蜂窝网络、或者其组合的大型计算机网络。进一步地,网络105能够包括但不限于以下网络拓扑中的任何,包括总线网络、星形网络、环形网络、网状网络、星形总线网络、树形或者分层网络等。在一些方面中,能够经由虚拟专用网(VPN)、安全壳(SSH)隧道、或者其它安全网络连接发生每个客户端(例如,客户端装置101a和101n)与服务器109a或者109m之间的通信。在一些方面中,网络105可以进一步包括企业网络(例如,内联网)和无线接入点。
在示例方面中,客户端装置101a或者101n中的任何能够经由使用诸如例如超文本传输协议(HTTP)协议的网络协议的网络105来彼此通信以及与服务器109a或者109通信。客户端装置101a或者101n能够接收在客户端装置101a或者101n的用户界面内的应用107a或者107n(例如,web浏览器)的用户输入。该用户输入能够指定要加载的那个内容。例如,用户输入能够是与指定要从服务器109a或者109m加载的什么web内容的网站相关联的统一资源定位符(URL)地址。用户还可以键入对指定什么web页面用户希望在客户端装置101a或者101n(现在在图1中示出的)的用户界面(UI)上看到的部分的输入。在这种示例方面中,客户端装置101a或者101n中的每个能够包括代码缓存平台103a或者103n,该代码缓存平台103a或者103n能够基于来自用户的请求来检查用于所缓存的可执行代码的缓存,并且提供用于在客户端装置101a或者101n上执行的所缓存的可执行代码。所代码缓存平台103或者103n还能够选择用于缓存的可执行代码的部分。
图2图示了可以为其提供代码缓存的客户端装置。客户端装置200与图1的客户端装置101a和101n类似。如图所示,客户端装置200包括:处理器201、网络接口203、和存储器205。处理器201被配置为执行在例如存储器205的计算机可读介质中存储的计算机指令。处理器201可以是中央处理单元(CPU)。网络接口203被配置为允许客户端装置201在例如互联网、内联网、局域网、或者蜂窝网络的网络105中发送和接收数据。网络接口203可以包括网络接口卡(NIC)。
存储器205存储数据和指令。如图所示,存储器205包括与图1的应用107a和107n类似的应用207和与图1的代码缓存平台103a和103n类似的代码缓存平台209。应用207和代码缓存平台209可以在诸如虚拟机211的执行环境中起作用。
应用207能够是由处理器201在客户端装置200上执行的软件应用。例如,应用207可以是经由网络105来向客户端装置200的用户提供对由服务器109a或者109m提供的服务的访问的web浏览器。服务器109a和109m可以以网站的形式向客户端装置200提供服务,并且由服务器109a或者109m提供的web页面可以包括在被在客户端装置200处加载之后进行编译和执行的多个源代码或者脚本(例如,JavaScript)。
可以将代码缓存平台209配置为向应用程序207提供代码缓存服务,在代码缓存平台209处,应用207向客户端装置200再现由服务器109a和109m提供的服务。在一些方面中,代码缓存平台209接收在等待在客户端装置200上执行的应用207中嵌入的源代码的指示。该源代码的指示可以是指代存储器205中的应用207中嵌入的源代码的位置的链路。该指示还能够是与源代码相关联的标识符、或者源代码的完整内容。响应于接收到该指示,代码缓存平台209能够针对与源代码相对应的所缓存的可执行代码检查存储器205内的资源缓存213。可以将资源缓存213存储在持久型/非易失性存储器中。
例如,可以在先地已经对源代码或者源代码的部分(例如,子代码、函数等)进行编译并且将其缓存在缓存213中。子代码(还称为二级源代码)能够是在源代码中引用(例如,调用)的函数。可以基于诸如例如用户输入、来自另一二级源代码的输出等的各种条件来在源代码内引用二级源代码。此外,可以已经对与源代码有关的诸如例如类型信息的数据进行缓存。所缓存的数据能够由编译器被用于更高效地产生可执行代码。例如,代码缓存平台209可以通过将源代码发送至客户端装置200内的编译器(在图2中未示出)以被编译成可执行代码,从而获得从源代码编译的可执行代码,并且提供用于在客户端装置200上执行的可执行代码。如果在资源缓存213中未找到与源代码或者在源代码中引用的二级源代码相对应的所缓存的可执行代码,则代码缓存平台209可以选择在要编译的源代码中引用的二级源代码。代码缓存平台209可以对与源代码相对应的可执行代码和/或与二级源代码相对应的可执行代码进行缓存。然而,如果在资源缓存213中找到与源代码相对应的所缓存的可执行代码,则在不需要对源代码进行编译的情况下而能够从源缓存检索所缓存的可执行代码并且执行该所缓存的可执行代码。
可执行代码可以包括引用的集。在可执行代码中包括的引用能够是例如在与其中正执行可执行代码的执行环境(例如,虚拟机211)相对应的可执行代码中嵌入的存储器地址。不可以将嵌入的地址从一个执行上下文移植到另一执行上下文。然而,通过将嵌入的地址抽象化而生成的重定位数据能够跨执行上下文进行移植。重定位数据能够被用于例如通过在移植之后恢复非可移植地址来实施将可执行代码中的所嵌入的地址抽象化。在获得用于源代码和所选择的二级源代码的可执行代码之后,代码缓存平台209串行化可执行代码。串行化包括将来自执行上下文(例如,虚拟机211)的可执行代码中的引用的集抽象化。执行上下文提供在具有对处理能力的访问的计算机系统和用于执行可执行代码的存储器内的操作环境。代码缓存平台209生成与可执行代码相关联的重定位数据以反映抽象化,使得能够基于所生成的重定位数据来执行抽象引用的进一步转换。
代码缓存平台209能够将用于源代码和在该源代码中引用的所选择的二级源代码的串行化代码作为所缓存的数据存储在存储器205内的资源缓存213中。常规的缓存管理策略可以被用于管理资源缓存。另外,缓存标签能够被用于识别资源缓存中的所缓存的数据位置。代码缓存平台209还能够提供用于在虚拟机211中执行的可执行代码。在一些方面中,在将串行化代码存储在资源缓存213中随后的时间处,代码缓存平台209可以接收等待在不同的虚拟机环境中执行的源代码的第二指示。例如,在如先前讨论的执行可执行代码之后,客户端装置200可能已经被重新启动或者再启动。如所讨论的是,响应于接收到该指示,代码缓存平台209能够针对与源代码或者在源代码中引用的所选择的二级源代码相对应的可执行代码来检查存储器205内的资源缓存213。由于先前已经对二级源代码进行编译并且将其缓存在资源缓存213中,因此能够在资源缓存213中找到与二级源代码相对应的所缓存的可执行代码。在资源缓存213中的缓存命中之后,代码缓存平209从存储器205内的资源缓存213检索缓存数据。
所缓存的代码包括与先前的编译期间通过二级源代码抽象化的引用相对应的串行化代码。代码缓存平台209能够将检索到的串行化代码去串行化成新的可执行二级源代码。去串行化过程使用伴随关于初始代码的串行化数据、由初始代码引用的对象的类型、和在对象中存储的数据的类型的信息(例如,重定位数据)来从所存储的数据序列提取代码。通过去串行化生成的可执行代码具有与初始可执行代码类似的结构、特性和行为。因此,通过计算机执行可执行代码和由可执行代码引用的对象来执行与由执行初始代码执行相同的任务。代码和由代码引用的对象两者受到串行化和去串行化。去串行化可以包括:使用检索到的串行化代码来从新的可执行二级源代码中的每个二级源代码恢复引用的集,使得新的可执行二级源代码在重新启动客户端装置200之后在客户端装置200上建立的新的虚拟机环境中是可执行的。然后,代码缓存平台209能够提供用于在客户端装置200上的新虚拟机环境中执行的新的可执行二级源代码。可以与在还未被缓存并且未被编译用于该执行的源代码中引用的其它二级源代码一起执行新的可执行次要源代码。代码缓存平台209可以在源代码的不同执行处选择用于缓存的新的二级源代码。基于源代码的二级源代码的执行历史,代码缓存平台209还可以用例如其它更频繁地执行的二级源代码来替换先前选择并且缓存的二级源代码。
如先前讨论的是,在不需要经由网络105与服务器109a或者109b通信的情况下而由代码缓存平台209缓存的代码可以在客户端装置101a或者101b内执行。例如,在示例性方面中,由代码缓存平台209正在对其进行串行化和去串行化的源代码可以是在客户端装置101a或者101n的存储器上本地地存储的代码。
图3是代码缓存平台的流程图,通过该代码缓存平台,可以提供将源代码和/或在源代码中引用的所选择的sun-代码编译和串行化成所缓存代码并且将缓存代码去串行化成可执行代码。如在图3中示出的是,代码缓存平台209可以包括:前端303、串行化模块309和去串行化模块319。前端303可以包括:检查模块305和压缩模块307。前端303接收源代码301。在接收到源代码之后,检查模块305针对与源代码相对应的缓存的串行化代码检查数据储存器313(如箭头311示出)。如果在数据存储313中未找到串行化代码(缓存未命中),则前端303将源代码发送至编译器327(如箭头325示出)。编译器327编译源代码并且存储可执行代码和引用。编译器327可以将可执行代码和引用存储在与执行环境331相关联的存储器位置中(在图3中未示出)。能够将可执行代码发送至执行环境331(如箭头329示出)用于在浏览器会话内的例如与图2的虚拟机211类似的虚拟机的执行环境331内执行。
编译器327能够将可执行代码和引用发送至串行化模块309以进行串行化(如335示出)。前端303可以例如基于在过去的执行中的执行的频率或者基于在源代码内对那些部分引用的函数调用的频率来选择在源代码中引用的用于串行化的部分(例如,二级源代码)。代码缓存平台209能够基于各种标准(例如,启发式的)来选择用于串行化和缓存的源代码和/或在源代码中引用的二级源代码。一些示例标准能够是:源代码或者二级源代码的大小;源代码或者二级源代码的使用年限(例如,基于源代码或者二级源代码的最后修订日期或者到期日期);源代码或者二级源代码的使用频率(例如,在使用第n次之后对代码进行缓存);在资源缓存213中替换缓存代码的频率;在初级源代码中引用二级源代码的次数;或者二级源代码的编译时间。代码缓存平台209可以基于在源代码中引用二级源代码的预测来选择在源代码中引用的用于串行化和缓存的二级源代码。例如,代码缓存平台209可以预测:当对源代码进行编译时,在源代码中引用二级源代码。编译导致源代码可以指示在执行期间源代码将会被二级源代码引用。
如果源代码具有小于阈值S的大小,则代码缓存平台209可以将源代码串行化。基本原理是:将较大代码段串行化可以花费很长时间并且可以需要大量体积的存储器(例如,基于客户端装置101a至101n上的可用磁盘空间来确定)以存储缓存数据。
其它示例标准能够是:缓存访问延迟(例如,缓存录入大小);源代码或者源代码的部分的编译时间(例如,记录源代码的初始编译所花费的时间并且该时间作为决定因子);托管资源缓存213的客户端装置101a至101n的存储器容量;源代码更新的频率(例如,如果源代码被频繁更新,则对源代码进行缓存可能不是有益的)等。代码缓存平台209可以在选择代码以进行串行化之前计算上述因子之间的折衷(trade-off)。例如,能够为源代码或者为源代码的部分定义权重因子以确定在以上讨论的各种标准的重要的程度。能够例如基于所定义的权重因子来执行该折衷计算。例如,即使代码被频繁地调用,代码大小与客户端装置101a至101n的存储器容量之间的折衷可以导致上述的具有大大小的代码的缓存,该缓存可能在客户端装置101a至101n上占据相当大的存储空间。
在各种实例中,前端能够做出关于是否将可执行代码和引用串行化的决定。例如,由服务器109a或者109m可以针对要进行串行化的源代码或者源代码的部分的类型以及在不需串行化的情况下要进行编译和执行的类型来定义一些标准。此外,出于安全之目的,在每次执行源代码之前,可以需要对某些类型的源代码进行验证。在这种情况下,前端303可以将源代码或者源代码的部分标记为不会进行串行化的源代码。
另一代码缓存标准可以包括将代码缓存应用于被编译多于预定义次数的代码。例如,第一时间检测到缓存未命中,则能够对源代码进行编译,但不能将其串行化或者对其缓存。在不需要执行代码的串行化的情况下,能够将源代码标记为“编译一次”。类似地,能够利用计数器来标记源代码,该计数器指示已经对源代码进行编译的次数,直到达到预定义阈值C,在第C次缓存未命中之后,代码缓存平台209能够将源代码串行化并且对源代码缓存。可替代地,代替通用标记,能够对第一缓存未命中设置时间戳,并且第一次缓存未命中与第C次缓存未命中之间的时间差值能够被用于做出串行化决定。能够对标准进行翻译,例如,被翻译为“如果一周至少执行C次该编译代码,则对该编译代码进行缓存”。能够考虑到用于决定对源代码进行缓存的诸如例如编译时间、产生的代码大小、HTTP缓存报头数据等的其它标准。
代码缓存平台209可以使用用于选择要缓存的并且还要被用于随后的执行的二级源代码的源代码的执行数据。执行数据可以包括:例如,在执行期间所执行的源代码引用的其它代码段、源代码的执行简档、源代码是否被频繁地执行(例如,多于预定义次数)足以使缓存值得进行、在执行期间观察到的类型(例如,用户定义的数据结构)信息等。此外,还可以将执行数据串行化,使得能够在执行上下文中将数据去串行化。在去串行化之后,可以与去串行化代码一起使用执行数据。例如,可以在执行上下文中使用执行简档,以决定是否花时间来优化可执行代码。
诸如例如JavaScript的动态类型的语言提供在源代码中定义的对象的大量类型信息。在源代码的不同执行期间,动态类型使源代码的对象能够具有不同的类型。然而,观察源代码的各种执行可以提供关于对象的类型变化的频率的频繁程度的见解。
能够基于对象内容来确定特定对象O的类型T。然而,当源代码与对象O进行交互时,源代码不具有对类型信息的访问权限,并且因此,对象类型T对于源代码是未知的。结果是,源代码需要在访问对象O之前确定类型T。在某些方面中,代码缓存平台209确定对象类型T并且对其进行缓存。例如,代码缓存平台209可以在源代码中在执行环境(例如,在网站中)中访问对象O的时间处观察对象的特定类型。代码缓存平台209能够将访问网站与由网站访问的对象的类型T相关联。除了类型T,代码缓存平台209还能够对在访问时间处确定的“如何访问”信息进行缓存。随后,当由源代码在相同的执行环境处访问对象O时,从缓存数据获知用于访问对象O的期望的类型T和访问方法。代码缓存平台209还能够检查期望的类型T与当前访问处的对象的类型是否相同。如果类型匹配,则在不需要进一步确定所需的访问方法的情况下,所缓存的访问方法能够被用于访问对象O。
此外,对象类型T能够提供关于用于在执行上下文中访问对象O的访问方法的信息。一旦确定了用于访问对象O的访问方法,则在串行化期间能够将关于访问方法的信息存储在资源缓存中作为类型信息并且将其与访问方法相关联。使用存储的类型信息,在去串行化的时间处,在不需要必须确定访问方法的情况下,能够使对对象O的后续访问更快。
由串行化模块309进行的串行化能够通过用抽象地址替换可执行代码内的地址来将可执行代码内的引用抽象化。串行化模块309向前端303提供与可执行代码相对应的串行化代码和与抽象化可执行代码内的引用相对应的重定位数据(如323示出)。在提供串行化代码时,串行化模块309能够从执行环境331中找到与可执行代码和引用相对应的相关部分和引用。串行化模块309能够将部分和引用转换成独立于执行环境331、要在串行化代码中包括的连续二进制表示。前端303能够将由串行化模块309产生的串行化代码存储在数据储存器313中作为缓存的串行化代码。串行化模块309可以使用标签来对与抽象化相对应的串行化代码进行编码以将代码与串行化代码内的其它数据类型区分开来。
在另一实例中,在由前端303将串行化代码存储在数据储存器313中并且将重定位数据存储在元数据315内之后,前端303可以接收对在不同的执行环境333内执行源代码(例如,在新的浏览器会话内的新VM)的新请求。在该实例中,检查模块305可以成功地在数据储存器313中找到缓存的串行化代码(缓存命中)。在发生缓存命中之后,前端303能够从数据储存器313加载所缓存的串行化代码(如317示出),并且将该加载的缓存的串行化代码发送至去串行化模块319。在加载缓存的串行化代码之前,前端303能够确定缓存的串行化代码是否与源代码的相同版本相对应。如果版本不匹配,则前端303可以决定不将缓存的串行化代码进行去串行化,并且针对要编译的源代码向编译器327发送请求。前端303还可以驱逐过时的缓存代码以释放存储器空间。前端303可以基于由网络105内的诸如例如超文本传输协议(HTTP)的通信协议提供的标准版本确认过程来确定缓存的串行化代码和源代码的版本。
在从数据储存器313获得缓存的串行化代码之后,去串行化模块319使用串行化代码内的重定位数据来验证缓存的串行化代码的有效性并且将缓存的串行化代码去串行化成可执行代码和引用。去串行化模块319将可执行代码和引用发送至用于执行的执行环境333(如321示出的)。如果串行化代码与源代码的部分相对应,则由编译器327能够将源代码的未被缓存的部分编译成可执行代码,并且能够在执行环境333中正执行可执行代码之前将可执行代码与去串行化可执行代码组合。
值得注意的是,可以在不同的执行环境331和333内激活串行化模块309和去串行化模块319。在执行环境331(在该执行环境331中,生成并且执行可执行代码和引用)内生成串行化代码,而在随后的执行环境333中生成由去串行化模块319提供的可执行代码和引用。
为了减小在数据储存器313中的缓存数据的大小,压缩模块307可以例如,通过在将串行化代码存储在数据储存器313中之前对串行化代码应用各种压缩算法来对数据进行压缩。压缩模块307还可以在将缓存的串行化代码发送至去串行化模块319之前对缓存的串行化代码进行解压缩。
缓存的串行化代码可以被用作不同执行环境中的可执行代码和引用的上下文独立完整表示。例如,在生成用于执行环境333的可执行代码和引用时,去串行化模块319能够在生成用于执行环境331的可执行代码和引用时对编译器327的行为进行模拟。因此,在将缓存的串行化代码去串行化成可执行代码和引用之后,在执行环境333中执行可执行代码和引用能够提供在执行环境331内执行由编译器327提供的可执行代码和引用的等效结果。
由去串行化模块319进行的去串行化的过程能够使用元数据315内的重定位数据来恢复引用,使得引用反映出执行环境331与执行环境333之间的差异。例如,如以上讨论的是,由于串行化和去串行化可以在不同的执行环境(例如,VM实例)中运行,因此与执行环境331相对应的可执行代码和引用的存储器地址在执行环境333中可以不是有效的。然而,串行化和去串行化确保去串行化可执行代码和引用中的存储器地址是在执行环境333内有效的地址。例如,因为这些功能地址在执行环境331与333之间可以是不同的,所以不通过串行化模块309对执行环境中的函数地址的引用逐字编码。
串行化模块309可以检验源代码与可执行代码和引用内的每个对象以确定应当如何将每个对象串行化。例如,可以将某些唯一对象(例如,规范的未定义值)包括在抽象索引(例如,根阵列)内的可执行代码和引用中。当由串行化模块309将这种唯一对象串行化时,串行化模块309通过唯一抽象索引来将对象串行化。在由去串行化模块319将唯一对象去串行化之后,索引被用于识别对象。
另外,源代码可以包括内置代码,该内置代码被生成执行基本任务的可执行代码段。内置代码可以由源代码内的多个对象共享,并且因此,应当在执行环境331(或333)中是始终可用的。串行化模块309可以将每个内置代码映射至内置标识符,并且将该内置标识符串行化成在串行化代码中的内置代码的代表。在进行去串行化时,前端303能够在执行环境333中找到具有相同标识符的内置对象。
类似地,源代码可以包括桩代码(code-stub)。除了桩代码能够按需生成并且在执行环境333上不一定是可用的之外,桩代码与内置代码类似。串行化模块309能够在生成串行化代码时将桩代码映射至桩代码密钥。在进行去串行化之后,前端303能够检查执行环境333是否包括桩代码。如果执行环境333不包括桩代码,则由去串行化模块319生成与桩代码密钥相对应的桩代码。
此外,源代码可以包括唯一字符串文字。由串行化模块309能够将该唯一字符串文字逐字串行化。在进行去串行化之后,前端303检查执行环境333中是否已经存在相同的字符串文字。如果执行环境333中存在唯一字符串文字,则去串行化模块319将字符串文字规范化为已经存在的唯一字符串。规范化过程将具有多于一种表示(例如,在缓存的串行化代码中的一种表示和在执行环境333中的第二表示)的字符串文字转换成标准形式或者规范形式。
在一些实例中,进行串行化的对象具有对源代码的源字符串的引用。在这种实例中,串行化模块309能够用特殊表示来替换对象。在进行去串行化之后,去串行化模块319能够用对在执行环境333内进行去串行化的时间处单独地提供的源字符串的引用来替换特殊代码。
除了以上讨论的对象地址的串行化之外,嵌入到可执行代码中的地址能够是执行环境中的某些值的地址或者VM的功能的地址。执行环境中的某些值的地址和VM的功能的地址对于编译器和VM是已知的。能够例如用参考标识符来表示这些地址,并且参考标识符能够被用于在进行去串行化时恢复地址。此外,源代码可以包括非唯一对象。能够将该非唯一对象串行化为副本。例如,非唯一对象可以由数据字段和对其它对象的引用组成。当进行串行化时,能够复制数据字段,并且如果对其它对象的引用是唯一的,则对其它对象的引用能够如先前关于唯一对象所讨论的进行串行化。
以下示例描述样本代码的从编译到串行化和去串行化的代码缓存过程。在该示例中考虑到示例JavaScript代码(A)。
样本代码(A)的可执行代码可以包括指令,诸如:函数报头、用于针对堆栈溢出检查指令(调用堆栈溢出内置)、变量声明“foo”、针对内部函数(){return 1;}的闭包实例、对名称为“foo”的全局属性分配闭包、加载名称为“foo”的全局属性、调用所加载的属性、和返回未定义值。
另外,针对样本代码(A)的可执行代码可以包括对重定位信息的引用,其中,重定位信息可以指示:堆栈溢出内置是内置的、字符串文字“foo”是在堆(heap)上的对象、针对(){return 1;}的函数描述是在堆上的对象、函数闭包初始化被实施为运行时间并且同样是外部引用、加载属性是对桩的调用、调用属性是对桩的调用、和未定义的值能够是在堆上的例如先前关于图3讨论的唯一对象的对象。
用于示例代码(A)的可执行代码还可以包括与字符串文字“foo”相关联的元数据,例如,“foo”是类型为由映射对象表示的“内部化字符串”的对象,字符串内容是“foo”,以及字符串的长度为3。用于示例代码(A)的可执行代码还可以包括用于顶层函数和内部函数(){return 1;}的函数描述。函数描述可以是类型为由映射对象表示的类型“共享函数信息”的对象。函数描述可以包含用于源代码中的起点和终点的字符位置。如果已经对样本代码(A)进行编译,则函数描述还可以指向编译代码。
最初,怠惰地对内部函数“foo”进行编译。怠惰编译意味着在对顶层代码进行编译时,不对内部函数“foo”进行编译,而是在对顶层代码进行编译期间仅创建对内部函数“foo”的描述。当最终调用内部函数“foo”时(例如,在执行顶层代码期间)按需要对内部函数“foo”进行编译。然而,只要未对内部函数“foo”进行编译,就不存在用于该内部函数“foo”的可执行代码,并且不能够将用于内部函数的可执行代码串行化。
针对代码缓存平台209存在不同的方式,以将用于内部函数“foo”的编译代码包括在缓存数据中。代码缓存平台209可以识别在顶层代码内调用内部函数“foo”(在样本代码(A)中定义并且调用“foo”)。具有该识别,代码缓存平台209能够及早地对内部函数“foo”进行编译作为对顶层代码进行编译的部分,并且将内部函数“foo”的编译代码包括在对顶层代码的编译中,以及代码缓存平台209在对顶层代码进行编译之后使用用于串行化的所编译的代码。
针对将用于内部函数“foo”的编译代码包括在串行化代码中的另一方式是代码缓存平台209在进行串行化之前至少执行一次顶层代码。由于在执行顶层代码期间调用内部函数“foo”,因此能够如以上讨论来怠惰地对“foo”进行编译,并且能够将所编译的代码存储在存储器中。在这种情况下,当在之后将顶层代码串行化时,用于“foo”的内部函数描述(在顶层代码的初始编译期间创建的)指向内部函数“foo”的怠惰地编译代码。这能够导致代码缓存平台209在对顶层代码串行化时将内部函数“foo”串行化。
串行化模块309能够通过访问对象图、遍历引用、从用于顶层代码的函数描述开始来将样本代码(A)串行化。代码缓存平台209可以保留已经在数据储存器313中访问的对象的历史,使得对象不被串行化多于一次或者在无限循环中运行。能够将已经被访问和串行化的对象表示(编码)为反向引用(back reference)。对象可以包含内容或者对其它对象的引用。能够将对象内容逐字串行化。然而,对其它对象的引用能够是对已知对象的引用或者是对还需要被串行化的对象的引用。例如,函数描述可以具有对“共享函数信息”映射的引用和对用于函数的编译代码的引用。其还可以包含关于字符位置的信息,该字符位置是逐字串行化的。由串行化模块309遇到的映射对象能够是规范对象和根列表的部分。串行化模块309可以在根列表中找到映射对象,并且使用根列表索引以表示对象。
除了对顶层函数的映射的引用(对于代码对象)和对重定位信息的引用之外,能够将用于顶层函数的代码对象逐字串行化。指令流可以包含由重定位信息描述的嵌入的指针。在串行化期间还访问这些指针。由于需要在进行去串行化之后更新这些指针,因此在进行逐字串行化之前,能够将这些指针替换为零(0)值。
顶层函数的代码对象指向内部函数“foo”的函数描述。如果此时已经对内部函数“foo”进行编译,则内部函数“foo”的函数描述指向编译代码,使得串行化模块309能够从顶层函数遍历到内部函数“foo”并且将顶层函数和内部函数两者的代码对象串行化。此外,能够用桩代码密钥来表示桩代码,并且能够用内置ID来表示内置。能够将字符串内容逐字串行化(除了字符串映射之外),以及能够将外部引用映射至外部引用ID。
由去串行化模块319进行的去串行化的过程可以包括通过访问对象图来回溯其中执行串行化的顺序。追踪能够被用于将串行化的代码表示翻译回执行环境333中的对等体,在该执行环境333中,能够执行去串行化代码。例如,如果已经在串行化期间将未定义值编码为根列表索引,则去串行化模块319能够使用该根列表索引以在执行环境333中找到未定义值。另外,能够将反向引用翻译回对已经被去串行化的对象的引用。去串行化结果能够是用于顶层函数的函数描述。
图4A至图4B图示了过程的示例,通过该过程可以提供将代码串行化成缓存代码。虽然关于图1、图2和图3来描述图4A至图4B,但是本技术不限于此,并且能够应用于其它客户端装置和系统。图4A图示了用于将代码串行化成缓存代码的过程的示例。在框401中,前端303接收等待执行的初级源代码的指示(例如,链路、地址、URL等)。例如,初级源代码能够是用于在当前浏览器会话中执行的web页面中的脚本。托管图1的代码缓存平台103a或者103n(或图2的代码缓存平台209)的客户端装置101a或者101n的用户可以通过在当前浏览器会话中录入URL地址来请求执行初级源代码。URL地址可以提供用于加载web页面的链路,该链路包括嵌入的初级源代码。
在加载web页面之后,浏览器可以将初级源代码的指示发送至前端303。响应于接收到该指示,在框403处,检查模块305针对与初级源代码相对应的缓存数据检查数据储存器313中的资源缓存。例如,可以已经在当前浏览器会话之前将web页面加载在另一浏览器会话中,并且代码缓存平台209可以已经将与初级源代码相对应的可执行代码存储在数据储存器313中。如果数据储存器313包括与初级源代码相对应的可执行代码,则框403的检查可以返回缓存命中。然而,如果框403中的检查未找到命中,则返回的结果可以是缓存未命中(如框405示出)。
在框407处,在数据储存器313中发生缓存未命中之后,前端303能够获得从初级源代码编译的可执行代码。例如,前端303能够将初级源代码发送至用于编译的编译器327。
在框409处,前端303能够选择在初级源代码中引用的源代码或者二级源代码的部分。例如,二级源代码能够是在初级源代码中引用的函数。能够基于如关于图2和图3讨论的各种因子和标准(启发式的)来选择源代码的部分。在框411处,前端303能够获得从二级源代码编译的可执行代码。例如,前端303可以将二级源代码发送至用于编译的编译器327。在一些实例中,在不需要选择这些部分的情况下,前端303可以向编译器发送包括初级源代码和在该初级源代码中引用的二级源代码的集的整个源代码。例如,在接收到缓存未命中之后,前端303可以将源代码和/或在该源代码中引用的所选择的二级源代码发送至编译器327。
编译器327对接收到的初级源代码或者二级源代码进行编译并且将可执行代码发送至串行化模块309。编译器327可以将可执行代码存储在客户端装置101a或者101n的存储器中。可执行代码包括引用的集,诸如与源代码中的对象或者选择的部分中的对象相对应的地址和标识符。与可执行代码相对应的引用的集可以包括在与执行环境331相对应的可执行代码中嵌入的存储器地址。执行环境331(或者333)能够是在执行源代码的web浏览器会话内的VM。引用在例如由用于可执行代码的执行引擎(未示出)创建的VM环境执行的环境331中执行可执行代码时向处理器201提供可执行代码329的执行数据。
在由编译器327接收到可执行代码之后,在框413处,串行化模块309将可执行代码串行化。如先前关于图1和图2讨论的是,串行化包括:将来自执行环境331的可执行代码中的引用的集抽象化和定义与串行化代码相关联的重定位数据以反映抽象化。由串行化模块309将来自执行环境331的引用的集抽象化可以包括用抽象地址来替换嵌入的存储器地址。例如,能够将嵌入的地址转换为到函数的预定义列表中的特定索引中的VM的函数。在一些实例中,如果可执行代码包含指向相同代码的地址,则能够通过用从分配给可执行代码的存储器的块的起始地址的偏移地址来替换存储器地址而生成抽象地址,并且可以将嵌入的地址转换为从该代码的开始的相对偏移。
在框415处,前端303将串行化代码作为缓存数据存储在数据储存器313中的资源缓存中以被提供用于在执行环境331中执行。在一些实例中,在由串行化模块309将可执行代码串行化之前,前端303可以确定用于执行串行化的处理器201的可用性。在这种实例中,如果处理器不可用,则前端303可以延迟串行化,直到处理器变得可用。
源代码可以包括对多个二级源代码的引用(例如,函数)。
在这种情况下,可执行代码可以包括多个可执行二级源代码,使得每个可执行二级源代码与源代码中引用的二级源代码相对应。前端303可以选择用于进行串行化的可执行二级源代码。前端303还能够确定用于在串行化代码内维持未串行化的可执行二级源代码。前端303可以基于与可执行代码相关联的引用、基于重定位数据、基于二级源代码的类型、基于二级源代码的安全标识符等来确定二级源代码的去串行化。源代码可以是应用207的顶层脚本。前端303可以例如基于预定义条件来选择用于串行化的应用207的顶层脚本作为源代码。
在一些实例中,前端303可以接收等待执行的初级源代码的指示(例如,链路、地址、URL等)。例如,初级源代码能够是web页面中的脚本。响应于接收到指示,如关于图4A的框403讨论的是,检查模块305针对与初级源代码相对应的并且与在图4A的框409处选择的二次源数据相对应的缓存数据检查数据储存器313中的资源缓存。在数据储存器313中的缓存命中之后,前端303能够从数据储存器313中的资源缓存检索包括串行化代码的缓存数据。
去串行化模块319能够将检索到的缓存的串行化代码去串行化成可执行代码。由去串行化模块319进行的去串行化可以包括:基于执行环境333,使用检索到的缓存的串行化代码来恢复可执行代码中的引用的集。前端303能够提供用于在执行环境333中执行的可执行代码和引用。
值得注意的是,在一些实例中,由去串行化模块319进行的去串行化可以例如由于数据损坏而失败。在这种实例中,前端303能够从数据储存器313中删除所缓存的串行化代码。因此,如图4A的框403中示出的是,在下一次接收到等待执行的源代码的指示时,由检查模块305进行的检查可以返回缓存未命中,并且能够执行根据图4A的串行化过程。
在一些实例中,框409的选择二级源代码可以是基于从执行在框407处获得的可执行代码获得的执行结果。例如,可以在选择二次代码之前执行一次或者多次框407处获得的第一可执行代码。在这种实例中,代码缓存平台209可以从第一执行上下文中执行第一可执行代码来获得执行结果,并且基于该执行结果来选择二级源代码。在执行第一可执行代码之后,代码缓存平台209可以收集与执行相关的数据,以确定引用和执行的二级源代码(例如,函数)。
代码缓存平台209可以选择用于缓存的所执行的二级源代码,而不是对整个源代码进行缓存。因为根据初级源代码内的各种条件(与客户端装置200上的执行环境相关的条件、用户输入等),可以执行一些二级源代码(例如,函数),并且可以不执行一些二级源代码。代码缓存平台209能够确定通过收集与客户端装置200上多次执行初级源代码相关的数据执行的二级源代码,并且确定比其它二级源代码执行得更频繁的二级源代码。代码缓存平台209能够基于该确定来选择用于缓存的二级源代码。代码缓存平台209还可以确定初级源代码内的函数调用,在初级代码内每个函数调用包括执行函数。代码缓存平台209可以收集关于执行函数调用的信息,并且选择在执行期间正执行的、用于缓存的函数。
代码缓存平台209可以基于各种其它因子来选择二级源代码,诸如,例如二级源代码的大小、第二可执行代码的大小、在初级源代码中引用二级源代码的次数、二级源代码的编译时间等。例如,
图4B图示了基于条件的集来将代码串行化成缓存代码的过程的示例。在框421处,前端303接收等待执行的初级源代码的指示(例如,链路、地址、URL等)。如先前关于图4A讨论的是,响应于接收到该指示,在框423处,检查模块305针对与对初级源代码相对应的缓存数据检查数据储存器313中的资源缓存。如果在框423处的检查未找到命中,则返回的结果可以是缓存未命中(如框425示出)。
在框427处,在数据储存器313发生缓存未命中之后,前端303能够获得从初级源代码编译的可执行代码。例如,前端303能够将初级源代码发送至用于编译的编译器327。
在框429处,串行化模块309基于初级源代码的大小、在预定义时间段内执行初级源代码的次数或者频率、初级源代码的编译时间、或者其组合来将可执行代码串行化成串行化代码。例如,如果在一周期间执行初级源代码少于10次,则串行化模块309可以放弃将初级源代码串行化。然而,可以将执行得更频繁的初级源代码(例如,一周内多于10次)串行化。在框431处,前端303将串行化代码作为缓存数据存储在数据储存器313中的资源缓存中以被提供用于在执行环境331或者333中执行。
如以上阐述的是,根据对可执行代码进行缓存以在诸如web浏览器的实例的不同的执行环境中执行来描述的本技术的方面,在不同的执行环境中,在一个网络浏览会话中将数据串行化并且在另一web浏览器会话中将数据去串行化。然而,主题技术不限于web浏览器环境。可以将本主题技术应用于在任何执行环境中对可执行代码进行缓存。此外,可以将本主题技术应用于在图1的第一客户端装置101a至101n(或者图1的服务器109a至109m)中将数据串行化并且对数据进行缓存,并且将缓存数据传递至第二客户端装置101a-101n(或者服务器109a-109m),使得缓存数据被去串行化并且被执行在第二客户端装置101a至109m(或者服务器109a-109m)中。
上述特征和应用能够被实现为软件过程,该软件过程被指定为在计算机可读存储介质(还称为计算机可读介质)上记录的指令的集。当这些指令由处理器(例如,处理器、处理器的核、或者其它处理单元)执行时,这些指令使处理器执行指令中指示的动作。计算机可读介质的示例包括,但不限于,CD-ROM、闪速驱动器、RAM芯片、硬盘驱动器、EPROM等。计算机可读介质不包括无线地或者通过有线连接传递的载波和电子信号。
在本说明书中,术语“软件”意味着包括在只读存储器中驻留的固件或者在磁存储装置中存储的应用,其能够被读入到用于由处理器处理的存储器中。此外,在一些实施方式中,多种软件技术能够被实现为较大程序的子部分的同时,维持不同的软件技术。在一些实施方式中,多种软件技术还能够被实施为单独的程序。最后,共同实施本文中描述的软件技术的单独的程序的任何组合是在本主题技术的范围内。在一些实施方式中,软件程序在被安装为运行在电子系统上时定义出执行和施行软件程序的操作的特定的机器实施方式。
能够以任何形式的编程语言(包括编译语言或者解释语言、声明性语言或者过程性语言)来编写计算机程序(还称为源代码、程序、软件、软件应用、脚本、或者代码)。此外,能够以任何形式(包括作为适合于计算环境中使用的独立式程序或者模块、部件、子例程、对象、或者其它单元)来部署该计算机程序。计算机程序可以但并非必须与文件系统中的文件相对应。能够将程序存储在保持其它程序或者数据(例如,在标记语言文档中存储的脚本)的文件的部分中,或者存储在专用于所探讨中的程序的单个文件中,或者存储在多个协同文件(例如,存储模块、子程序、或者代码的部分的文件)中。能够将计算机程序部署为在一个计算机上执行,或者在位于一个站点处或者跨域在多个站点分布的并且通过通信网络互相连接的多个计算机上执行。
图5概念性地图示了利用其能够实施本主题技术的一些实施方式的示例电子系统。电子系统500能够是计算机、电话、PDA、或者任何其它种类的电子装置。这种电子系统包括各种类型的计算机可读介质、和用于各种其它类型的计算机可读介质的接口。电子系统500包括:总线508、处理单元512、系统存储器504、只读存储器(ROM)510、永久存储装置502、输入装置接口514、输出装置接口506、和网络接口516。
总线508共同表示所有的系统、外围设备、和芯片集总线,该芯片集总线通信地连接电子系统500的数个内部装置。例如,总线508通信地将处理单元512与ROM 510、系统存储器504、和永久存储装置502连接。
处理单元512从这些各种存储器单元检索要执行的指令和要处理的数据,以便本执行主题公开的过程。在不同的实施方式中,处理单元能够是单个处理器或者多核处理器。
ROM 510存储由电子系统的处理单元512和其它模块需要的静态数据和指令。另一方面,永久存储装置502是读写存储器装置。该装置是非易失性存储器单元,该非易失性存储器单元即使在电子系统500关闭时也存储指令和数据。本主题公开的一些实施方式使用大容量存储装置(例如,磁盘或者光盘及其相对应的磁盘驱动器)作为永久存储装置502。
其它实施方式使用移动存储装置(例如,软盘、闪存驱动器、及其相对应的磁盘驱动器)作为永久存储装置502。与永久存储装置502相同的是,系统存储器504是读写存储器装置。然而,与存储装置502不同的是,系统存储器504是诸如随机存取存储器的易失性读写存储器。系统存储器504存储处理器在运行时间处需要的指令和数据中的一些。在一些实施方式中,本主题公开的过程被存储在系统存储器504、永久存储装置502、或者ROM 510中。例如,各种存储器单元包括根据一些实施方式的用于呈现web元素的指令。处理单元512从这些各种存储器单元检索要执行的指令和要处理的数据,以便执行一些实施方式的过程。
总线508还连接至输入装置接口514和输出装置接口506。输入装置接口514使用户能够向电子系统传送信息并且选择命令。与输入装置接口514一起使用的输入装置包括,例如,字母数字键盘和指向装置(还称为“光标控制装置”)。输出装置接口506使能够显示例如由电子系统500生成的图像。与输出装置接口506一起使用的输出装置包括,例如打印机和显示装置、例如阴极射线管(CRT)或者液晶显示器(LCD)。一些实施方式包括例如用作输入装置和输出装置二者的触屏的装置。
最后,如在图5中示出的是,总线508还通过网络接口516将电子系统500耦合至网络(未示出)。以这种方式,计算机能够是计算机的网络的部分(例如,局域网(“LAN”)、广域网(“WAN”)、或者内联网、或者例如互联网的网络中的网络)。电子系统500的任何或者所有部件能够与本主题公开结合一起使用。
以上描述的这些功能能够被实施在数字电子电路系统中、计算机软件、固件或者硬件中。能够使用计算机程序产品实施该技术。可编程处理器和计算机能够被包括在移动装置中或者能够被封装为移动装置。能够通过可编程处理器并且通过可编程逻辑电路系统来执行过程和逻辑流。通用和专用客户端装置和存储装置能够通过通信网络而相互连接。
一些实施方式包括电子部件(例如,微处理器、储存器、和存储器),该电子部件将计算机程序指令存储在机器可读或者计算机可读介质(可替代地,称为计算机可读存储介质、机器可读介质、或者机器可读存储介质)中。这种计算机可读介质的一些示例包括RAM、ROM、只读光盘(CD-ROM)、可记录光盘(CD-R)、可重写光盘(CD-RW)、只读数字通用光盘(例如,DVD-ROM、双层DVD-ROM)、各种可记录/可重写DVD(例如,DVD-RAM、DVD-RW、DVD+RW等)、闪速存储器(例如,SD卡、迷你SD卡、微型SD卡等)、磁性或者固态硬盘驱动器、只读和可记录光盘、超密度光盘、任何其它光学或者磁性介质、以及软盘。计算机可读介质能够存储计算机程序,该计算机程序可由至少一个处理器执行并且包括用于执行各种操作的指令的集。计算机程序或者计算机代码的示例包括例如由编译器产生的机器代码,以及包括由计算机、电子部件、或者微处理器,使用解释器执行的高级代码的文件。
虽然以上的讨论主要是指执行软件的微处理器或者多核处理器,但是一些实施方式由例如专用集成电路(ASIC)或者现场可编程门阵列(FPGA)的集成电路执行。在一些实施方式中,这种集成电路执行在电路自身上存储的指令。
如在本说明书和本申请的任何权利要求项中使用的是,术语“计算机”、“服务器”、“处理器”、和“存储器”全部是指电子装置或者其它技术装置。这些术语不包括人或者人群。鉴于本说明书的目的,术语显示(display)或者显示(displaying)意味着在电子装置上的显示。如在本说明书和本申请的任何权利要求项使用的是,术语“计算机可读介质(computer readable medium)”和“计算机可读介质(computer readable media)”完全局限于以通过计算机可读的形式存储信息的有形的、物理的对象。这些术语排除了任何无线信号、有线下载信号、和任何其它短暂的信号。
为了提供与用户的交互,能够在计算机上实施本说明书中描述的主题的实施方式,该计算机具有用于向用户显示信息的显示装置(例如,CRT(阴极射线管)或者LCD(液晶显示器)监视器)、以及用户能够通过其向计算机提供输入的的键盘和指向装置(例如,鼠标或者轨迹球)。其它种类的装置还能够被用于为与用户的交互;例如,提供给用户的反馈能够是例如视觉反馈、听觉反馈、或者触觉反馈任何形式的感觉性反馈;以及能够以包括声学输入、语音输入、或者触觉输入的任何形式接收来自用户的输入而提供。此外,计算机能够通过将文档发送至由用户使用的装置和从由用户使用的装置接收文档(例如,通过响应于从web浏览器接收到的请求而将web页面发送到用户的客户端装置上的web浏览器)来与用户进行交互。
本说明书中描述的主题的实施例能够在包括后端组件(例如,作为数据服务器)或包括中间件组件(例如,应用服务器)或包括前端组件(例如,具有用户能够通过其与本说明书中描述的主题的实现方式交互的图形用户界面或Web浏览器的客户端计算机),或包括这样的后端组件、中间件组件、前端组件的任何组合的计算系统中实现。系统的组件能够通过数字数据通信的任何形式或介质(例如,通信网络)互连。通信网络的示例包括局域网(“LAN”)和广域网(“WAN”)、网络间网络(例如,互联网)、和对等网络(例如,自组织(ad hoc)对等网络)。
计算系统能够包括客户端和服务器。客户端和服务器通常相互远离,并且可以通过通信网络进行交互。客户端和服务器的关系凭借在相应计算机上运行并相互具有客户端-服务器关系的计算机程序而产生。在一些实施例中,服务器向客户端装置传输数据(例如,HTML页面)(例如,出于向与客户端装置交互的用户显示数据并从与客户端装置交互的用户接收用户输入的目的)。能够在服务器处从客户端装置接收在客户端装置处生成的数据(例如,用户交互的结果)。
理解的是,公开的过程中的步骤的任何特定顺序或者层级对示例方法的说明。基于设计偏好,要理解的是,可以重新布置在过程中的步骤的具体顺序或者层级,或者执行所有图示的步骤。可以同时执行这些步骤中的一些。例如,在某些情况下,多任务处理和并行处理可以是有利的。此外,在不应当将以上图示的各种系统部件的分离理解为对这种分离的需要,并且应当理解的是,所描述的程序部件和系统通常能够一起被集成在单个软件产品中或者被封装到多个软件产品中。
提供了先前的说明书,以使本领域内的任何技术人员能够实践本文中描述的每个方面。对本领域的那些技术人员而言,对这些方面的各种修改将会是很显而易见的,并且本文中限定的通用原理可以被适用于其它方面。因此,该权利要求不旨在限制于本文中示出的这些方面,而是应当被赋予与语言权利要求相一致的全部范围,其中,以单数形式的提及的元件不旨在意味着“一个且仅一个”,除非另有规定,而是旨在意味着“一个或多个”。除非另有规定,否则术语“一些”是指一个或多个。男性代词(例如,他)包括女性和中性(例如,她和它的),反之亦然。标题和副标题(若存在)仅仅出于方便而使用并且不限制本主题公开。
诸如“方面”的短语并不暗指该方面对本主题技术是必要的,或者并不暗指该方面应用于本主题技术的所有配置。与方面相关的公开可以应用于所有配置、或者一个或多个配置。诸如“方面”等短语可以是指一个或多个方面,反之亦然。诸如“配置”等短语不暗指这种配置对本主题技术是必要的,或者这种配置应用于本主题技术的所有配置。与配置相关的公开可以应用于所有配置、或者一个或多个配置。诸如“配置”等短语可以是指一个或多个配置,反之亦然。
Claims (22)
1.一种代码缓存系统,包括:
包含指令的存储器;和
一个或多个处理器,所述一个或多个处理器被配置为执行所述指令,以用于:
在资源缓存中的缓存未命中之后:
获得从等待执行的初级源代码编译的第一可执行代码;
获得从二级源代码编译的第二可执行代码,所述二级源代码在所述初级源代码中被引用并且是基于所述二级源代码的大小或所述二级源代码的编译时间中的一个或多个来选择的;
将所述第一可执行代码和所述第二可执行代码串行化为串行化代码,所述串行化代码被配置为在多个执行上下文中重新构造;
存储所述串行化代码、在所选择的二级源代码中引用的对象、用于访问在所选择的二级源代码中引用的所述对象的访问方法、以及所述对象的类型,作为所述资源缓存中的缓存数据,其中所述指令使得所述一个或多个处理器在针对所缓存的对象发生缓存命中时以及在所述对象的类型与针对所述缓存命中的数据访问的对象类型匹配时使用所述访问方法来访问所缓存的对象;
获得所选择的二级源代码的执行历史;和
基于所选择的二级源代码的所述执行历史,将所选择的二级源代码替换为比所选择的二级源代码更频繁被执行的其他二级源代码。
2.一种代码缓存系统,包括:
一个或多个处理器;以及
机器可读介质,所述机器可读介质包括在所述机器可读介质中存储的指令,所述指令在由所述一个或多个处理器执行时使所述一个或多个处理器执行操作,所述操作包括:
接收等待执行的初级源代码的第一指示;
响应于接收到所述第一指示,检查与所述初级源代码相对应的缓存数据的资源缓存;以及
在资源缓存中的缓存未命中之后:
获得从所述初级源代码编译的第一可执行代码;
基于二级源代码的大小或所述二级源代码的编译时间中的一个或多个,选择在所述初级源代码中引用的所述二级源代码;
获得从所选择的二级源代码编译的第二可执行代码;
将所述第一可执行代码和所述第二可执行代码串行化为串行化代码,所述串行化代码被配置为在多个执行上下文中重新构造;
存储所述串行化代码、在所选择的二级源代码中引用的对象、用于访问在所选择的二级源代码中引用的所述对象的访问方法、以及所述对象的类型,作为所述资源缓存中的缓存数据,其中所述指令使得所述一个或多个处理器在针对所缓存的对象发生缓存命中时以及在所述对象的类型与针对所述缓存命中的数据访问的对象类型匹配时使用所述访问方法来访问所缓存的对象;
获得所选择的二级源代码的执行历史;和
基于所选择的二级源代码的所述执行历史,将所选择的二级源代码替换为比所选择的二级源代码更频繁被执行的其他二级源代码。
3.一种代码缓存系统,包括:
一个或多个处理器;以及
机器可读介质,所述机器可读介质包括在所述机器可读介质中存储的指令,所述指令在由所述一个或多个处理器执行时使所述一个或多个处理器执行操作,所述操作包括:
接收等待执行的初级源代码的第一指示;
响应于接收到所述第一指示,检查与所述初级源代码相对应的缓存数据的资源缓存;以及
在资源缓存中的缓存未命中之后:
获得从所述初级源代码编译的第一可执行代码;
获得来自在第一执行上下文中执行所述第一可执行代码的执行结果;
基于所述执行结果,选择在所述初级源代码中引用的二级源代码;
获得从所选择的二级源代码编译的第二可执行代码;
将所述第一可执行代码和所述第二可执行代码串行化为串行化代码,所述串行化代码被配置为在多个执行上下文中重新构造;
存储所述串行化代码、在所选择的二级源代码中引用的对象、用于访问在所选择的二级源代码中引用的所述对象的访问方法、以及所述对象的类型,作为所述资源缓存中的缓存数据,其中所述指令使得所述一个或多个处理器在针对所缓存的对象发生缓存命中时以及在所述对象的类型与针对所述缓存命中的数据访问的对象类型匹配时使用所述访问方法来访问所缓存的对象;
获得所选择的二级源代码的执行历史;和
基于所选择的二级源代码的所述执行历史,将所选择的二级源代码替换为比所选择的二级源代码更频繁被执行的其他二级源代码。
4.根据权利要求3所述的系统,其中,所述指令进一步使所述一个或多个处理器执行操作,所述操作包括:
接收等待在第二执行上下文中执行的所述初级源代码的第二指示,其中,在所述第一指示之后接收所述第二指示;
响应于接收到所述第二指示,检查与所述初级源代码和所选择的二级源代码相对应的缓存数据的所述资源缓存;以及
在所述资源缓存中的缓存命中之后:
从所述资源缓存检索包括所述串行化代码的所述缓存数据;
将所检索的串行化代码去串行化成第三可执行代码;以及
提供用于在所述第二执行上下文中执行的所述第三可执行代码。
5.根据权利要求4所述的系统,其中,所述第一执行上下文和所述第二执行上下文是用于代码执行的两个不同的虚拟机环境。
6.根据权利要求5所述的系统,其中,所述初级源代码是web页面中的脚本,并且所述第一执行上下文和所述第二执行上下文是执行所述脚本的web浏览器会话。
7.一种代码缓存系统,包括:
一个或多个处理器;以及
机器可读介质,所述机器可读介质包括在所述机器可读介质中存储的指令,所述指令在由所述一个或多个处理器执行时使所述一个或多个处理器执行操作,所述操作包括:
接收等待执行的初级源代码的第一指示;
响应于接收到所述第一指示,检查与所述初级源代码相对应的缓存数据的资源缓存;以及
在资源缓存中的缓存未命中之后:
获得从所述初级源代码编译的第一可执行代码;
选择在所述初级源代码中引用的二级源代码;
获得从所选择的二级源代码编译的第二可执行代码,其中,选择所述二级源代码是基于下述中的一个或多个:所述第二可执行代码的大小、在所述初级源代码中引用所选择的二级源代码的预测、在所述初级源代码中引用所选择的二级源代码的次数、或者在所述初级源代码中引用所选择的二级源代码的频率;
将所述第一可执行代码和所述第二可执行代码串行化为串行化代码,所述串行化代码被配置为在多个执行上下文中重新构造;
存储所述串行化代码、在所选择的二级源代码中引用的对象、用于访问在所选择的二级源代码中引用的所述对象的访问方法、以及所述对象的类型,作为所述资源缓存中的缓存数据,其中所述指令使得所述一个或多个处理器在针对所缓存的对象发生缓存命中时以及在所述对象的类型与针对所述缓存命中的数据访问的对象类型匹配时使用所述访问方法来访问所缓存的对象;
获得所选择的二级源代码的执行历史;和
基于所选择的二级源代码的所述执行历史,将所选择的二级源代码替换为比所选择的二级源代码更频繁被执行的其他二级源代码。
8.根据权利要求2、权利要求3或者权利要求7中的任何一项所述的系统,其中,所述初级源代码是web页面的顶层脚本。
9.根据权利要求2、权利要求3或者权利要求7中的任何一项所述的系统,其中,所述第一可执行代码包括引用集,所述引用集包括在所述第一可执行代码中嵌入的存储器地址,以及其中将所述第一可执行代码串行化包括:用抽象地址来替换所嵌入的存储器地址。
10.一种代码缓存系统,包括:
一个或多个处理器;以及
机器可读介质,所述机器可读介质包括在所述机器可读介质中存储的指令,所述指令在由所述一个或多个处理器执行时使所述一个或多个处理器执行操作,所述操作包括:
接收等待执行的初级源代码的第一指示;
响应于接收到所述第一指示,检查与所述初级源代码相对应的缓存数据的资源缓存;以及
在所述资源缓存中的缓存未命中之后:
获得从所述初级源代码编译的第一可执行代码;
基于二级源代码的大小或所述二级源代码的编译时间中的一个或多个来选择在所述初级源代码中引用的所述二级源代码;
获得从所选择的二级源代码编译的第二可执行代码;
基于所述初级源代码的大小、在预定义时间段内执行所述初级源代码的次数或者频率、或者所述初级源代码的编译时间中的一个或多个,来将所述第一可执行代码和所述第二可执行代码串行化成串行化代码,所述串行化代码被配置为在多个执行上下文中重新构造;
存储所述串行化代码、在所选择的二级源代码中引用的对象、用于访问在所选择的二级源代码中引用的所述对象的访问方法、以及所述对象的类型,作为所述资源缓存中的缓存数据,其中所述指令使得所述一个或多个处理器在针对所缓存的对象发生缓存命中时以及在所述对象的类型与针对所述缓存命中的数据访问的对象类型匹配时使用所述访问方法来访问所缓存的对象;
获得所选择的二级源代码的执行历史;和
基于所选择的二级源代码的所述执行历史,将所选择的二级源代码替换为比所选择的二级源代码更频繁被执行的其他二级源代码。
11.一种代码缓存系统,包括:
一个或多个处理器;以及
机器可读介质,所述机器可读介质包括在所述机器可读介质中存储的指令,所述指令在由所述一个或多个处理器执行时使所述一个或多个处理器执行操作,所述操作包括:
接收等待执行的初级源代码的第一指示;
响应于接收到所述第一指示,检查与所述初级源代码相对应的缓存数据的资源缓存;以及
在所述资源缓存中的缓存未命中之后:
获得从所述初级源代码编译的第一可执行代码;
选择在所述初级源代码中引用的二级源代码;
获得从所选择的二级源代码编译的第二可执行代码,其中,选择所述二级源代码是基于下述中的一个或多个:所述第二可执行代码的大小、在所述初级源代码中引用所选择的二级源代码的预测、在所述初级源代码中引用所选择的二级源代码的次数、或者在所述初级源代码中引用所选择的二级源代码的频率;
基于所述初级源代码的大小、在预定义时间段内执行所述初级源代码的次数或者频率、或者所述初级源代码的编译时间中的一个或多个,来将所述第一可执行代码和所述第二可执行代码串行化成串行化代码,所述串行化代码被配置为在多个执行上下文中重新构造;
存储所述串行化代码、在所选择的二级源代码中引用的对象、用于访问在所选择的二级源代码中引用的所述对象的访问方法、以及所述对象的类型,作为所述资源缓存中的缓存数据,其中所述指令使得所述一个或多个处理器在针对所缓存的对象发生缓存命中时以及在所述对象的类型与针对所述缓存命中的数据访问的对象类型匹配时使用所述访问方法来访问所缓存的对象;
获得所选择的二级源代码的执行历史;和
基于所选择的二级源代码的所述执行历史,将所选择的二级源代码替换为比所选择的二级源代码更频繁被执行的其他二级源代码。
12.一种代码缓存系统,包括:
一个或多个处理器;以及
机器可读介质,所述机器可读介质包括在所述机器可读介质中存储的指令,所述指令在由所述一个或多个处理器执行时使所述一个或多个处理器执行操作,所述操作包括:
接收等待执行的初级源代码的第一指示;
响应于接收到所述第一指示,检查与所述初级源代码相对应的缓存数据的资源缓存;以及
在所述资源缓存中的缓存未命中之后:
获得从所述初级源代码编译的第一可执行代码;
获得来自在第一执行上下文中执行所述第一可执行代码的执行结果;
基于所述执行结果来选择在所述初级源代码中引用的二级源代码;
获得从所选择的二级源代码编译的第二可执行代码;
基于所述初级源代码的大小、在预定义时间段内执行所述初级源代码的次数或者频率、或者所述初级源代码的编译时间中的一个或多个,来将所述第一可执行代码和所述第二可执行代码串行化成串行化代码,所述串行化代码被配置为在多个执行上下文中重新构造;
存储所述串行化代码、在所选择的二级源代码中引用的对象、用于访问在所选择的二级源代码中引用的所述对象的访问方法、以及所述对象的类型,作为所述资源缓存中的缓存数据,其中所述指令使得所述一个或多个处理器在针对所缓存的对象发生缓存命中时以及在所述对象的类型与针对所述缓存命中的数据访问的对象类型匹配时使用所述访问方法来访问所缓存的对象;
获得所选择的二级源代码的执行历史;和
基于所选择的二级源代码的所述执行历史,将所选择的二级源代码替换为比所选择的二级源代码更频繁被执行的其他二级源代码。
13.根据权利要求12所述的系统,其中,所述指令进一步使所述一个或多个处理器执行操作,所述操作包括:
接收等待在第二执行上下文中执行的所述初级源代码的第二指示,其中,在所述第一指示之后接收所述第二指示;
响应于接收到所述第二指示,检查与所述初级源代码和所选择的二级源代码相对应的缓存数据的所述资源缓存;以及
在所述资源缓存中的缓存命中之后:
从所述资源缓存检索包括所述串行化代码的所述缓存数据;
将所检索的串行化代码去串行化成第三可执行代码;以及
提供用于在所述第二执行上下文中执行的所述第三可执行代码。
14.根据权利要求13所述的系统,其中,所述第一执行上下文和所述第二执行上下文是用于代码执行的两个不同的虚拟机环境。
15.根据权利要求10、权利要求11或者权利要求12中的任何一项所述的系统,其中,所述第一可执行代码包括引用集,所述引用集包括在所述第一可执行代码中嵌入的存储器地址,以及其中,将所述第一可执行代码串行化包括:用抽象地址来替换所嵌入的存储器地址。
16.一种计算机可读介质,所述计算机可读介质包括指令,所述指令在由计算机执行时使所述计算机:
接收等待执行的初级源代码的第一指示;
响应于接收到所述第一指示,检查与所述初级源代码相对应的缓存数据的资源缓存;以及
在所述资源缓存中的缓存未命中之后:
获得从所述初级源代码编译的第一可执行代码;
获得来自在第一执行上下文中执行所述第一可执行代码的执行结果;
基于所述执行结果并且还基于二级源代码的大小或所述二级源代码的编译时间中的一个或多个,选择在所述初级源代码中引用的所述二级源代码;
获得从所选择的二级源代码编译的第二可执行代码;
将所述第一可执行代码和所述第二可执行代码串行化为串行化代码,所述串行化代码被配置为在多个执行上下文中重新构造;
存储所述串行化代码、在所选择的二级源代码中引用的对象、用于访问在所选择的二级源代码中引用的所述对象的访问方法、以及所述对象的类型,作为所述资源缓存中的缓存数据,其中所述指令使得计算机在针对所缓存的对象发生缓存命中时以及在所述对象的类型与针对所述缓存命中的数据访问的对象类型匹配时使用所述访问方法来访问所缓存的对象;
获得所选择的二级源代码的执行历史;和
基于所选择的二级源代码的所述执行历史,将所选择的二级源代码替换为比所选择的二级源代码更频繁被执行的其他二级源代码。
17.根据权利要求16所述的计算机可读介质,其中,所述第一可执行代码包括引用集,所述引用集包括在所述第一可执行代码中嵌入的存储器地址,以及其中,将所述第一可执行代码串行化包括:用抽象地址来替换所嵌入的存储器地址。
18.根据权利要求16所述的计算机可读介质,其中,所述执行结果指示在执行所述初级源代码时执行在所述初级源代码中引用的所选择的二级源代码的次数。
19.根据权利要求16所述的计算机可读介质,其中,所述指令进一步使所述计算机:
接收等待在第二执行上下文中执行的所述初级源代码的第二指示,其中,在所述第一指示之后接收所述第二指示;
响应于接收到所述第二指示,检查与所述初级源代码和所选择的二级源代码相对应的缓存数据的所述资源缓存;以及
在所述资源缓存中的缓存命中之后:
从所述资源缓存检索包括所述串行化代码的所述缓存数据;
将所检索的串行化代码去串行化成第三可执行代码;以及
提供用于在所述第二执行上下文中执行的所述第三可执行代码。
20.根据权利要求19所述的计算机可读介质,其中,所述第一执行上下文和所述第二执行上下文是用于代码执行的两个不同的虚拟机环境。
21.根据权利要求19所述的计算机可读介质,其中,所述指令进一步使所述计算机:
获得与所述第一可执行代码相关联的第一执行简档和与所述第二可执行代码相关联的第二执行简档;
将所述第一执行简档和所述第二执行简档串行化;以及
将所串行化的第一执行简档和第二执行简档存储在所述资源缓存中,其中,将所检索的串行化代码去串行化包括:将所述第一执行简档和所述第二执行简档去串行化。
22.根据权利要求16所述的计算机可读介质,其中,所述指令进一步使所述计算机:
确定用于执行将所述第一可执行代码和所述第二可执行代码串行化的处理器的可用性;以及
当所述确定指示所述处理器的不可用性时,延迟所述串行化。
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US14/726,376 US9811324B2 (en) | 2015-05-29 | 2015-05-29 | Code caching system |
US14/726,376 | 2015-05-29 | ||
PCT/US2016/024791 WO2016195790A1 (en) | 2015-05-29 | 2016-03-29 | Code caching system |
Publications (2)
Publication Number | Publication Date |
---|---|
CN107408055A CN107408055A (zh) | 2017-11-28 |
CN107408055B true CN107408055B (zh) | 2019-08-16 |
Family
ID=57398598
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201680019416.5A Active CN107408055B (zh) | 2015-05-29 | 2016-03-29 | 代码缓存系统 |
Country Status (8)
Country | Link |
---|---|
US (1) | US9811324B2 (zh) |
EP (1) | EP3304293B1 (zh) |
JP (1) | JP6329329B2 (zh) |
KR (1) | KR101851357B1 (zh) |
CN (1) | CN107408055B (zh) |
DE (1) | DE112016002416T5 (zh) |
GB (1) | GB2553444B (zh) |
WO (1) | WO2016195790A1 (zh) |
Families Citing this family (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20170123760A1 (en) * | 2015-10-30 | 2017-05-04 | AppDynamics, Inc. | Code Correction During a User Session in a Distributed Business Transaction |
US11360750B1 (en) * | 2020-12-23 | 2022-06-14 | Sony Interactive Entertainment LLC | Systems and methods for converting a legacy code into an updated code |
US12017140B2 (en) * | 2021-06-07 | 2024-06-25 | Sony Interactive Entertainment LLC | Systems and methods for emulation of graphical and audio parameters during a play of a legacy game |
CN114328061B (zh) * | 2021-12-30 | 2024-03-29 | 湖南泛联新安信息科技有限公司 | 一种用于逻辑仿真系统的高性能信号监视方法 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102741812A (zh) * | 2010-01-12 | 2012-10-17 | 高通股份有限公司 | 通过元数据抽取执行动态语言 |
CN104137057A (zh) * | 2012-02-13 | 2014-11-05 | 微软公司 | 生成和高速缓存软件代码 |
Family Cites Families (26)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5452457A (en) | 1993-01-29 | 1995-09-19 | International Business Machines Corporation | Program construct and methods/systems for optimizing assembled code for execution |
US5509129A (en) | 1993-11-30 | 1996-04-16 | Guttag; Karl M. | Long instruction word controlling plural independent processor operations |
US6393415B1 (en) * | 1999-03-31 | 2002-05-21 | Verizon Laboratories Inc. | Adaptive partitioning techniques in performing query requests and request routing |
US7761857B1 (en) * | 1999-10-13 | 2010-07-20 | Robert Bedichek | Method for switching between interpretation and dynamic translation in a processor system based upon code sequence execution counts |
US20060206874A1 (en) | 2000-08-30 | 2006-09-14 | Klein Dean A | System and method for determining the cacheability of code at the time of compiling |
US7640153B2 (en) * | 2001-06-04 | 2009-12-29 | Hewlett-Packard Development Company, L.P. | Networked client-server architecture for transparently transforming and executing applications |
KR100503077B1 (ko) * | 2002-12-02 | 2005-07-21 | 삼성전자주식회사 | 자바 실행 장치 및 자바 실행 방법 |
US7805710B2 (en) * | 2003-07-15 | 2010-09-28 | International Business Machines Corporation | Shared code caching for program code conversion |
US7890961B2 (en) * | 2003-08-29 | 2011-02-15 | Yahoo! Inc. | Method and apparatus for providing desktop application functionality in a client/server architecture |
US7818724B2 (en) * | 2005-02-08 | 2010-10-19 | Sony Computer Entertainment Inc. | Methods and apparatus for instruction set emulation |
US8402224B2 (en) | 2005-09-20 | 2013-03-19 | Vmware, Inc. | Thread-shared software code caches |
JP2007233472A (ja) * | 2006-02-27 | 2007-09-13 | Canon Inc | 情報処理装置、情報処理装置の制御方法および制御プログラム |
US8245202B2 (en) * | 2007-04-18 | 2012-08-14 | Sony Computer Entertainment Inc. | Processor emulation using speculative forward translation |
US8286152B2 (en) * | 2007-08-22 | 2012-10-09 | International Business Machines Corporation | Systems, methods, and computer products for just-in-time compilation for virtual machine environments for fast application startup and maximal run-time performance |
US8392881B1 (en) | 2008-05-13 | 2013-03-05 | Google Inc. | Supporting efficient access to object properties in a dynamic object-oriented programming language |
US8321850B2 (en) | 2008-06-06 | 2012-11-27 | Vmware, Inc. | Sharing and persisting code caches |
US8095507B2 (en) | 2008-08-08 | 2012-01-10 | Oracle International Corporation | Automated topology-based statistics monitoring and performance analysis |
US8707161B2 (en) | 2009-09-30 | 2014-04-22 | Facebook, Inc. | Executing server side script code specified using PHP on a server to generate dynamic web pages |
US8479176B2 (en) * | 2010-06-14 | 2013-07-02 | Intel Corporation | Register mapping techniques for efficient dynamic binary translation |
US20110321010A1 (en) | 2010-06-24 | 2011-12-29 | Yifei Wang | Web application framework based on object oriented class mapping |
KR101782995B1 (ko) | 2011-01-13 | 2017-09-29 | 삼성전자주식회사 | 자바스크립트 코드 저장 및 최적화를 통한 웹 브라우징 방법 및 장치 |
US8867337B2 (en) * | 2011-04-26 | 2014-10-21 | International Business Machines Corporation | Structure-aware caching |
EP2715567A4 (en) * | 2011-05-25 | 2015-05-20 | Nokia Corp | MEMORY CACHING FOR NAVIGATION PROCESSES |
US9047407B2 (en) | 2011-12-16 | 2015-06-02 | Microsoft Technology Licensing, Llc | State capture after execution in dependent sequences |
US20140095778A1 (en) * | 2012-09-28 | 2014-04-03 | Jaewoong Chung | Methods, systems and apparatus to cache code in non-volatile memory |
US10339069B2 (en) * | 2012-09-28 | 2019-07-02 | Oracle International Corporation | Caching large objects in a computer system with mixed data warehousing and online transaction processing workload |
-
2015
- 2015-05-29 US US14/726,376 patent/US9811324B2/en not_active Expired - Fee Related
-
2016
- 2016-03-29 WO PCT/US2016/024791 patent/WO2016195790A1/en active Application Filing
- 2016-03-29 CN CN201680019416.5A patent/CN107408055B/zh active Active
- 2016-03-29 DE DE112016002416.9T patent/DE112016002416T5/de not_active Withdrawn
- 2016-03-29 GB GB1715440.2A patent/GB2553444B/en active Active
- 2016-03-29 JP JP2017551130A patent/JP6329329B2/ja active Active
- 2016-03-29 EP EP16715430.1A patent/EP3304293B1/en active Active
- 2016-03-29 KR KR1020177028178A patent/KR101851357B1/ko active IP Right Grant
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102741812A (zh) * | 2010-01-12 | 2012-10-17 | 高通股份有限公司 | 通过元数据抽取执行动态语言 |
CN104137057A (zh) * | 2012-02-13 | 2014-11-05 | 微软公司 | 生成和高速缓存软件代码 |
Also Published As
Publication number | Publication date |
---|---|
GB201715440D0 (en) | 2017-11-08 |
WO2016195790A1 (en) | 2016-12-08 |
CN107408055A (zh) | 2017-11-28 |
GB2553444A (en) | 2018-03-07 |
US9811324B2 (en) | 2017-11-07 |
EP3304293B1 (en) | 2021-09-15 |
GB2553444B (en) | 2018-09-05 |
KR101851357B1 (ko) | 2018-04-24 |
DE112016002416T5 (de) | 2018-03-08 |
EP3304293A1 (en) | 2018-04-11 |
JP6329329B2 (ja) | 2018-05-23 |
KR20170125398A (ko) | 2017-11-14 |
US20160350089A1 (en) | 2016-12-01 |
JP2018510428A (ja) | 2018-04-12 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109479061B (zh) | 遵从性违反检测 | |
CN107077691B (zh) | 用于确定数据库高速缓存命中的基于年龄的策略 | |
CN110149423B (zh) | 域名处理方法、装置、可读存储介质及电子设备 | |
CN103649945B (zh) | 最近使用的文档列表的自动同步 | |
US20190229939A1 (en) | Communication Gateway Services in a Networked Message Distribution System | |
US9152732B2 (en) | Browser cache assist for accessing web-based content | |
US7739691B2 (en) | Framework for declarative expression of data processing | |
CN106575298A (zh) | 包含动态内容和陈旧内容的网站的快速呈现 | |
US8631394B2 (en) | Static resource processing | |
US11546440B2 (en) | Systems and methods for tracking sharing of web content | |
US9389891B2 (en) | Custom browser-side spreadsheet functions | |
EP2854048B1 (en) | Method of operating a mobile telecommunications device | |
CN107408055B (zh) | 代码缓存系统 | |
CN106648569B (zh) | 目标序列化实现方法和装置 | |
BR112014006589B1 (pt) | Método implementado por computador para navegação de sessão remota e sistema para navegação de sessão remota | |
CN103631604B (zh) | 一种基于celts-41规范的标准化数字学习资源管理方法 | |
CN101388891A (zh) | 管理呈现实体的呈现信息的装置和方法 | |
CN104395881B (zh) | 动态型阵列的表达和变换 | |
US11640307B2 (en) | Process initiation | |
US10915304B1 (en) | System optimized for performing source code analysis | |
CN112052234B (zh) | 业务数据的处理方法和装置、存储介质、电子装置 | |
US11704117B2 (en) | System optimized for performing source code analysis | |
CN116975087A (zh) | 一种异构数据源的检索方法、装置、设备和介质 | |
Wint | Veterinary Web-geographic information systems: what’s the point and what’s involved? | |
KUMARI | WEB SERVER FOR VISUALIZATION OF WIRELESS SENSOR NETWORK DATA |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
CB02 | Change of applicant information | ||
CB02 | Change of applicant information |
Address after: American California Applicant after: Google limited liability company Address before: American California Applicant before: Google Inc. |
|
GR01 | Patent grant | ||
GR01 | Patent grant |