在访问动态类型化阵列对象过程中的尺寸依赖类型的制作方法

文档序号:9732012阅读:216来源:国知局
在访问动态类型化阵列对象过程中的尺寸依赖类型的制作方法
【专利说明】
[0001] 相关申请的交叉引用
[0002] 本专利申请设及并要求于2013年8月30日由Filip Pizlo等人提交的名称为 "RUNTIME ACCESS OF DYNAMIC OB巧CTS"的美国临时专利申请61/872,386的权益,该专利 申请W引用的方式全文并入本文。
技术领域
[0003] 本发明通常设及针对动态类型化数据的运行时访问。更具体地,本发明设及优化 执行基于动态语言的代码过程中的阵列数据访问。
【背景技术】
[0004] 动态语言诸如化¥日5沈191:、1?油7、?71:11〇]1、?日1'1和?册等正日益被认为是静态语言 诸如C和C++的替代。动态语言带来很多益处,诸如程序员生产率和相对浅的学习曲线。然 而,进一步采用包括化¥曰5。1'191:、1?山巧、?八11〇]1和其他语言的动态语言的障碍是缺少高性能 共享存储器并发机制,诸如在静态语言中明显可用的线程和锁定或libdispatch。由于对象 在动态语言中的工作方式,运一问题被认为是困难的,所W至今还未解决。
[0005] 先前为解决该问题所作的尝试包括围绕每个对象访问添加锁定机制。尽管锁定机 制可保证期望的并发语义,但是非常慢。锁定和解锁可按照低于正常堆访问的量级来执行, 因此引入过高的开销。
[0006] 另外,内联高速缓存(IC)通常用于基于化vaScript的代码的高性能具体实施。典 型地,内联高速缓存包括自修改代码。然而,可在多个处理器上执行的并发自修改代码可能 既困难又慢。因此,向用于基于化vaScript的代码的基于内联高速缓存的具体实施添加并 发性可能造成不切实际的昂贵。
[0007] 此外,JavaScript作为语言具有经由存储器中的16字节单元W及可选可变量的额 外的存储器内联(即,紧接在前16字节之后)被表示为对象的元素的阵列的概念。如果基于 化vaScript的程序被执行W向对象添加比可被包含在其内联属性存储装置中的更多的属 性,则必须分配单独的外联存储器块W存储其附加属性。JavaScript阵列主要用于编索引 的属性存储。关于对象的编索引属性的存在总是要求分配外联索引属性存储对象。
[000引因此,用于执行基于动态语言的程序的现有具体实施往往缺乏效率、并发性和有 效优化。

【发明内容】

[0009] 从动态编程语言诸如化vaScript生成的代码可包括增强型对象模型W允许在运 行时期间并发执行数据访问。除了对象的类型结构和数据有效载荷存储属性或字段值之 夕h索引结构可被引入到表示动态类型化对象的对象模型。索引结构的元素可作为用于访 问对象的间接索引指向对应属性值处。
[0010] 在一个实施例中,动态类型化程序代码(例如,实现某一算法)可被允许通过对象 的索引结构经由附加间接索引来对对象的单个属性值并发执行每次访问操作而不会产生 竞争状况。针对对象的单个属性值的每次访问(例如,加载/存储)操作可要求多个指令操作 和/或原子操作。在并发执行期间,运些指令可被允许W非同步方式交织。
[0011] 在其他实施例中,用于访问单个线程中的动态类型化对象的内联高速缓存初始化 可被卸载到解译器而不会造成不必要的同步开销。可提供线程偏置机制来检测代码块是否 在单个线程中执行。此外,可减少经由编译器诸如基线JIT编译器执行的内联高速缓存初始 化的次数,W提高处理性能。
[0012] 在其他实施例中,由多个线程中共享的代码块中的内联高速缓存初始化可被延迟 或定时W减少所要求的处理器同步(例如,光点)的出现,W利用初始化来更新可执行代码。 例如,每个线程可在运行时期间将初始化代码存储在缓冲器中。光点定时器(例如,经由特 定线程)可使得所有内联高速缓存周期性地(例如,每IOms)初始化(例如,更新到运行时), 只要缓冲器对于所要求的处理器同步来说非空即可。因此,可减少针对内联高速缓存初始 化所需的昂贵或缓慢的同步操作的调用次数。
[0013] 在其他实施例中,阵列中的元素的数量可在执行基于动态语言的程序期间被跟踪 或者可从程序的源代码进行静态假定,运允许运行时推断应具有未来分配的元素阵列的数 量。平面阵列类型的阵列对象的阵列元素可被存储在所分配的对象单元内的可选内联存储 装置中,W表示阵列对象。对象单元中的内联存储装置可被可用存储空间限定在于存储器 中分配的相邻对象单元之间。对象的平面阵列类型可基于对象是否表示阵列并且基于对象 单元的内联存储装置是否具有足够的存储空间来存储阵列的元素。平面阵列类型的阵列对 象可允许在对象单元中访问的阵列对象的阵列元素,而无需经由被存储在对象单元中的指 针进行附加存储器加载。此外,生成支持平面阵列类型的可执行代码的编译器的类型系统 可允许编译器基于平面阵列类型来执行代码优化。
[0014] 通过附图并且通过W下具体描述,本发明的其他特征将显而易见。
【附图说明】
[0015] 本发明W举例的方式进行说明,并且不限于各个附图的图形,在附图中类似的附 图标号指示类似的元件,并且其中:
[0016] 图1为示出了用于从网络化设备检索的基于动态语言的源代码的示例性执行运行 时的网络图;
[0017] 图2为示出了并发执行和/或优化执行访问动态类型化对象的系统的一个实施例 的框图;
[0018] 图3为示出了用于执行共享共同动态类型化对象的多个线程的一个示例性运行时 的框图;
[0019] 图4示出了经由并发执行而共享的动态类型化对象的示例性分配;
[0020] 图5为示出了用于生成用于访问动态类型化对象的并发可执行指令的过程的一个 实施例的流程图;
[0021] 图6为示出了用于基于具有索引标号的对象模型来并发访问对象的属性值的过程 的一个实施例的流程图.
[0022] 图7A-图7B为示出了针对并发执行来优化内联高速缓存的代码块的运行时系统的 框图;
[0023] 图8示出了用于利用内联高速缓存代码来动态编译代码块的并发执行的示例性时 间线;
[0024] 图9为示出了用于自修改内联代码访问用于并发执行的动态类型化对象的过程的 一个实施例的流程图;
[0025] 图10为示出了用于基于具有索引标号的对象模型借助内联高速缓存并发访问对 象的属性值来动态编译函数代码块的过程的一个实施例的流程图;
[0026] 图11示出了针对平面阵列对象支持阵列数据存储内联的对象模型的实例;
[0027] 图12为示出了用于优化动态编程语言中指定的对象数据访问的动态分配的阵列 数据内联的系统的一个实施例的框图;
[0028] 图13为示出了动态编译代码W分配阵列数据内联的过程的一个实施例的流程图;
[0029] 图14为示出了用于在运行时期间识别平面阵列数据类型W生成指令W用于经由 平面阵列分配的内联迭代地访问对象的过程的一个实施例的流程图;
[0030] 图15示出了数据处理系统诸如计算机系统的一个实例,该数据处理系统可与本文 所述的实施例一起使用。
【具体实施方式】
[0031] 本文描述了用于共享动态类型化对象、优化用于访问动态类型化数据的内联高速 缓存代码、优化动态类型对象中的阵列数据的方法和装置。在W下说明中示出了许多具体 细节,W提供对本发明的实施例的彻底解释。然而,对于本领域的技术人员显而易见的是, 本发明的实施例可在不具有运些具体细节的情况下被实施。在其他情况下,未详细示出已 熟知的部件、结构和技术,W免模糊对此描述的理解。
[0032] 在本说明书中提到的。一个实施例"("one embodiment"或"an embodiment")是指 结合实施例所述的特定特征、结构或特性可被包括在本发明的至少一个实施例中。在本说 明书中的不同位置出现的短语"在一个实施例中"不一定都是指同一个实施例。
[0033] 下图中示出的过程通过处理逻辑部件来执行,该处理逻辑部件包括硬件(例如,电 路、专用逻辑部件等)、软件(诸如在通用计算机系统或专用机上运行的软件)、或两者的组 合。虽然下文按照某些顺序操作来描述该过程,但应当理解,所述的某些操作可W不同的顺 序来执行。此外,某些操作也可并行执行而并非按顺序执行。
[0034] 图1为示出了用于从网络化设备检索的基于动态语言的源代码的示例性执行运行 时的网络图。在一个实施例中,网络系统100可包括一个或多个服务器应用诸如在一个或多 个服务器设备中托管的服务器应用101,W提供可用于在客户端设备中运行的客户端应用 105的内容。例如,服务器应用101可为web服务器并且客户端应用105可为web浏览器。服务 器101和客户端105可基于例如互联网络协议诸如HTTP(超文本传输协议)或其他可适用协 议经由网络103彼此通信。
[0035] 在一个实施例中,从服务器101检索的内容可包括基于超文本语言(诸如HTML(超 文本标记语言)、XML(可扩展标记语言)或其他标记语言)的web页面,该超文本语言嵌入动 态编程语言(例如化巾曰5(31'191:、1?油7、?八11〇]1或其他动态类型化语言)中或与动态编程语言 中的源进行链接(例如超链接)。客户端105可动态地下载或获取用于执行的所链接的源。在 一个实施例中,客户端105可动态编译下载的源W优化代码执行W用于改善包括例如多线 程执行和/或多个处理器或处理单元的并发执行环境中的性能。
[0036] 图2为示出了并发执行和/或优化执行访问动态类型化对象的系统的一个实施例 的框图。在一个实施例中,系统200可包括操作环境201诸如由一个或多个处理器托管的图1 的操作系统托管客户端应用105。操作环境201可包括编译器205,该编译器例如基于即时编 译来在运行时期间将源代码203动态和/或连续编译为可执行代码215。
[0037] 源代码203可包括动态编程语言诸如化vaSc;ript、Ruby、Python或其他可适用动态 类型化语言中的程序。源代码203可不指定或声明在代码声明中标引的数据或对象的类型 或形状。在一个实施例中,可通过在操作环境201中运行的浏览器应用或其他可适用应用来 从远程设备诸如图1的服务器101检索源代码203。编译模块205可由浏览器应用控制W执行 浏览操作。
[0038] 编译器205可从源代码203生成可执行代码215。在一个实施例中,编译器205可解 析源代码203来W静态或动态方式发出中间代码、字节码或其他可适用编译代码,从而执行 在源代码203中指定的数据处理操作。编译器205可提供表示动态类型化对象的对象模型W 启用并发执行。例如,对象模型可包括对对象值的间接引用,W允许在多个处理器环境中在 多线程间或在多个执行过程间共享共同对象。
[0039] 在一个实施例中,优化的内联高速缓存代码生成器模块207可发出内联高速缓存 代码W用于访问(例如,读取、写入、更新等)由多执行线程共享的动态类型化对象。所发出 的内联高速缓存代码可支持针对并发执行的优化运行时绑定而无需高代价的处理器指令 同步。所发出的代码可包括能够在例如执行初始化内联高速缓存代码时改变其自身的指令 的自修改代码。
[0040] 在一个实施例中,并发代码执行模块217可调用解译器213W基于经由编译器205 生成的代码来执行操作。例如,解译器213可根据经由编译器205发送的自修改指令来更新 字节码,而无需激活指令高速缓存刷新来同步不同处理器间的指令。在一些实施例中,指令 高速缓存刷新模块219可例如经由专用线程来周期性地调用指令高速缓存刷新。
[0041] 根据某些实施例,编译器215可包括优化的阵列对象处理程序模块209, W提供能 够在运行时期间识别专用类型(例如,平面阵列类型)的动态类型化数据的可执行代码,从 而优化阵列数据处理。因此,经由并发代码执行模块217对阵列对象的重复或迭代处理可获 取与用于利用静态类型化阵列数据类型编译的类似操作的执行指令可比拟的执行性能(例 如,利用预先指定的阵列类型来优化阵列数据处理)。
[0042] 并发代码执行模块217可基于可执行代码215来调用ACS(原子比较和交换)处理程 序模块221W执行同步更新操作而无需依赖高成本的基于软件的锁定/解锁机制。ACS处理 程序模块221可直接经由处理器硬件逻辑部件支持W确保原子更新操作在无间断的情况下 执行(例如,在一个处理器指令周期内)。
[0043] 在一个实施例中,程序或可执行代码中的变量的运行时值的类型可在程序(例如, 可执行代码217)正运行的同时在运行时期间被识别并进行概要分析(例如,分析、概要等)。 基于通过过去执行历史的识别类型,可预测运行时值的未来类型来更新或重新编译程序W 代替程序或代码中的具有类型预测优势的部分。
[0044] 例如,配置文件数据(例如,在运行时期间指示数据或对象的类型)可被收集到运 行时数据211中。编译器205可基于配置文件数据经由重新编译来连续优化可执行代码215。 配置文件代码可嵌入可执行代码215中W在运行时期间启用对配置文件数据的收集。
[0045] 动态类型化对象的并发访问
[0046] 在一个实施例中,可提供并发对象模型W允许并发执行在不损坏存储器堆的情况 下访问(例如,读取、写入、更新等)动态类型化对象所需的多个机器指令。对象可包括一个 或多个字段或属性。动态类型化对象的字段或属性可在第一次经由可执行代码分配时在运 行时期间出现。与可执行代码对应的基于动态语言的源程序或代码可能不包括对象的所有 字段的预先声明。对象可被表示为复杂数据结构(或形状)。对对象的每次访问可包括执行 多个机器指令。
[0047] 并发对象模型可包括属性索引,W允许在无需经由额外同步的协调的情况下经由 从多执行(例如,在多处理器环境中)线程(或处理)交织的多个机器指令来并发访问公共对 象或竞争存储器访问。对对象的访问的结果可保持一致,而与交织运些指令的次序无关。因 此,并发对象模型可经由多个指令来启用原子访问,每个指令具有原子执行的单个机器指 令属性。因此,并发对象模型可在不损坏堆的情况下允许竞争存储器进行访问,W并发读 取、写入和更新一致且良好限定(例如,根据运些访问操作的语义)的动态类型化对象。
[0048] 根据某些实施例,对象可经由单元和有效载荷来表示。单元可包含对结构和有效 载荷的标引。例如,单元可包括识别结构的结构标识符和指向存储有效载荷的位置的有效 载荷指针。结构可指示对象具有的字段或属性W及在有效载荷中存在的那些字段索引。在 一些实施例中,结构可包括表示字段的一组属性名。有效载荷可包括那些字段的值(或属性 值)。
[0049] 基于并发对象模型来表示动态类型化对象的单元的示例性分配可包括: struct Ceil {
[0050] int Struct山-e; Value 々々index;
[0051] 其中Cell. Value可表示用于对象的整数或其他可适用属性值或字段值。 Cell. S化UC化re可为对对象的结构的整数标引。共享Cell. S化UC化re的公共值的两个对象 可指示运两个对象为相同动态类型或形状。在一个实施例中,Cell, structure可表示对表 示不同类型的动态结构的表格的索引。
[0052] Cell, index可包括对对象的有效载荷或属性值的间接标引。在一个实施例中, Cell. index可提供一层间接索引W允许对象的有效载荷针对对象数据的并发访问动态生 长(例如,属性值)而不会引起具有不一致数据访问结果的竞争状况。索引本身可包括经由 字段偏移量索引的阵列并且在其中包含指向真实字段值(或属性值)的指针。
[0053] 在一个实施例中,Cell. index可包含作为对象数据访问中的不变量的不变字段标 引或值。尽管对象的字段值可改变,但是表示对象的对象单元可包括对字段值的不变标引。 可在无需同步成本的情况下实现并发对象访问。
[0054] 例如,可利用具有内联高速缓存优化的W下操作(例如,由编译器生成)来执行
[0055]用于访问对象的典型对象读取程序声明(例如,读取对象O的属性f的v = o.f): if (o->s1;mcture 二二 ExpebdStmcture)' V= *(o->index|0化etOfF]、);
[0化6] - ' else Y '=: SlowP 她iRiead(o);
[0057] SlowPathReadO可表示包括执行的对象读取例程,W例如通过对象的动态结构或 形状经由表格查找操作或散列操作来解析或定位对象的属性或字段值。 ExpectedStruc化re可表示在运行时期间之前出现的对象类型,其中偏移量值Of f setOf
当前第1页1 2 3 4 5 6 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1