动态类型化的编程语言中的属性访问的制作方法

文档序号:10475872阅读:330来源:国知局
动态类型化的编程语言中的属性访问的制作方法
【专利摘要】代码生成器可发出用于在动态类型化的编程语言中促进类型安全性的情况下访问对象的属性的直接访问代码。直接访问代码使用被硬编码到对象的存储器区域内的偏移来访问属性的值。在一些情况下,直接访问代码在防护包括至少一个在先序列成员在内的属性访问序列的单个类型检查后访问该值。在一些情况下,类型检查代码将对象的类型与等同类型高速缓存的指定的防护类型进行比较。可通过使用与等同类型高速缓存相关联的属性等同性记录来检查对象类型与等同类型高速缓存中的类型的因属性而异的访问等同性。当类型关于一属性不是访问等同的时,通过发出用于访问该属性的非直接访问代码来保持类型安全性。
【专利说明】动态类型化的编程语言中的属性访问
[000。 背景
[0002] 计算硬件通常不基于位(一和零)旨在对人们的含义来在位之间进行区分。在计算 系统中,通常出现的是,在字符串、整数值、列表、表、层级、数据结构片段、代码序列和其他 数据要被移动或W其它方式被操纵时,运些操纵中的每个使用相同的基础低级硬件来完 成,而不管数据所预期的含义。即使在要被处理器执行的位与不要被处理器执行的位之间 的区别是由人和人的工具创建的区别的情况下。位的含义W及位移动和位操纵的实际影响 最终都取决于人类解释。分配位在智能电话、平板、膝上型电脑、网络和其他系统中的最终 含义的是开发者和其他人员。
[0003] 开发者将含义分配到位的一种方式是使用编程语言来定义软件内容和行为。编程 语言的帮助在软件中文档化并实现特定含义的一个方面一般被知晓为"类型化"。类型化也 被称为使用短语"类型系统"和"数据类型"等。通过将数据类型与变量、常量、例程、接口 W 及程序中的其他构造或人工产物相关联,软件开发者将含义添加到底层的位。在没有添加 的含义的情况下,程序位仅仅是一和零的序列。
[0004] 概述
[0005] -些实施例或示例在在动态类型化的编程语言中促进类型安全性的指定条件下 发出针对属性访问的直接访问代码来访问对象的属性。在一些情况下,直接访问代码在执 行之际访问被定位在对象的存储器区域中被硬编码的偏移处的属性的值。在一些情况下, 直接访问代码在执行之际在防护属性访问序列的单个类型检查之后访问该值。在一些情况 下,类型检查代码将对象类型与等同类型高速缓存的指定的防护类型进行比较。在一些情 况下,代码通过使用与等同类型高速缓存相关联的属性等同性记录来确定对象类型是否针 对所访问的属性与等同类型高速缓存中的类型等同。
[0006] 所给出的示例只是说明性的。本
【发明内容】
并不旨在标识所要求保护主题的关键特 征或必要特征,也不旨在用于限制所要求保护主题的范围。相反地,提供本
【发明内容】
是为了 W简化的形式介绍将在W下【具体实施方式】中进一步描述的一些技术概念。本发明由权利要 求书限定,在本
【发明内容】
与权利要求书有冲突的情况下,应该W权利要求书为准。
[0007] 附图简述
[000引将参考附图给出更具体的描述。运些附图只示出了选定的方面,且因此不完全确 定任一示例的覆盖或范围。
[0009] 图1是示出包括至少一个处理器W及至少一个存储器的计算机系统W及示出操作 环境中可扩展超过多个网络节点的项并还示出一些经配置的存储介质的各方面的框图,其 中至少一个处理器和至少一个存储器在用于构建应用的可执行版本的软件的控制下和/或 在可执行应用软件的控制下相互交互;
[0010] 图2是进一步示出对象属性访问代码生成的各方面W及一些体系结构中的对象实 现的各方面的框图;
[0011] 图3是示出在属性访问的生成和/或执行中的一些过程的各步骤和一些经配置的 存储介质的流程图;
[0012] 图4是示出用于实现对对象字段(也称为对象属性)的访问的静态编译的各方面的 图;
[0013] 图5是示出单形态例程调用站的各方面的图;
[0014] 图6是示出多形态内联高速缓存(也称为PIC)的各方面的图;
[0015] 图7是示出多形态例程调用站的各方面的图;
[0016] 图8是示出对象、对象类型W及对象类型布局和对象属性访问等同性或缺乏对象 属性访问等同性的各方面的图;
[0017] 图9是示出针对对象属性访问优化的体系结构的各方面的数据流图;
[0018] 图10是示出等同类型高速缓存(也称为ETC)的各方面的图;
[0019]图11是示出属性等同性记录(也称为阳R)的各方面的图;
[0020] 图12是示出使用等同类型高速缓存来帮助优化对象属性访问的所发出的可执行 代码的行为和结构方面的数据流图;
[0021] 图13是示出使用经高速缓存的单形态属性访问简档数据来帮助优化属性访问的 可执行代码生成的行为和结构方面的数据流图;
[0022] 图14是示出多形态属性访问简档数据收集和使用的行为和结构方面的数据流图; W及
[0023] 图15是示出具有对等同类型高速缓存W及多形态属性访问简档数据的访问W提 供更加优化的属性访问的可执行代码生成过程的行为和结构方面的数据流图。
[0024] 详细描述
[00巧]首字母缩略词
[0026] -些首字母缩略词在W下被定义,但是其他首字母缩略词可在本文中的其他地方 定义或不要求被本领域技术人员理解的定义。
[0027] ALU:算术与逻辑单元
[002引 A0T:提前
[0029] API:应用程序接口
[0030] CD:压缩光盘
[00川 CPU:中央处理单元
[0032] DVD:数字多用盘或数字视频光盘
[0033] ECMA:欧洲计算机制造商协会,现在是国际Ecma
[0034] ETC:等同类型高速缓存
[0035] FPGA:现场可编程口阵列
[0036] FPU:浮点处理单元
[0037] GPU:图形处理单元
[0038] GUI:图形用户界面
[0039] IDE:集成开发环境,有时也称为"交互式开发环境"
[0040] ΙοΤ:物联网
[0041 ] IS0/IEC:国际标准化组织/国际电工委员会
[0042] JIT:即时
[00创阳R:属性等同性记录
[0044] PIC:多形态内联高速缓存
[0045] RAM:随机存取存储器
[0046] ROM:只读存储器
[0047] 概览
[0048] 在本文中描述的某些情况下,代码生成器可减少被生成来访问动态类型化的编程 语言中某一对象的属性的指令的数量。运种减少具有相应的效果,诸如针对所生成的代码 的降低的执行时间W及更小的所生成的代码,其进而减少处理器负载、功率使用W及代码 存储要求。动态类型化的编程语言的示例有许多并且一般对本领域技术人员而言是熟悉 的。也许当今最广泛使用的示例是被用在web浏览器和其他地方中的化vaScript语言;其是 在ECMA-262规范和IS0/IEC 16262中被标准化的ECMAScript化CMA脚本)语言的一个实现。
[0049] 本领域的技术人员意识到在有效地访问(加载和存储)用动态类型化的语言撰写 的程序中的属性方面存在挑战。JavaScript的执行性能受到重视,例如作为web浏览器供应 商之间竞争的一部分。
[0050] 产生在生成高效属性访问代码方面的挑战,因为动态类型化的程序中的对象缺乏 静态(在编译时)已知的结构(布局)。静态布局允许编译器发出简明的处理器指令来用于从 对象的存储器中加载属性值偏移/将属性值偏移存储到对象的存储器中。如图4中示出的, 针对一些程序的元数据402包括针对静态已知结构的类型布局信息,并且具体而言包括字 段偏移406,字段偏移406的值在程序运行之前在编译时是固定的Γ字段"和"属性"在本文 中互换地使用)。在运些情况下,编译器可生成直接将偏移作为特定常量数值来包括的代码 408,而非生成指令来在之后在所生成的程序代码运行的同时计算偏移。在编译时作为常量 被内嵌在所生成的代码中的偏移和其他值被称为"硬编码"。
[0051] 当偏移不是被硬编码时,属性的值在对象的存储器中的位置必须在每次该值将被 访问时在运行时被确定。运种属性访问的稚拙实现导致不可接受的开销,例如在基准测试 或消费者产品中的执行速度跌倒竞争者水平之下。因此,已经采用了各种技术来加速属性 访问。运些技术在本文中一般称为"优化",应当理解,优化不必是最佳的可能方式一其而是 改进某个可测量技术特征的方式,例如,优化是降低执行时间、减少代码大小、提高可靠性、 改进安全性和/或对某个其他有益技术效果进行贡献的方式。
[0052] 如果给定函数每次仅对一个且相同的对象进行操作,则该对象中属性的值的位置 (偏移)可在第一次访问时被高速缓存。在后续访问上,对属性的位置的计算可通过从高速 缓存中取得偏移来使用简单查找(其使得代码更快速)。运种方式可被扩展到共享相同布局 的多个对象。如果所有对象都标记有它们的布局ID(类型),则该类型可在第一访问上被存 储在高速缓存中,并且在后续访问上,经高速缓存的偏移可被使用。只要当前对象的类型匹 配被存储在高速缓存中的类型,运种方式就是安全的;运称为"单形态属性访问"。在运个上 下文中,"安全"意味着由针对属性访问的可执行代码访问的位将是可预测的并且将实际上 是开发者想要访问的位。换言之,如果执行产生与本领域的技术人员通过正确地手动模拟 源代码的执行所获得(尽管要慢的多且麻烦的多)的计算结果相同的计算结果,则从程序源 代码中生成的可执行代码在运个方面是"安全的"。
[0053] 图5示出其中被访问的属性在例程502中的特殊情况。类型防护504在运行时检查 对象的类型W确定该对象的类型是否与先前经高速缓存的类型相同。如果类型不匹配,贝U 执行相对昂贵的查找计算来找到正确例程主体的偏移。但是,如果当前对象的类型匹配先 前经高速缓存的类型,则控制传递到例程的主体506,即被调用的属性的主体。
[0054] 当所设及的对象不共享单个布局时,单形态访问方式不是安全的。有时多形态方 式是可行的。图7示出用于例程调用的多形态方式。多形态存根702针对已知(先前遇到的) 类型的短列表来测试当前对象的类型,并在找到匹配时,将控制传输到对应的位置,或在没 有找到匹配的情况下将控制传输到查找计算。关于对象属性访问,高速缓存可被使用来存 储类型集和对应的偏移,其中正在考虑的属性的值被存储在所遇到的每个类型布局的对象 上。运样的高速缓存实现针对相对小数量的布局的多形态属性访问,因为高速缓存的确添 加了程序存储要求。通过例如使用两个、四个或八个条目的高速缓存,可产生可接受的执行 加速,而也不增加可接受限制之外的存储器占用。可接受性取决于开发者和环境,但是在许 多开发环境中,可能组合的数量足够小来使得它们相应的技术影响的比较成为可能。
[0055] 多形态或单形态高速缓存可实质上加速属性访问,但是高速缓存依然带来了针对 每个个别属性访问来针对存储在高速缓存中的类型检查对象的类型的开销。
[0056] 现在考虑样本源代码,诸如W下:
[0化7]
[005引在运个示例源代码中,如在某些其他源代码片段中,函数中的属性访问序列设及 相同对象。该对象可W是例如局部变量或输入参数。在运样的情况下,属性访问代码可通过 将类型检查的数量减少到在该序列的开始处执行的单个检查来被进一步优化。如果编译器 可确定在编译期间所访问的对象的类型在访问的序列期间不能改变,则该优化将是安全 的。如果所有属性访问设及只有一个布局(类型)的对象(即,访问是单形态的),则将被找到 的序列中每个属性所处的偏移可在JIT编译时已知(例如,从内联高速缓存),并且编译器可 出于速度的目的使用内嵌的偏移常量来向对应的地址发出直接存储器加载或存储指令来 代替非直接属性访问代码,该非直接属性访问代码可包括在对象类型属性图中定位属性的 索引并且对于发出和执行而言更加昂贵。此外,针对属性访问序列的单个运行时检查的开 销可被遍布在潜在大量的属性访问上,从而使得它们中的每一个平均上更快。运种优化可 被成为"对象类型专口化"。
[0059] 然而,如果该序列中的属性访问设及不同布局的对象,则到不同布局的对象上被 相同命名的属性的偏移可W是不同的。在运些多形态情况中,正确的属性偏移在JIT编译期 间一般不是已知的,因为类型被动态地选择并且不同的类型具有不同的布局。由此,偏移不 能被直接内嵌在被JIT编译的代码中,即使对象的类型在该序列的开始处被验证。运导致对 于一般多形态属性访问序列而言对象类型专口化是不实际的。
[0060] 然而,如本文中教导的,针对运种序列的子集,依然可实现优化。即使不同的类型 具有不同的布局,但是在一些情况下,根据一个类型的给定属性的偏移将匹配另一类型的 被对应命名的属性的偏移。即,即使多个对象不共享相同的布局,但是它们可共享该布局的 一部分,使得一些属性可在两个对象上的对应偏移处被找到,即使运不是对于所有属性都 是真的。例如,对象〇a= {a,b,c,d,e,f,g}和对象ob={x,b,c,d,f,g}具有不同的类型,但是 它们的属性b、c和d可在相同的槽上被找到(分别是槽1、2和3),而属性a、e、f、g和X则不能。 注意,运个示例中的属性的公共子集不是对象上的第一属性;运些布局不具有共享的前缀。 由此,对象oa的类型ta和对象ob的类型tb针对属性b、c和d是偏移等同的,而是不针对所有 列出的其他属性偏移等同。偏移等同性是访问等同性的一种形式,区别在于访问等同性不 仅仅考虑偏移,还考虑属性存储的其他方面,诸如属性是否是可写的W及它们是否具有相 同的对象原型。换言之,被相同命名的属性可在两个类型中具有相同的偏移,该两个类型在 至少一个其他属性方面相互不同。特殊情况是,当在相同偏移处的两个被相同命名的属性 不是具有任一类型的第一属性时。图8显示另一示例,其中等同属性在注释中使用属性名称 之间的"=="被调出,而非等同属性在该注释中使用属性名称之间的"<〉"被调出。注意,在 一些情况下,所设及的对象不具有多个属性,但是优化依然可应用的并且可产生性能益处。
[0061] 通过确定访问等同性何时存在一W及还确定访问等同性何时不存在一编译器或 其他代码生成引擎可跨属性的在两个或更多个不同类型中被相同命名的实例来优化对该 属性的访问。可优化各种情况。优化可针对其类型布局具有共享前缀的对象来作出,但是共 享前缀不在每个情况下都需要。例如,在图8中没有共享前缀,因为布局ΤΥΡΙ槽0属性A不等 同于布局TYP2槽0属性P,即使A和P具有相同的偏移,运是因为A和P不是相同的属性。除了偏 移之外,本文中的一些示例还通过确定属性是否是局部的、属性是否是可写的、属性是否被 存储在辅助槽中和/或属性是否具有相同的对象原型W针对等同性来检查访问的其他方 面。运些确定W及本文中相关的技术可统一地、个别地或在子集中被成为等同对象类型专 口化。
[0062] 在等同对象类型专口化的一些示例中,编译器发出用于在在动态类型化的编程语 言中促进类型安全性的情况下访问对象的属性的直接访问代码。直接访问代码使用被硬编 码到对象的存储器区域内的偏移来访问属性的值。在一些情况下,直接访问代码在防护包 括至少一个在先访问在内的属性访问序列的单个类型检查后访问该值。在一些情况下,类 型检查代码将对象的类型与等同类型高速缓存的指定的防护类型进行比较。可通过使用与 等同类型高速缓存相关联的属性等同性记录来检查对象类型与等同类型高速缓存中的类 型的因属性而异的访问等同性。当类型关于一属性不是访问等同的时,通过发出用于访问 该属性的非直接访问代码来保持类型安全性。等同对象类型专口化可允许针对其类型关于 被用在序列中的属性访问等同的对象集,多形态属性序列与单形态属性序列一样高效地被 执行。
[0063] 示例的性质
[0064] 此处描述的某些示例可W在较宽泛的上下文中查看。例如,诸如高速缓存、编译、 动态类型化、硬编码、对象属性、偏移、多形态、序列、类型检查w及类型布局之类的概念可 与具体实施例相关。然而,并不能从宽泛上下文的可用性中得出此处对抽象概念寻求专有 权;它们并不是专有的。相反,本发明聚焦于提供适当具体的实施例,其技术效果完全或部 分地解决特定技术问题并改进计算机系统的功能。设及高速缓存、编译、动态类型化、硬编 码、对象属性、偏移、多形态、序列、类型检查和/或类型布局的其他介质、系统和方法在本范 围之外。因此,在对本发明的正确理解下,也避免了模糊性、抽象性、缺少技术性和附带的证 据问题。
[0065] 本文描述的实施例的技术特征对于本领域技术人员而言将显而易见,并且对于各 种关注的读者而言也W各种方式显而易见。第一,一些实施例解决技术问题,诸如对类型检 查动态选择的类型的执行性能花费、代码优化、类型等同性确定、单形态属性访问机制的缺 点W及无论类型布局的改变而保存类型安全性和性能两者。第二,一些实施例包括诸如计 算硬件等技术组件,运些技术组件W除了通用计算机中的典型交互之外的方式与软件交 互。例如,除了诸如一般的存储器分配、一般的存储器读写、一般的指令执行和某种I/O排序 等普通交互之外,本文描述的一些实施例还用单个初始类型检查来防护对象属性访问序 列。第Ξ,一些实施例所提供的技术效果包括在类型检查数量方面的减少而没有在类型安 全性方面的对应减少、减少的可执行代码指令分段大小和/或增加的ECMAScript兼容语言 的执行速度。第四,一些实施例包括技术适应,诸如等同类型高速缓存、属性等同性记录W 及使用属性访问简档数据来在直接和非直接访问代码发出之间进行选择的代码生成器。
[0066] 此外,一些实施例设及提供对动态类型化的编程语言中的对象的属性的快速且类 型安全的访问的技术问题。一些实施例设及标识在整体具有不同布局的对象类型内访问等 同的各个属性的技术问题。一些实施例设及跟踪属性访问序列的技术问题,属性访问序列 可通过减少类型检查的同时没有从而错认哪个数据类型旨在针对被访问的位而被优化。本 公开的各示例中所设及的其他技术问题对于本领域的技术人员而言也将是明显的。
[0067] 一些术语
[0068] 现在将参考诸如附图中所示出的那些示例性实施例,并使用特定语言来对其进行 描述。但是,相关技术领域的且拥有本公开内容的技术人员将想到的对此处所示出的特征 的更改和进一步的修改W及对此处的特定实施例所示的抽象原理的其他技术应用,都应该 被视为在权利要求的范围内。
[0069] 在本公开中阐明了各术语的含义,因此应该在仔细关注运些阐明的情况下阅读权 利要求书。给出了具体示例,但是相关领域的技术人员将理解其他示例也可落在所使用的 术语的含义范围内W及落在一个或多个权利要求的范围内。各术语不一定需要具有与它们 在一般使用中(尤其在非技术使用中)或在特定行业使用中、或在特定字典或一组字典的使 用中所具有的意义相同的意义。附图标记可W与各种措词一起使用,W帮助示出术语的广 度。从给定文本片段中省略附图标记不一定意味着没有通过文本讨论附图的内容。
【发明人】 维护和行使对于他们自己的辞典编纂的权利,包括将语言从本文中的其他位置复制到权利 要求书中的权利。所引用的术语被显式定义,但在隐式定义术语时不使用引用标记。运里可 在【具体实施方式】中和/或在申请文件的别处显式地或隐式地定义术语。
[0070] 如此处所使用的,"计算机系统"可包括例如一个或多个服务器、主板、处理节点、 个人计算机(便携式或非便携式)、个人数字助理、智能电话、蜂窝或移动电话、至少具有处 理器和存储器的其他移动设备、和/或提供至少部分地由指令来控制的一个或多个处理器 的其他设备。指令可W采用存储器中的固件或其他软件和/或专用电路的形式。具体而言, 虽然可发生许多实施例在工作站或膝上型计算机上运行,但是其他实施例也可W在其他计 算设备上运行,并且任何一个或多个运样的设备都可W是给定实施例的一部分。
[0071] "多线程化"计算机系统是支持多个执行线程的计算机系统。术语"线程"应被理解 为包括能够或经历调度及可能同步)的任何代码,并且也可W另一名称来为人所知,如 "任务"、"进程"或"协同例程"等。线程可W并行地、按顺序、或W并行执行(例如,多处理)和 顺序执行(例如,时间分片)的组合来运行。在各种配置中都已设计了多线程化环境。执行线 程可W并行地运行,或者线程可W被组织为并行执行,但是实际上轮流按顺序执行。例如, 多线程化可W通过在多处理环境中在不同核上运行不同线程、通过对单个处理器核上的不 同线程进行时间分片、或者通过时间分片和多处理器线程化的某种组合来实现。线程上下 文切换可W例如由内核的线程调度器、由用户空间信号、或由用户空间和内核操作的组合 来发起。线程可W轮流对共享数据进行操作,或者例如每一线程都可W对其自己的数据进 行操作。
[0072] "逻辑处理器"或"处理器"是单个独立硬件线程处理单元,如同时多线程实现中的 核。作为另一示例,每核运行两个线程的超线程四核忍片具有8个逻辑处理器。逻辑处理器 包括硬件。术语"逻辑"被用来防止给定忍片具有至多一个处理器的错误结论;"逻辑处理 器"和"处理器"在此可互换地使用。处理器可W是通用的,或者它们可被定制用于特定用 途,例如图形处理、信号处理、浮点算术处理、加密、I/O处理等等。
[0073] "多处理器"计算机系统是具有多个逻辑处理器的计算机系统。多处理器环境存在 于各种配置中。在一给定配置中,所有处理器可在功能上相同,而在另一配置中,由于具有 不同的硬件能力、不同的软件分配或两者,某些处理器可与其他处理器不同。取决于配置, 处理器可在单个总线上紧密地彼此禪合,或它们可松散地禪合。在某些配置中,处理器共享 一中央存储器,在某些配置中,它们各自具有自己的本地存储器,在某些配置中,存在共享 和本地存储器两者。
[0074] "内核"包括操作系统、系统管理程序、虚拟机、BIOS代码、W及类似的硬件接口软 件。
[0075] "代码"指的是处理器指令、数据(包括常量、变量、W及数据结构)、或指令和数据 两者。
[0076] "程序"在本文中被广泛地使用W包括应用、内核、驱动程序、中断处理程序、库、W 及程序员(也被成为开发者)编写的其他代码。
[0077] "i〇r或"物联网"指可寻址的内嵌的计算节点的任意联网集合。运样的节点是如 本文中定义的计算机系统的示例,但是它们还具有W下特征中的至少两个:(a)没有本地人 类可读显示;(2)没有本地键盘;(C)输入的主要源是跟踪非语言数据的源的传感器;(d)没 有本地转动盘存储一RAM片或ROM片仅提供本地存储器;(e)没有CD或DVD驱动器;(f)内嵌在 家用电器中;(g)内嵌在植入式医疗设备中;化)内嵌在车辆中;(i)内嵌在过程自动化控制 系统中;或(j)聚焦于W下之一的设计:环境监视、市政基础设施监视、工业设备监视、能源 使用监视、人类或动物健康监视或物流运输监视。
[0078] 如此处所使用的"包括"允许附加元素(即,包括意味着包含),除非另外指明。 "由...构服'意味着基本上由...构成或完全由...构成。当X中的非Υ部分(如果有的话)可 W被自由更改、移除和/或添加而不在考虑所述权利要求时更改所要求保护的实施例的功 能时,X基本上由Y构成。
[0079] "进程"在此有时被用作计算科学领域的术语,并且在该技术意义上涵盖资源使用 者,即例如协同例程、线程、任务、中断处理程序、应用进程、内科进程、过程和对象方法。"进 程"在此还可被用作本领域的专利法术语,例如,在描述与系统权利要求或制品(经配置的 存储介质权利要求)相对的过程权利要求时。类似地,"方法"在此有时被用作计算科学领域 内的技术术语(一种"例程")并且还被用作本领域的专利法术语Γ过程")。技术人员将理解 在特定实例中旨在是什么含义,并且还将理解给定所要求保护的过程或方法(在专利法的 意义上)有时可使用一个或多个过程或方法(在计算科学意义上)来实现。
[0080] "自动地"指的是使用自动化(例如,由用于运里所讨论的特定操作和技术效果的 软件配置的通用计算硬件),与没有自动化相对。具体而言,"自动"执行的步骤在理论上或 在一个人的意识中不是用手执行的,但运些步骤可由人类来启动或由人类来交互式地引 导。自动化步骤使用机器执行的W获得在没有由此提供的技术交互的情况下将不会实现的 一个或多个技术效果。
[0081] 技术人员理解技术效果是技术实施例的假定目标。仅仅是在一实施例中设及计算 并且运些计算也可W在没有技术组件(例如,通过纸和笔或甚至作为脑力步骤)的情况下执 行的事实不会移除技术效果的存在或更改该实施例的具体且技术的特性。本领域的技术人 员会意识到,在一些情况下,计算就是不能通过脑力步骤或通过纸和笔被足够快速且足够 可靠地执行来提供一实施例的技术效果。
[0082] "在计算上"同样指的是使用计算设备(至少是处理器加上存储器),且排除了仅通 过人类思考或仅通过单独的人类动作而获得结果。例如,用纸和笔作算术不是如本文所理 解的在计算上作算术。计算结果更快、更宽泛、更深、更准确、更一致、更全面和/或W其他方 式提供超出单独的人类表现范围的技术效果。"计算步骤"是通过计算执行的步骤。然而, "自动地"和巧计算上"都不一定意味着"立即"。巧计算上"和"自动册'在此可互换地使 用。
[0083] "抢先式"意味着没有来自用户的直接请求。的确,用户甚至可能直到已经向该用 户呈现一实施例中的抢先式步骤的结果才意识到该步骤是可能的。除非另外指明,否则此 处描述的任何计算和/或自动化步骤都可W被抢先完成。
[0084] "语言上"表示,通过使用自然语言或通常在面对面人类对人类通信中采用的另一 种形式的通信。语言上通信包括例如,说出、键入、或用一个人的手指、手部、面部和/或身体 来作出姿势。
[0085] 贯穿本文,对任选复数"(诸Γ的使用意味着一个或多个所指示的特征存在。例如, "(诸)处理器"意味着"一个或多个处理器"或等效于"至少一个处理器"。
[0086] 贯穿本文,除非另外明确表明,否则对过程中的某一步骤的任何引用都假定该步 骤可直接由所关注的一方执行和/或由该方通过介入机制和/或介入实体而间接地执行,且 仍然在该步骤的范围内。也就是说,除非直接执行是被明确表明的要求,否则并不要求由关 注方对步骤的直接执行。例如,设及由所讨论的一方执行的诸如相对于一目的地或其他主 体的访问、避免、检查、比较、创建、确定、发出、执行、生成、防护、加载、定位、运行、存储、更 新、使用(w及访问、被访问的等)等动作的步骤可设及中间动作,如由某一其他方执行的转 发、复制、上传、下载、编码、解码、压缩、解压、加密、加密、认证、调用等,但仍然被理解为是 由该所讨论的一方直接执行的。
[0087] 在参考数据或指令时,要理解运些项配置了计算机可读存储器和/或计算机可读 存储介质,从而将其变换为特定物品,而非简单地存在于纸张上、人的头脑中、或仅仅作为 例如传播的信号。除非在权利要求中另外指明,否则权利要求不涵盖信号本身。出于美国专 利审查的目的,存储器、计算机可读存储介质和任意其他计算机可读介质不是美国专利商 标局化SPT0)对In re Nui jten案例的解释下的可授予专利的主题的范围之外的传播信号 或载波。
[0088] 此外,尽管与本文中的其他地方明显相反,但将理解一方面的(a)计算机可读存储 介质、计算机可读介质和计算机可读存储器,和另一方面的(b)也被称为信号介质或传播的 信号的传输介质之间的清楚区别。传输介质是传播信号或载波介质。相反,计算机可读介 质、计算机可读存储介质和计算机可读存储器不是传播信号或载波介质。除非另外声明,否 则"计算机可读介质"意味着计算机可读存储介质,而不是传播信号本身。
[0089] 本文中的一"实施例"是一示例。术语"实施例"与"本发邸'不是可互换的;它们中 没有一个是术语"示例"。各实施例可自由地共享或借用各方面来创建其他实施例(产生的 结果是可操作的),即使所产生的方面组合本身在本文中没有被明确描述。要求每个W及每 次许可的组合被显式地描述对于本领域的技术人员而言不是不要的,并且将会与表明到专 利说明书是针对本领域的技术人员而写的策略相反。关于从即使少量的可组合特征中得出 的可能组合的数量的正规组合性计算和非正规通用直觉也将指示针对本文描述的各方面 存在大量的方面组合。因此,要求对每个W及每次组合的显式详述将与要求专利说明书简 洁且要求读者具有本技术领域的知识的策略相反。
[0090] 操作环境
[0091] 参考图1,用于一个实施例的操作环境100可包括计算机系统102。计算机系统102 可W是多处理器计算机系统,或者也可W不是。操作环境可包括给定计算机系统中的一个 或多个机器,它们可W群集的、客户机-服务器联网的、和/或对等联网的。个体机器是一计 算机系统,且一组协同操作的机器也是计算机系统。给定计算机系统102可W例如用应用被 配置用于最终用户、用于管理员、作为服务器、作为分布式处理节点、作为ΙοΤ节点和/或W 其他方式配置。
[0092] 人类用户104可W经由键入的文本、触摸、语音、移动、计算机视觉、姿势和/或其它 形式的1/0,通过使用显示器、键盘和其它外围设备106来与计算机系统102交互。用户界面 可支持实施例和一个或多个人类用户之间的交互。用户界面可包括命令行界面、图形用户 界面(GUI)、自然用户界面(NUI)、语音命令界面和/或其它界面呈现。用户界面可W在本地 台式计算机或例如智能电话上生成,或者它可W从web服务器生成并被发送到客户机。用户 界面可被生成为服务的一部分并且它可W与诸如社交网络服务等其它服务集成。给定操作 环境包括支持运些不同的用户界面生成选项和使用的设备和基础结构。
[0093] 例如,自然用户界面(NUI)操作可使用例如语音识别、触摸和指示笔识别、屏幕上 和屏幕附近的姿势识别、空中姿势、头部和眼睛跟踪、话音和语音、视觉、触摸、姿势、和/或 机器智能的那些方法。NUI技术的一些示例包括触敏显示、话音和语音识别、意图和目的理 解、使用深度相机(如立体相机系统、红外相机系统、RGB相机系统、W及运些的组合)的运动 姿势检测、使用加速度计/巧螺仪的运动姿势检测、面部识别、3D显示、头部、眼睛和注视跟 踪、浸入式增强现实和虚拟现实系统,所有运些都提供更自然的接口,W及用于使用电场传 感电极(脑电仪和相关工具)的传感大脑活动的技术。
[0094] 作为另一示例,游戏可W驻留在Microsoft XBOXLive? (微软公司的商标)服务器 或其他游戏服务器上。游戏可从控制台购买或者整体或部分在服务器上、在控制台上、或在 两者上执行。多个用户可W使用标准控制器、空中姿势、语音或使用诸如智能电话或平板等 附随设备来与该游戏交互。给定操作环境包括支持运些不同的使用场景的设备和基础结 构。
[00M]系统管理员、开发人员、工程技术人员、W及最终用户各自都是特定类型的用户 104。代表一个或多个人操作的自动化代理、脚本、回放软件等也可W是用户104。在某些实 施例中,存储设备和/或联网设备可W被认为是外围设备。图1中未示出的其他计算机系统 可W按各技术方式与计算机系统102进行交互,或者例如通过网络接口设备使用到网络108 的一个或多个连接与另一系统实施例进行交互。
[0096] 计算机系统102包括至少一个逻辑处理器110。计算机系统102与其他合适的系统 一样,还包括一个或多个计算机可读存储介质112。介质112可W是不同的物理类型。介质 112可W是易失性存储器、非易失性存储器、被安装就位的介质、可移动介质、磁介质、光学 介质、固态介质和/或其他类型的物理可持续介质(而不仅仅是传播信号)。具体而言,诸如 便携式(即外置)硬盘驱动器、CD、DVD、记忆棒、或其他可移动非易失性存储器介质之类的经 配置的介质114在被插入或W其他方式安装时可W在功能上变为计算机系统的技术部分, 从而使其内容可被访问W供与处理器110交互并由处理器110使用。可移动的经配置的介质 114是计算机可读存储介质112的示例。计算机可读存储介质112的某些其他示例包括内置 RAM、R0M、硬盘、W及其他不能被用户104轻松地移走的存储器存储设备。为了符合当前美国 专利要求,计算机可读介质、计算机可读存储介质和而计算机可读存储器都不是信号本身。
[0097] 介质114用可由处理器110执行的指令116来配置;"可执行"在此W宽泛的意义被 使用W包括机器代码、可解释代码、字节码和/或在例如虚拟机上运行的代码。介质114还被 配置有数据118,该数据通过指令116的执行被创建、修改、引用和/或W别的方式用于技术 效果。指令116和数据118配置它们所驻留的存储器或其它存储介质114;当该存储器或其它 计算机可读存储介质是给定计算机系统的功能部分时,指令116和数据118还配置该计算机 系统。在某些实施例中,数据118的一部分代表了诸如产品特征、清单、物理测量值、设定、图 像、读数、目标、卷等等之类的现实世界的项。运一数据还通过备份、还原、提交、中止、重新 格式化和/或其它技术操作来变换。
[0098] 尽管一实施例可被描述为被实现为由计算设备(例如通用计算机、蜂窝电话、或游 戏控制台)中的一个或多个处理器执行的软件指令,但运一描述并非意味着穷尽所有可能 的实施例。技术人员将会理解还可经常整体地或部分地直接用硬件逻辑来实现相同或相似 功能,W提供相同或相似的技术效果。作为对软件实现的替换或补充,本文描述的技术功能 可W至少部分地由一个或多个硬件逻辑组件来执行。作为示例并且不排除其它实现,一实 施例可包括硬件逻辑组件,诸如现场可编程口阵列(FPGA)、专用集成电路(ASIC)、专用标准 产品(ASSP)、片上系统组件(S0C)、复杂可编程逻辑器件(C化D)和类似组件。一实施例的组 件可基于它们的输入、输出和/或它们的技术效果来被分组成各个交互功能模块。
[0099] 在示出的环境100中,一个或多个应用120具有代码(诸如源代码122和可执行代码 124),其包括对象126、例程128W及其他构造(有时成为"人工产物")。源122用一个或多个 编程语言130来撰写。从具有给定编程语言130的源中创建的可执行代码有时被称为具有该 语言130,但是可执行代码被理解为包括机器代码。如本文中使用的,"机器代码"表示低层 代码或针对特定硬件体系结构定制的或针对特定虚拟机体系结构定制的计算机代码。一些 机器代码的熟悉示例包括经编译的代码、微代码、固件代码、二进制代码、本机代码、对象代 码、汇编语言代码、P-代码、字节代码、动态链接库代码W及常见的中间语言代码。
[0100] 如指示的,一些环境100包括通过产生和/或转换代码122、124来协助软件开发的 软件开发工具132,诸如编译器134、解释器136W及调试器137。代码122、124、工具121、W及 图中和本文中讨论的其他项可各自部分或全部驻留于一个或多个硬件介质112中,由此配 置那些介质W实现所有硬件-软件合作操作中固有的"正常"(即,最小公分母)交互的技术 效果。除了处理器11〇(〔?1]、4〇]少?1]和/或0?1])、存储器/存储介质112、显示器138和电池之 外,操作环境还可包括其它硬件,诸如总线、电源、有线和无线网络接口卡和加速度计,运些 硬件的各自操作在此被描述为并非已经对技术人员显而易见。
[0101] 给定操作环境100可包括向开发者提供一组协调的软件开发工具132(诸如A0T编 译器、J 口编译器、源代码编辑器、剖析器、调试器等)的集成开发环境(IDE)140,。具体而言, 对于一些实施例,合适的操作环境中的一些包括或帮助创建被配置成支持程序开发的 Microsof昨Visual Studio?开发环境(微软公司的商标)。一些合适的操作环境包括 Java?环境(Oracle America有限公司的商标),并且一些操作环境包括利用诸如C++或C# rC-Sharp")等语言的环境,但本文的教导适用于各种各样的程序设计语言、程序设计模 型、W及程序,W及本质上适用于软件开发领域之外的使用内联的技术努力。
[0102] 在附图中W轮廓形式示出了一个或多个项来强调它们不一定是所示操作环境或 所有实施例的一部分,但是可W与此处讨论的操作环境或一些实施例中的各项互操作。未 采用轮廓形式的项在任何附图或任何实施例中也不一定是必需的。具体而言,图1是为了方 便而提供的;在图1中包括一项目不暗示该项目或对该项目的描述使用在本发明之前是已 知的。
[0103] 技术人员将认识到此处在"操作环境"下呈现的上述各方面和其它方面还可形成 给定实施例的一部分。本文的标题不旨在提供将特征严格地归类成实施例和非实施例特征 类别。
[0104] 系统
[0105] 图9示出一些系统102的一个整体视图。框902表示代码执行和简档收集。执行可包 括例如,运行二进制代码、解释字节代码和执行经JIT编译的代码。简档收集包括收集关于 在对象属性204加载和存储期间遇到的类型的信息W及将该信息聚集到多形态内联高速缓 存246和/或其他多形态属性访问简档232内。属性访问可作为单形态访问开始,其中每个访 问包括类型检查、加载偏移W及接着加载或存储在该偏移处的值。根据框904,优化可移除 一些类型检查和/或移除一些偏移加载,而不减少类型安全性。优化可利用等同类型高速缓 存238和其他结构来产生经优化的代码124,该经优化的代码124包括例如直接属性访问代 码224来代替非直接代码228。根据框906,经优化的代码作为应用120的一部分来执行。Web 浏览器w及由它们作为插件或w其他方式运行的脚本或其他代码是应用的示例。
[0106] 图2示出了适合与一些实施例一起使用的体系结构的各方面。代码生成器202通常 位于编译器134内。编译器可在一个机器上,而代码生成器的输出形成不同机器上的应用 120的一部分。代码生成器202输出尤其包括用于访问对象属性204的可执行代码124的片 段,称为属性访问206。属性访问206可被执行其他操作的代码122、124加括号,或属性访问 206可在属性访问206序列208中。任一给定属性访问在存储器112区域216中读或写属性值 210。值210可被读取来用在计算(诸如加法)或字符串打印中,或者它们可作为调用属性(其 是对象方法)的一部分来被读取。读取值的访问206有时被称为"加载",而将值写入到对象 属性内的那些访问有时被称为"存储"。
[0107] 在一些示例中,对象126具有定义的类型212,其定义对该对象所许可的操作。类型 212还隐式地或显式地定义布局214,其在一给定实现中指定存储器112中对象属性的次序、 大小和相互关系。布局214可指定一些属性值被存储在属性头部218中,而其他属性值被存 储在例如由头部条目指向的位置处,或者值可被存储在辅助阵列244中。在一给定实现中, 每个属性204被分派存储器112中的特定数量的位或字节,并且不同的属性可被分派不同量 的存储器。当一给定属性所占据的存储器的实际大小不是讨论的重点时,被分派到该给定 属性的存储器有时被称为该属性的槽220。槽通常W0开始编号,但是一些开发者开始对 它们进行编号。对象布局214也可从对象原型222继承或被对象原型222影响。
[0108] 在一些示例中,代码生成器202输出包括用于访问对象属性204的具有被硬编码的 偏移226的直接访问代码224,并且在一些情况下,代码生成器202输出包括用于访问对象属 性204的非直接代码228。直接访问代码224比非直接访问代码228更快(有时一个数量级或 更快)。直接访问代码224假设先前被硬编码的偏移226依然是正确的,而非直接访问代码 228计算当前偏移。
[0109] 在一些示例中,代码生成器202在发出直接访问代码224和发出非直接访问代码 228之间进行选择来实现正被编译的给定属性访问206。如本文中详细解释的,在一些情况 下,在直接和非直接属性访问代码之间的选择基于W下中的一个或多个,或使用W下中的 一个或多个来实现所选的代码:可尤其被实现为一种多形态内联高速缓存246(又称PIC 246)的多形态属性访问简档232中的类型212集230、属性索引234、等同类型高速缓存238的 条目236、属性等同性记录240的条目236、编译器值表242中的类型212集230。
[0110] -些实施例向计算机系统102提供由电路系统、固件和/软件配置的用于提供诸如 本文中描述的使用直接访问代码224来代替非直接代码228的技术效果的逻辑处理器110和 存储器介质112。在一个示例中,被配置用于生成和执行针对动态类型化的编程语言中的属 性访问的机器代码的系统102包括至少一个处理器now及与处理器可操作上通信的存储 器112。系统102还包括W下各项中的至少一者:直接访问代码生成器202、所生成的直接访 问代码224或属性等同性记录240。一些系统既包括直接访问代码生成器202也包括所生成 的直接访问代码224。一些系统包括直接访问代码生成器202、所生成的直接访问代码224W 及属性等同性记录240。
[0111] 在一些示例中,直接访问代码生成器202发出针对属性访问206的直接访问代码 224 W访问对象126的属性204。对象126具有类型212。直接访问代码224在W下条件被满足 时被发出:在对应于该属性访问的多形态内联高速缓存246中标识的类型212是等同的,W 及从多形态内量高速缓存中检索的类型集230和与编译器134值表242中的对象的类型相关 联的类型集230相匹配。熟悉的机制可被用于从编译器的元数据集合中检索类型集230。
[0112] 图6示出多形态内联高速缓存246的示例,伴随有类型212被实现为指向布局结构 (参见例如图8中的布局结构TYP1和TYP2)的存储器地址W及伴随有进入到属性位置图内的 属性索引234。多形态内联高速缓存246与给定属性访问206相关联。在条目0,例如,如果对 象a来自具有类型typO的示例源代码,则针对a的布局结构在地址0X1FFA0240处并且对象a 的属性X位于槽2中。在一些实现中,PIC 246具有可变大小,诸如具有4到32个条目236,并且 在一些实现中,PIC条目的数量由编译器基于在应用120的执行期间遇到的对象类型的数量 和分布来调整。多形态内联高速缓存246是多形态访问简档232的阵列实现的示例。出于公 开范围的目的,本文中的任何描述可被认为已经用替代于"多形态内联高速缓存"的"多形 态访问简档"或其等价体"多形态属性访问简档"来重复,并且附图标记相应地从246改到 232,或反之亦然。
[0113] 在一些示例中,多形态内联高速缓存246条目236包括属性索引234。在操作中,与 给定属性访问206相关联的多形态内联高速缓存中的类型212仅在确定该多形态内联高速 缓存的所有条目都包括与该多形态内联高速缓存的第一个条目相同的属性索引之后才被 确定为等同的。在一些示例中,与给定属性访问206相关联的多形态内联高速缓存中的类型 212仅在确定W下条件之一被确切地满足之后才被确定为等同的:该多形态内联高速缓存 中的所有类型都描述包括该给定属性的对象126,或该多形态内联高速缓存中的所有类型 描述共享原型222的对象126并且该原型包括该给定属性204。在一些示例中,与给定属性访 问206相关联的多形态内联高速缓存中的类型212仅在确定W下条件之一被确切地满足之 后才被确定为等同的:该多形态内联高速缓存中的所有类型都描述在对象的头部218上的 槽220中具有该给定属性的值的对象126,或该多形态内联高速缓存中的所有类型都描述在 对象的辅助槽阵列244上的槽中具有该给定属性的值的对象。
[0114] 在一些示例中,系统102包括针对属性访问的用于访问对象126的属性的所生成的 直接访问代码224,并且属性访问206是属于属性访问序列208的非直接访问。对象具有类型 212W及所分派的存储器区域216。直接访问代码224在被处理器110执行之际访问位于对象 的存储器区域216中被硬编码的偏移226处的属性204的值210。直接访问代码224在W下方 面被优化:其在比较类型检查确定对象的类型212匹配与属性访问序列208相关联的等同类 型高速缓存238化TC 238)中的条目236之后访问该值,而不需要进一步的类型检查。
[0115] 图10示出具有固定大小阵列形式的ETC 238的一示例实现,该固定大小阵列具有 针对8个条目的空间,8个条目中的每一个是类型标识符(即类型布局214的存储器地址)的 大小。在其他实现中,不同数量的条目236被用在ETC 238中,例如4个条目、12个条目、16个 条目或另一数量。ETC 238在编译期间被创建但在执行期间被使用。在一些实施例中,其不 被存储在机器代码可执行文件中,而是被维护在运行时系统数据结构中。ETC 238的第一个 条目236被用作防护类型,而其他条目具有附加经高速缓存的类型212。
[0116] 在一些示例中,所生成的直接访问代码224包括动态类型属性访问206序列208,所 有动态类型属性访问206由使用例如图10的ETC 238防护类型1002的单个类型检查来防护。 W上具有函数fooO的示例源代码是具有动态类型属性访问206序列206的多个可能源代码 122之一。针对运样的代码的简档232数据收集可使用熟悉的机制来实现。示出的简档访问 在对象a具有在运行时被分配的不同类型的意义上、在对象b具有在运行时被分配的不同类 型的意义上和/或在对象a的类型在布局上与对象b的类型不同的意义上可W是多形态的。 访问206中的每一个具有其自己的相关联的PIC 246;访问206在源中被a. X.、b. X、a. y和b. y 来表示。
[0117] 在一些示例中,所生成的直接访问代码224包括不同类型212的对象的所访问的属 性的属性访问206序列,并且运些类型212在布局2 214方面与所访问的属性是等同的。运可 例如在W下条件之一被确切地满足时发生:所有所访问的属性204是局部属性,或每个所访 问的属性204来自原型222并且所有所访问的属性来自该相同原型。在一些示例中,所生成 的直接访问代码224包括不同类型212的对象126的所访问的属性的属性访问序列,并且属 性访问206全部内联(例如,在头部中218或可不需要通过指针的间接来访问)或者它们全部 在辅助槽阵列244中。
[0118] 在一些示例中,系统102包括属性等同性记录240,其针对被单个类型检查防护的 属性访问序列208中的每个属性访问206具有一个条目236。图11示出属性等同性记录240的 一个示例实现,其可适合于其中对象属性204可被指定为可写或不可写W及其中对象属性 可被内联地存储或存储在辅助阵列244中的环境100。在其他示例中,如果所有属性都是可 写的,则用于跟踪属性是否是可写的列可被移除。类似地,在其他示例中,如果所有属性被 内联地存储,则用于跟踪属性值是否被存储在辅助阵列244的槽中的列可被移除。
[0119] 在一些实现中,每个属性访问206都具有一个属性等同性记录240,其中显式类型 检查被用于该访问W确保类型安全性。属性等同性记录240针对被单个类型检查所防护的 给定访问序列中的每个属性访问具有一个条目。由此,在初始访问206后,属性等同性记录 240帮助保护对该序列中相同对象的后续访问。例如,在样本源代码中,如果a. X和a. y访问 对象a的相同类型的属性,则一个优化避免(忽略、跳过)在检查已经对访问a.X作出之后对 访问a.y的类型检查。
[0120] 在某些实施例中,诸如人类用户I/O设备(屏幕、键盘、鼠标、图形输入板、话筒、扬 声器、运动传感器等等)之类的外围设备106将可W在操作上与一个或多个处理器110和存 储器进行通信。然而,一实施例也可W深嵌入在诸如物联网的一部分等的技术系统中,W便 没有人类用户104直接地且与语言上该实施例进行交互。软件进程可W是用户104。
[0121] 在某些实施例中,该系统包括通过网络连接的多个计算机或其他设备102。网络接 口设备可W使用例如诸如分组交换网络接口卡、无线收发机或电话网络接口之类的组件提 供对网络108的接入,并可存在于给定计算机系统中。然而,一实施例也可W通过直接存储 器存取、可移动非易失性介质、或其他信息存储-检索和/或传输方法来传递技术数据和/或 技术指令,或者,计算机系统中的一实施例可W在不与其他计算机系统进行通信的情况下 操作。
[0122] 某些实施例在"云"计算环境和/或"云"存储环境中操作,其中计算服务不是自有 的,而是按需提供的。例如,代码生成器202可在联网云中的一个设备/系统102上发出代码 224、228,并且包括该代码的应用120的副本可被存储在该云内的其他设备上。
[0123] 过程
[0124] 图3用流程图300示出了某些过程实施例。各附图中示出或W其他方式公开的技术 过程可W在某些实施例中(例如通过编译器代码生成器202)自动执行,例如在脚本的控制 下或w其他方式需要极少或不需要同时的实况用户输入。除非另外指明,否则过程也可w 部分自动地且部分手动地执行。在一给定实施例中,可W重复过程的零个或更多个所示出 的步骤,有可能利用不同的参数或数据来操作。一实施例中的步骤也可W按照与图3中展示 的自顶向下次序不同的次序来执行。步骤可W串行地、W部分重叠的方式、或完全并行地执 行。遍历流程图300W指出在过程中执行的步骤的次序可W在过程的一次执行与该过程的 另一次执行之间不同。流程图遍历次序也可W在一个过程实施例与另一过程实施例之间不 同。各步骤还可W被省略、组合、重命名、重组、或W其他方式偏离所示出的流程,只要所执 行的过程是可操作的,并符合至少一个权利要求。
[0125] 此处提供了帮助示出该技术的各方面的示例,但是在本文内给出的示例并未描述 所有可能的实施例。实施例不仅限于此处所提供的具体实现、布置、显示、特征、方法或情 形。给定实施例可包括例如附加的或不同的技术特征、机制、和/或数据结构,并可别的 方式偏离此处所提供的示例。
[0126] 在一些示例中,提供用于使用等同对象类型专口化来执行动态类型化的编程语言 中的属性访问序列的算法过程。例如,该过程可执行至少两个全部被单个检查类型所防护 的动态类型属性访问的序列。
[0127] 在一些情况下,过程运行304代码,该代码使用314 ETC 238通过将对象类型212与 等同类型高速缓存238的指定的防护类型1002进行比较来进行类型检查。当对象类型等于 指定的防护类型时,接着无需运行进一步的类型检查代码320(从而避免%2类型检查开 销),过程执行代码224,该代码224访问324被硬编码到对象的存储器112、216内的偏移226 处的属性的值。当对象类型不等于指定的防护类型时,过程运行318类型检查比较代码320, 其将对象类型212与等同类型高速缓存238的至少一个次级(非初始)条目236进行比较。当 类型检查比较代码320确定330对象类型匹配等同类型高速缓存中的任一条目时,接着无需 运行进一步的类型检查代码(从而避免342开销),过程执行针对属性访问序列208的代码, 其中每个属性访问加载属性值或存储属性值,并且其中每个非初始属性访问访问被硬编码 到对象的存储器内的偏移处的位置。当类型检查比较代码确定330对象类型不与等同类型 高速缓存中的任意条目匹配时,过程执行代码,该代码确定328对象类型是否等同于关于所 访问的属性的等同类型高速缓存中的类型。该确定328使用340与等同类型高速缓存相关联 的属性等同性记录来进行。
[0128] 在一些示例中,过程通过插入在类型检查比较代码320的执行期间没有被初始地 发现在等同类型高速缓存的任意条目中的对象类型212来更新346等同类型高速缓存。
[0129] 在一些示例中,过程将多个属性访问206执行到不同类型的对象126中,但是所有 对象针对所访问的属性是等同的。不同的类型具有不同的布局214,并且布局不必在相同的 偏移处具有被相同命名的属性的任意共享的前缀。在一些情况下,所访问324的属性204全 部是局部的或它们全部来自相同的原型。在一些情况中,所访问的属性全部内联在对象的 头部218中,或所访问的属性全部在对象的辅助槽阵列244中。
[0130] 经配置的介质
[0131] -些实施例包括经配置的计算机可读存储介质112。介质112可包括盘(磁盘、光 盘,或其他)、RAM、邸PROM或其他ROM、和/或其他可配置存储器,特别包括计算机可读介质 (而不仅仅是传播信号)。经配置的存储介质可W特别地是诸如CD、DVD或闪存之类的可移动 存储介质114。可W是可移动的或不可移动的且可W是易失性的或非易失性的通用存储器 可被配置到使用诸如经优化的代码生成器202、ETC 238、和阳R 240等项目的实施例中来形 成配置的介质,运些项目采用从可移动介质114和/或诸如网络连接等另一源读取的数据 118和指令116的形式。
[0132] 经配置的介质112能够使计算机系统执行本文所述的用于属性访问代码优化的技 术过程步骤。由此,附图1、2、6、8和9-11帮助示出了经配置的存储介质实施例和过程实施 例,W及系统和过程实施例。具体而言,图3、9和/或图12-15中示出的各过程步骤中的任一 步骤或本文W其他方式教导的任一步骤可被用来帮助配置存储介质来形成经配置的介质 实施例。出于公开范围的目的,在运个"经配置的介质"标题下的讨论被视为在"过程"标题 下重复,并且在"过程"标题下的讨论被视为在运个"经配置的介质"标题下重复。此外,过程 也在本公开的其他地方处被讨论,而不在W上任何标题下。标题仅仅是为了方便;它们不对 本文中教导的范围或内容进行限制。
[0133] 在一些示例中,计算机可读存储介质112被配置有数据118和指令116,该指令116 在被至少一个处理器110执行时使得该处理器执行用于使用等同对象类型专口化来生成针 对动态类型化的编程语言130中的属性访问206序列208的机器代码124的算法过程。W下描 述一些代码生成302示例。如之前提到的,出于公开范围的目的,对多形态内联高速缓存246 的引用可由对多形态属性访问简档232的引用来被替换。
[0134] 在一些示例中,代码生成302过程包括W下。当对象126的多形态内联高速缓存246 中的类型212不是等同的时,经优化的代码生成器202发出308非直接属性访问代码228。非 直接代码228是包括用于针对没有开始属性访问序列的至少一个属性访问使用多形态内联 高速缓存的指令116的代码124。当对象的多形态内联高速缓存中的类型被确定328是等同 的,但是从编译器值表242中没有可用的类型集230要与从对象的多形态内联高速缓存中计 算的经高速缓存的类型集进行比较时,经优化的代码生成器202创建等同类型高速缓存238 并发出316针对开始属性访问序列的属性访问206的类型检查代码320。当对象的多形态内 联高速缓存中的类型是等同的并且从编译器值表242中检索322到类型集W供使用323,但 是对象的多形态内联经高速缓存的类型集不匹配从编译器值表中检索到的类型集时,经优 化的代码生成器202发出308非直接属性访问代码。然而,当对象的多形态内联高速缓存中 的类型被确定328是等同的并且对象的多形态内联经高速缓存的类型集匹配从编译器值表 中检索322到的类型集时,经优化的代码生成器202发出306直接属性访问代码224,其在执 行之际直接地访问324在属性的对象的存储器区域216中被硬编码的偏移226处的属性值。
[0135] 在一些示例中,发出30巧自直接属性访问代码228包括在对象类型属性图中定义 326属性的索引234,其相比于直接访问代码224在发出和执行方面更加昂贵(更慢,更多用 于处理的指令)。非直接访问代码访问被属性的索引指示的存储器112位置处的属性值。
[0136] 在一些示例中,仅在确定对象的多形态内联高速缓存246中的所有条目236都具有 与该高速缓存的第一个条目相同的值之后,对象的多形态内联高速缓存246或所使用310的 其他属性访问简档232中的类型212才被确定328是等同的。图13示出用于针对给定属性访 问来确定类型集是否是等同的一个过程。即,图13描绘了确定多形态内联高速缓存中的所 有类型针对所访问的属性是否等同的算法。预期的索引变量被分配1302第一个高速缓存 246条目236的值。循环发生W走查通过各条目,进而将每个条目视为当前条目。当前条目与 预期的索引进行比较1304。如果它们是相等的并且当前条目是最后一个条目,则高速缓存 被标记1306为仅具有等同类型212并且等同性确定完成。如果当前条目与预期的索引是相 等的,但是当前条目不是高速缓存246中的最后一个条目,则下一条目变成1308当前条目并 且控制如显示的循环。如果当前条目与预期的条目从来不等同,则高速缓存被标记1310为 缺乏等同类型212(即,被标记为具有至少两个相互不等同的类型),并且等同性确定完成。
[0137] 在一些示例中,只有在确定332序列中的属性访问全部将是局部的或者全部将针 对相同的原型来作出之后,对象的等同类型高速缓存238中的类型才被确定为是等同的。在 一些示例中,只有在确定334序列中的所有属性存储将对可写属性来作出之后,对象的等同 类型高速缓存238中的类型才被确定为是等同的。在一些示例中,只有在确定336访问序列 中要被访问的属性全部都是内联的或全部都将通过辅助槽来访问之后,对象的等同类型高 速缓存中的类型才被确定为是等同的。
[0138] 在一些示例中,对等同类型高速缓存238的使用在ETC 238的编译器创建312之前。 创建等同类型高速缓存238可至少部分通过创建包括指定的防护类型条目1002 W保持指定 的防护类型的高速缓存来完成。指定的防护类型条目可在固定大小的阵列中,该阵列具有 针对多个次级条目W保持附加类型的空间。
[0139] 一些示例包括创建338属性等同性记录240dPER 240具有针对被单个类型检查所 防护的属性访问序列中的每一个属性访问206的条目。图11示出PER 240的一个实现,其针 对具有不可写属性和辅助槽阵列的环境来定制。
[0140] 图12、14和15进一步示出在一些实施例中对PIC 246(或其他属性访问简档232) 和/或ETC 238的创建、填充和使用。在图9示出的上下文中,图14示出主要在根据框902的执 行和简档收集期间发生的活动,图15示出主要在根据框904的经优化的代码的生成期间发 生的活动,并且图12示出主要在根据框906的经优化的代码的执行期间发生的活动。然而, 本领域的技术人员将意识到,每个附图还帮助示出在其他时间发生的活动,因为结构(诸如 PIC和ETC)在各个时间被创建和/或使用。
[0141] 图14示出用于针对多形态属性访问的简档收集的一些过程,包括针对更快属性访 问的PIC填充和使用。示出的过程图包括在所收集的简档信息中定位1402多形态属性访问 数据,加载1404对象类型212,寻找1406简档条目W及将对象类型与简档条目236进行比较 1408。如果对象类型匹配简档条目,则过程从简档条目中加载属性的索引234并基于该属性 索引来移动1412属性值。如果对象类型不匹配简档条目,则过程从属性图中加载1414属性 的索引234,基于该属性索引来移动1412属性值,并更新1416属性访问简档,使得找到匹配 的机会在下一比较1408上被提升。
[0142] 作为具体示例,考虑在W上示例源代码中的属性访问a.X。该访问206具有相关联 的PIC 246,此处被表示为PIC1,其可例如被实现为进入PIC 246阵列的索引。一个符合图14 的过程加载PIC1,从对象a中加载1404对象a的对象类型(参考例如图8,其中对象类型被表 示为ΤΥΡΙ和TYP2),并例如通过使用散列表或线性捜索来定义1406针对该对象类型的PIC1 高速缓存条目。如果对象类型匹配(过程已经在之前看到过该对象或其类型),则在运行时 过程从PIC1条目中加载1410属性索引,并接着将属性值210加载或存储到被该属性索引指 示的对象a上的存储器位置。如果对象类型不匹配,则在运行时可使用更慢的方式。过程在 对象类型的属性图中(例如,在布局214中)定位1414属性索引,并将属性值210加载或存储 到被来自属性图的属性索引指示的对象a上的存储器位置。接着,PICl条目被盖写,W用对 象a的类型和来自属性图214的属性索引来更新1416PIC1。
[0143] 图15示出用于生成关于至少一些属性访问来优化的代码的一些过程。显示的过程 图包括尝试在收集应用简档信息中定位1402属性访问简档。该尝试返回不需要被填充的简 档232,使得过程检查1502简档232W查看其是否被填充W及它包括什么种类的信息。如果 简档没有被填充,则过程发出308例如使用单形态高速缓存信息的较不优化的非直接代码。 如果简档被多形态属性访问信息填充,则过程发出1504可包括被硬编码的偏移226的经对 象类型专口化的属性访问代码。如果简档被非单形态属性访问信息填充并且类型等同性没 有清晰地存在,则过程发出308例如使用多形态高速缓存信息的较不优化的非直接代码。如 果简档被非单形态属性访问信息填充但是类型等同性清晰地存在,则过程尝试从编译器值 表中检索322类型集。该值表包括在编译中的给定点处存活的每个符号的值W及语义信息, 例如对象的类型。"值"在此处指值编号算法中的值,而不是给定用户变量将对其执行的值。 如果类型集被检索322,则访问类型集和检索到的类型集被比较1506。如果它们不匹配,贝U 过程发出308使用多形态高速缓存信息的较不优化的非直接代码,但是如果它们匹配,则过 程发出306更优化的直接属性访问代码。如果没有类型集被检索322,则过程创建312ETC 238,用目前的类型来填充1508ETC,并发出316类型检查代码320。
[0144] 在一些示例中,符合图15的过程在编译期间发生,之后是经编译的函数的控制流 W及针对每个所遇到的属性访问来执行图15的步骤。经优化的代码的生成结合W下在编译 期间发生:对经编译的函数的控制流的分析W确定,针对每个经优化的属性访问,编译器可 正确地假定(或还通过发出适当的类型检查来确保)只有等同类型的对象才能达到该属性 访问。一些示例使用值跟踪和编号机制来针对每个其属性访问要被优化的对象126跟踪预 期的类型或可能的等同类型集。一些示例还跟踪每个要被优化的序列中的所有属性访问操 作。
[0145] 在一些示例中,符合图15的过程在所收集的简档信息中定位1402属性访问数据。 如果数据没有被填充,则过程发出使用单形态高速缓存的较不优化的代码,运与图14 一致。 如果数据被填充并且是单形态的,则过程发出经对象类型专口化的属性访问代码,运也与 图14一致。如果所填充的数据不是单形态的,则过程检查等同性是否存在,运与图13-致。 如果等同性不存在,则过程发出使用多形态高速缓存(PIC)的较不优化的代码,运与图14 一 致。如果等同性存在,则过程尝试从编译器符合值表242中检索针对对象的预期的类型集。 类型集可能是空的。如果类型集不可用,则注意力从PIC切换到ETC。例如,过程创建新的ETC (运与图11 一致),并用来自PIC的信息来填充它,将第一类型放置为防护1002。接着,过程发 出将加载对象的类型并将其与ETC防护类型进行比较的类型检查代码320。接着,过程发出 306从对象的存储器中的被硬编码的偏移中的直接属性值加载代码/进入到对象的存储器 中的被硬编码的偏移中的直接属性值存储代码。运是快速访问代码,潜在地在即使存在有 不同布局的多形态的情况下依然与单形态访问一样快速。如果类型集可用,则过程比较类 型集。如果它们匹配,则过程发出306从对象的存储器中的被硬编码的偏移中的直接属性值 加载代码/进入到对象的存储器中的被硬编码的偏移中的直接属性值存储代码。如果类型 集不匹配,则完全优化不是适当的,所W过程发出使用PIC信息的较不优化的代码。
[0146] 在一些示例中,经优化的代码生成器(又称发射器)202使用包括在PIC中的信息来 决定是否能应用等同对象类型优化。如果生成器202决定应用优化,则它将生成经优化的代 码并创建ETC,其中所发出的代码将在它被执行时使用。代码生成器使用PIC中的信息来填 充ETCW及ETC所包括(或与其链接的)的属性等同性记录。当所发出的代码稍后被执行时, 它将对其属性要被加载或存储的对象进行操作。所发出的代码将针对ETC中的类型来比较 运个对象的类型。如果该类型匹配防护类型或8槽类型数组中的任意类型,则执行进行W将 属性值直接地224加载或存储到对象的存储器中的槽。如果对象的类型不匹配ETC中的任意 类型,则来自运个ETC的等同性记录被用于针对运个序列中的属性来确定对象的类型(推测 之前没有遇到过)是否实际上等同于ETC中的类型。换言之,属性等同性记录仅在高速缓存 未命中之后被使用。被用来使用属性等同性记录来确定对象的类型与ETC中的类型的等同 性的工作在某种程度上类似于代码生成器在检查PI別寸所做的,但是其是在执行期间而非 在编译期间完成的。
[0147] 图12示出用于执行关于至少一些属性访问来优化的代码的一些过程。过程从对象 的头部218加载1202对象的类型212,并将对象的类型与防护类型1002进行比较1204。如果 它们是相等的,则接下来运行的代码将是用于从被硬编码到对象的所分派的存储器216内 的偏移226处的位置中加载1206或存储1208属性值的代码。如果对象的类型不匹配防护类 型,则运可能是由于防护是空值。一些示例针对空值防护来执行检查1210,其在相对不平常 的情况中被用作用于将由JIT编译器生成的代码跳出1212到经解释的模式内的信号。运个 空值防护跳出可在例如当属性不再是可写的、已经从原型中移除或已经被隐藏时发生。过 程针对对象的类型来检查314ETC;如果找到匹配,则优化代码被运行304。如果没有找到匹 配,则过程使用340PER来尝试并验证328对象的类型等同于防护类型。如果是等同的,贝化TC 被更新346并且优化代码被运行304。否则,过程跳出1212到解释器136。
[0148] 作为具体示例,一个过程从对象的头部加载1202对象a的类型,并将对象a类型与 防护类型进行比较。在一些示例中,ETC的位置被直接硬编码在所发出的机器代码中。如果 类型是相等的,则最快速的代码被运行,其使用被硬编码到对象a的存储器内的偏移来加载 或存储属性值。如果类型不是相等的,则代码将对象a的类型与ETC中经高速缓存的类型中 的每一个进行比较,直到找到匹配或不存在更多的类型。如果找到匹配,则最快速的代码被 运行,其使用被硬编码到对象a的存储器内的偏移来访问属性值。如果在ETC中没有找到匹 配,则代码尝试使用ETC中的pm?来验证对象a的类型针对运个属性访问是等同的。如果不是 等同的,控制从经优化的代码跳出到解释器。如果是等同的,则代码通过将对象a的类型 (即,类型的布局的地址)作为防护类型来插入到ETC内来更新ETC。
[0149] 其他示例
[0150] 下面提供了额外的细节和设计考虑。如同此处的其他示例,在给定实施例中,所描 述的特征可W单独地使用和/或组合地使用,或根本不使用。
[0151] 那些本领域的技术人员将理解,实现细节可W设及诸如特定API、特定存储器地 址、特定属性和对象名称和特定样本程序之类的特定代码,且因此不必出现在每个实施例 中。本领域的技术人员还将理解,在讨论细节时所使用的程序标识符和某些其他术语是针 对具体实现的,且如此不必设及每个实施例。尽管如此,虽然它们不一定需要出现在运里, 但是提供了运些细节,因为它们通过提供上下文可W帮助一些读者,和/或可W示出此处所 讨论的技术的许多可能的实现中的一些。
[0152] W下讨论是从某个Windows 9"阔值(Threshold)"文档中得出的。Windows 9是由 微软公司实现的软件,并且沿着"阔值"一般在营销或其他材料(来自第Ξ方W及微软)中指 Micros油傅Windows?软件(微软公司的标记)的版本。运个软件和/或文档的各方面与本 文描述的实施例中的一些的各方面一致或另行解说本文描述的实施例中的一些的各方面。 然而,要理解,运样的文档和/或实现选择不必约束本文中描述的任意示例或实施例的范 围,且同样地"Windows 9阔值"代码和/或其文档将很好地包含位于运些实施例和示例范围 外的特征。还要理解,下面的讨论是部分作为对未必是本领域技术人员的读者的帮助的一 部分来提供的,并且因此可能包含和/或省略了其下面的引述没有被阐割要求来支持本公 开的细节。
[0153] 本文中的一些教导关注等同对象类型专口化的算法和实现。等同对象类型专口化 允许针对其类型关于被用在序列中的属性等同的对象集,访问多形态属性的一些序列与具 有单形态属性的序列一样高效地被执行。在本文中教导的类型等同性下,两个或更多个不 同的对象布局(类型)可具有被定位在离开对象的开始的匹配偏移处的公共属性子集。该公 共子集可包括但不限于,在对象的存储器的开始处的属性和/或在存储器中被相互紧接地 存储的属性。运样的类型等同性可被用于通过W下来优化多形态属性操作序列:乐观地发 出具有被硬编码的偏移的存储器访问序列(该序列被在该序列开始处的单个类型检查所防 护)并接着仅当执行乐观序列安全时才运么做。
[0154] -些技术设计对等同类型高速缓存的设计。例如,等同类型高速缓存可具有指定 的单个类型槽,其地址可被硬编码在机器代码中,从而使得初始类型检查非常高效。等同类 型高速缓存可被用作针对对所防护的属性访问序列中的一个或多个属性的相关特征(偏 移、可写性)的改变的防护,使得单个类型检查针对未预期的类型W及同时环境中的其他改 变来进行保护。一些技术关注用于跟踪可通过等同对象类型专口化被优化的属性访问序列 的算法和/或用于跟踪在经等同对象类型专口化的序列中所设及的属性及它们的特征) 的算法。
[0155] 在一些示例中,等同对象类型专口化设及数个组件和步骤,其在W下出于便于引 用的目的被提到。与本文中的其他示例一样,提到的步骤和结构可被本领域的技术人员W 任意可操作的方式来忽略、重复和/或组合。
[0156] 第一,多形态内联高速缓存在早期代码执行期间被用于记录在每个多形态属性访 问处已经遇到什么对象类型。一个多形态内联高速缓存与每个属性相关联,使得针对每个 遇到的类型,多形态内联高速缓存记录到该类型的对象上正被考虑的属性的偏移。
[0157] 第二,当函数已经被执行充分数量次时,其被排队W用于经优化的JIT编译。在运 个上下文中,本领域的技术人员将基于情况(诸如例如代码先前经历了多少测试W及其他 发布准则)来确定多少执行次数是"充分"的次数。在一些情况下,单次执行将被认为是充分 的,而在其他情况下,充分性由相对代码覆盖(例如,函数的75%的实例已经被调用)或由 PIC或ETC的大小(例如,函数已经被至少执行与在任一高速缓存中的条目的数量一样多的 次数)来测量。在优化期间,该函数中的每个多形态高速缓存针对类型等同性被检查。如果 高速缓存的针对所有类型的条目都存储相同的偏移(即,属性值在该属性访问迄今为止所 遇到的所有对象布局上被定位在相同的偏移处),则该高速缓存被认为是等同的且被如此 标记。还关注根据所使用的语言的语义来确保类型是完全等同的。例如,如果语言支持原型 继承(如化vaScript那样),则所有属性应当存在于实例自身上或从原型中加载(两种的混 合不是等同的)。类似地,如果语言许可属性访问器W及简单值(JavaScript运么做),则针 对被认为是等同的类型,所有类型上的属性值应当是访问器或应当是简单数据属性。最后, 对于属性存储,所有属性应当是可写的。
[0158] 第Ξ,在编译期间,来自每个等同多形态高速缓存的数据被收集并与对应的属性 访问相关联。等同类型集(类型集)是运一数据的一部分。
[0159] 第四,随着程序被分析,优化编译器202跟踪设及相同等同类型集(在一些实例中, 部分重叠的类型集也被考虑)的属性访问206序列208并将它们标记为针对等同类型专口化 的候选。对于所标识的每个序列,编译器还跟踪所设及的属性,使得在适当时,类型等同性 可在运行时被验证。
[0160] 第五,编译器针对每个所标识的属性访问序列来创建等同对象类型专口化高速缓 存化TC)"ETC包括已经被验证为等同的类型集,伴随有将在所发出的机器代码中被该序列 的开始处的类型检查使用的指定的类型槽。ETC还用作防护,使得在条件改变的情况下(例 如,属性之一变成只读的情况下)可通过将运个防护的值设为0来使得整个机器代码序列无 效(触发跳出)。最后,ETC包括pm?或具有相关联的PER,其存储关于所设及的属性W及它们 的特征(例如,只读状态)的补充信息W帮助验证任何新传入类型的等同性。
[0161] 第六,编译器发出如W上描述的开始于针对高速缓存的防护槽的类型检查的机器 代码序列。每个后续属性访问是来自/去往离开对象的开始的被硬编码的偏移的间接存储 器访问操作,而无需任意附加的运行时检查。如果类型检查成功,则存储器加载/存储的其 余部分与如在单形态对象类型专口化中那样高效地执行。
[0162] 第屯,如果类型检查失败并且防护值为0,则乐观优化代码不再有效,并且执行直 接跳到跳出例程,从那里其将在解释器中继续。
[0163] 第八,如果类型检查失败但是防护值是非0,则乐观优化代码依然有效并可被执 行,只要传入对象的类型关于序列中的属性等同。运个等同性检查可被实现在两个部分中。 第一,传入类型与ETC中的类型集进行比较。运些类型已经被预先验证为等同的,所W如果 传入类型匹配它们中的任一,则执行根据经优化的属性访问路径来继续。运个部分可被直 接发出到机器代码内W供更快速的执行,或者其可W是在初始类型检查失败之际被所发出 的代码调用的助手例程的第一部分。并且,检查可设及对经高速缓存的类型的线性扫描或 基于散列的查找,其中传入类型会被散列到经高速缓存的类型的阵列中的索引中。
[0164] 最后,如果传入类型不匹配被存储在高速缓存中的任一类型,它必须针对等同性 被显式地检查。为此,存储在ETC中的属性列表W及关于它们所要求的特征的辅助数据针对 传入类型的属性来比较。如果运个检查成功,执行根据经优化的属性访问路径来继续。此 外,ETC被更新(新的类型被放置在防护槽中,并被添加到等同类型的阵列,虽然它可取代另 一类型)。通过运种方式,在对运个属性访问序列的后续执行上,初始类型检查将成功,并且 大部分优化代码将被执行。另一方面,如果运个检查失败,则传入类型不是等同的,并且后 续机器指令针对被处理的对象不是有效的。执行直接跳转到跳出例程,并且在解释器中继 续。在许多示例中,运种消耗时间的逐属性的检查将很少被执行,并且在大部分时间,大部 分优化代码路径将被执行。
[01 化]PIC 和 ETC
[0166] 本文中的一些示例参考两种不同种类的高速缓存。存在与每个属性访问指令(例 如,示例源代码中的指令"a. X"、"a. y"、"b. X"和"b. y"中的每一个)相关联的多形态内联高 速缓存(PICKPIC记录该指令所遇到的所有对象的类型。运些高速缓存被检查来确定它们 所记录的类型是否是等同的。如果PIC类型是等同的,则一实施例尝试将等同类型专口化应 用到对应的指令。另一方面,当一实施例选择使用等同类型专口化来优化属性访问指令序 列时,等同类型高速缓存化TC)被创建。每个运样的序列被给予一等同类型高速缓存,其存 储已经针对运个属性访问序列被确定为等同的类型,来促进快速类型检查。运两个高速缓 存用作不同的目的。等同类型高速缓存中的类型已经已知为等同的,而多形态内联高速缓 存中的类型可能是或可能不是等同的。在附图中:图6显示PIC;整体系统的图9设及PIC(经 由属性访问简档232)并且还设及ETC 238;图10显示ETC;图11显示结构上是ETC的一部分或 W其他方式与ETC相关联的PER;图12设及ETC;图13和14中的每一个设及PIC;并且图15设及 P 1C和ETC两者。
[0167] 附加组合和变体
[0168] 用于生成和执行针对动态类型化的编程语言中的属性访问的代码的系统S1包括 至少一个处理器、与该处理器可操作上通信的存储器W及直接访问代码生成器,其发出针 对属性访问的直接访问代码W访问对象的属性。该对象具有一类型。直接访问代码在对应 于该属性访问的多形态内联高速缓存中所标识的类型是等同时被发出。
[0169] 用于生成和执行针对动态类型化的编程语言中的属性访问的代码的系统S2包括 至少一个处理器、与该处理器可操作上通信的存储器W及直接访问代码生成器,其发出针 对属性访问的直接访问代码W访问对象的属性。该对象具有一类型。直接访问代码在从多 形态内联高速缓存中检索到的类型集匹配于与编译器值表中对象的类型相关联的类型集 时被发出。
[0170] 用于生成和执行针对动态类型化的编程语言中的属性访问的代码的系统S3包括 至少一个处理器、与该处理器可操作上通信的存储器W及针对属性访问的用于访问对象的 属性的所生成的直接访问代码。属性访问属于属性访问序列。对象具有一类型和存储器区 域。直接访问代码在执行之际访问被定位在对象的存储器区域中被硬编码的偏移处的属性 值,并访问该值,而在比较类型检查确定对象的类型匹配于与该属性访问序列相关联的等 同类型高速缓存中的条目之后无需要求进一步的类型检查。
[0171] 用于生成和执行针对动态类型化的编程语言中的属性访问的代码的系统S4包括 属性等同性记录,该属性等同性记录包括针对属性访问序列中的每个属性访问的一个条 目,该属性访问序列相对于被每属性访问一个类型检查所防护而言仅被单个类型检查所防 护,即使属性属于具有布局差异的类型。所生成的直接访问代码可包括全部被单个类型检 查所防护的动态类型属性访问序列。
[0172] 系统S1-3包括系统S1的直接访问代码生成器和系统S3的所生成的直接访问代码 两者。系统S2-3包括系统S2的直接访问代码生成器和系统S3的所生成的直接访问代码两 者。系统S1-2包括也如针对系统S2所描述的那样来操作的系统S1的直接访问代码生成器。 系统S1-2-3包括也如针对系统S2所描述的那样来操作的系统S1的直接访问代码生成器,并 包括系统S3的所生成的直接访问代码。其他可能组合中的每一个也出现在相应的示例中, 例如S1 -2-4、S1 -3-4、S2-3-4、S3-4、S2-4 和 S1 -4。
[0173] 系统SI、S2、S3、S4中任一单个或组合可被装备有用于确定多形态内联高速缓存中 的类型是否等同的装置。合适的装置可包括例如,存储在存储器中并可由处理器执行的代 码,该代码操作使得仅在与给定属性访问相关联的多形态内联高速缓存中的所有条目都包 括与该多形态内联高速缓存中的第一条目相同的属性索引之后才确定与该多形态内联高 速缓存中的类型为等同的。合适的装置还或替换地包括例如,操作使得仅在确定W下条件 之一被确切地满足之后才确定与对给定属性的给定属性访问相关联的多形态内联高速缓 存中的类型是等同的代码:该多形态内联高速缓存中的所有类型都描述包括该给定属性的 对象,或该多形态内联高速缓存中的所有类型描述共享原型的对象并且该原型包括该给定 属性。合适的装置还或替换地包括例如,操作使得仅在确定W下条件之一被确切地满足之 后才确定与对给定属性的给定属性访问相关联的多形态内联高速缓存中的类型是等同的 代码:该多形态内联高速缓存中的所有类型都描述在对象的头部上的槽中具有该给定属性 的值的对象,或该多形态内联高速缓存中的所有类型都描述在对象的辅助槽阵列上的槽中 具有该给定属性的值的对象。具有由图6中示出的结构形式的多形态内联高速缓存(大小可 改变)或功能等同也是所述装置的一部分。图13中显示的算法的实现或功能等同可W是所 述装置的一部分。
[0174] 多形态内联高速缓存可被认为是多形态属性访问简档的一个实现。除了固定大小 阵列高速缓存之外的机制可被用于在本章节或本文中其他地方中提供的系统、经配置的机 审喊过程的任一中用"多形态属性访问简粋'来代替"多形态内联高速缓存"。例如,可使用 高效增长的阵列。一种高效增长阵列的方式是分派更大的阵列,将原始阵列的数据复制到 该阵列中,并清空原始阵列。另一方式是创建链接列表、树、散列表或其他链接结构,其将对 所持有的属性简档数据可用的空间扩展到初始阵列中的空间之外。
[0175] 进一步关注系统S4的变体,其中该系统包括所生成的直接访问代码,并且其中所 生成的直接访问代码包括不同类型的对象的所访问的属性的属性访问序列,在一些情况 下,所述类型在W下条件之一被确切地满足时针对所述所访问的属性是等同的:所有所访 问的属性是局部属性,或每个所访问的属性来自原型并且所有所访问的属性来自该相同原 型。在一些情况下,所生成的直接访问代码包括不同类型的对象的所访问的属性的属性访 问序列,并且其中所述属性访问全部内联或全部在辅助槽阵列中。
[0176] 计算机可读存储介质Ml被配置有数据和指令,该指令在被至少一个处理器执行时 使得该处理器执行用于使用等同对象类型专口化来生成针对动态类型化的编程语言中的 属性访问序列的机器代码的算法过程。在一特定示例Mia中,当对象的多形态内联高速缓存 中的类型不是等同的时,该过程发出非直接属性访问代码,即包括用于针对不开始该属性 访问序列的至少一个属性访问使用多形态内联高速缓存的指令的代码。在一特定示例Mlb 中,当对象的多形态内联高速缓存中的类型是等同的,但是从编译器值表中没有可用的与 从对象的多形态内联高速缓存中计算出的经高速缓存的类型集进行比较的类型集时,该过 程创建等同类型高速缓存并发出针对开始该属性访问序列的属性访问的类型检查代码。在 一特定示例Mlc中,当对象的多形态内联高速缓存中的类型是等同的并且从编译器值表中 检索到类型集,但是对象的多形态内联经高速缓存的类型集不匹配从编译器值表中检索到 的类型集时,该过程发出非直接属性访问代码。在一特定示例Mid中,当对象的多形态内联 高速缓存中的类型是等同的并且对象的多形态内联经高速缓存的类型集匹配从编译器值 表中检索到的类型集时,该过程发出直接属性访问代码,该直接属性访问代码在执行之际 直接地访问在该对象的存储器区域中被硬编码的偏移处的属性值。变体Mia、M化、Mlc、Mld 可单独出现,或与一个其他变体一起出现(Mla+M化、Mla+Mlc、Mla+Mld、M化+Mlc、M化+Mld、 Mlc+Mld),或与两个其他变体一起出现(Mla+M 化+Mlc、Mla+M 化+Mld、Mla+Mlc+Mld、M 化+Mlc +Mld)或它们中的全部可出现在一给定示例中(Mla+M化+Mlc+Mld)。发出非直接属性访问代 码可包括在对象类型属性图中定位属性的索引W及发出访问在被属性的索引所指示的存 储器位置处的属性值的代码。
[0177] 在Mla、M化、Mlc和/或Mid的运些组合的任一中,对象的多形态内联高速缓存中的 类型仅在确定该多形态内联高速缓存中的所有条目都具有与该高速缓存的第一条目相同 的值之后才被确定为是等同的。在运些组合中的任一中,只有在确定序列中的属性访问都 是局部的或者都针对相同的原型来作出之后,对象的等同类型高速缓存中的类型才可被确 定为是等同的。在运些组合中的任一中,只有在确定序列中的所有属性存储将对可写属性 来作出之后,对象的等同类型高速缓存中的类型才被确定为是等同的。在运些组合中的任 一中,只有在确定访问序列中要被访问的属性全部都是内联的或全部都将通过辅助槽来访 问之后,对象的等同类型高速缓存中的类型才被确定为是等同的。
[0178] 在Mla、M化、Mlc和/或Mid的运些组合W及它们的变体的任一中,创建等同类型高 速缓存可至少部分地通过创建包括指定的防护类型条目W保持指定的防护类型的高速缓 存来完成。指定的防护类型条目可位于固定大小阵列中,该阵列具有针对多个次级条目来 保持附加类型的空间。
[01巧]在Mla、M化、Mlc和/或Mid的运些组合W及它们的变体的任一中,该过程可包括创 建属性等同性记录,该属性等同性记录具有针对被单个类型检查所防护的属性访问序列中 的每个属性访问的条目。
[0180] Mla、M化、Mlc和/或Mid的运些组合W及它们的变体的任一还可通过配置考虑中的 系统的存储器112和/或配置考虑中的系统的可移动介质114来与W上描述的系统S1、S2、 S3、S4W及它们的变体中的任一个相组合。
[0181] -种使用等同对象类型专口化来执行动态类型化的编程语言中的属性访问序列 的过程Pla包括运行代码,该代码通过将对象类型与等同类型高速缓存的指定的防护类型 进行比较来进行类型检查。过程Plb包括执行访问在被硬编码到对象的存储器内的偏移处 的属性的值的代码,而无需在对象类型等于指定的防护类型之后运行进一步的类型检查代 码。过程Pic包括运行类型检查比较代码,该代码在对象类型不等于指定的防护类型时将该 对象类型与等同类型高速缓存的至少一个次级条目进行比较。过程Pld包括执行针对在对 象存储器中被硬编码的偏移处的属性访问序列的代码,而无需在类型检查比较代码确定对 象类型匹配于等同类型高速缓存中的条目之后运行进一步的类型检查代码。此处,如本文 中其他地方那样,"访问"属性值指从对象的存储器区域中加载属性值或将属性值存储到对 象的存储器区域中。过程Pie包括执行通过使用与等同类型高速缓存相关联的属性等同性 记录来确定对象类型是否针对所访问的属性与等同类型高速缓存中的类型等同的代码。
[0182] 在第一变体中,该过程包括执行至少Ξ个全部被单个检查类型所防护的动态类型 属性访问的序列。在第二变体中,该过程包括通过插入通过类型检查比较代码的执行没有 被初始地发现在等同类型高速缓存的任意条目中的对象类型来更新等同类型高速缓存。在 第Ξ变体中,该过程包括将多个属性访问执行到不同类型的对象内,所有运些对象针对所 访问的属性是等同的,并且其中所访问的属性全部是局部的或全部来自相同的原型。在第 四变体中,该过程包括执行设及不同类型的对象的多个属性访问,其中所有类型针对所设 及的属性是等同的,并且所访问的属性全部内联在对象的头部中或所访问的属性全部在对 象的辅助槽阵列中。每个变体可单独地发生,或与其他变体中的任意一个或多个组合地发 生。每个变体可与过程Pla、P化、Plc、Pld、Ple中的任一个一起来发生,并且每个过程可与其 他过程中的一个或多个相组合。此外,每个过程或过程的组合(包括变体)可与W上描述的 介质组合和变体中的任意一个相组合。
[0183] 结语
[0184] 虽然具体实施例在此处被明确示出并描述为进程、已配置的介质、或系统,但是可 W理解,对一种类型的实施例的讨论也一般性地延伸到其他实施例类型。例如,结合图3和 12-15的过程描述还帮助描述配置的介质,并帮助描述如结合其他附图讨论的那些技术效 果效W及系统和制品等技术效果W及系统和制品的操作。对一个实施例的限制也不一定适 用于另一个实施例。具体而言,进程不一定仅限于在讨论诸如已配置的存储器之类的系统 或产品时呈现的数据结构和方案。
[0185] 本文对具有某一特征X的实施例的引用W及本文别处对具有某一特征Y的实施例 的应用不从具有特征X和特征Y两者的本公开的实施例中排除,除非运一排除在此被明确指 明。所有可能的负面权利要求限制在W下意义上在本公开的范围内:被表述为一实施例的 一部分的任一特征也可在表达上从包括在另一实施例中移除,即使该特定排除没有在本文 中任意示例中被给出。术语"实施例"在此仅仅被用作过程、系统、制品、经配置的计算机可 读介质和7或此处如W与适用法律一致的方式应用的教导的其它示例的更方便的形式。" 因此,给定"实施例"在该实施例与至少一个权利要求一致的情况下可包括此处所公开的特 征的任何组合。
[0186] 不是图中所示出的每一项都需要存在于每个实施例中。相反,实施例可W包含图 中未显式地示出的项。虽然一些可能性在此处通过具体示例在文本和附图中示出,但是各 实施例可W偏离运些示例。例如,一示例的具体技术效果或技术特征可W被省略、重命名、 W不同的方式分组、重复、不同地W硬件和/或软件实例化,或是在两个或更多示例中出现 的效果或特征的混合。在一些实施例中,在一个位置示出的功能也可W在不同位置提供;技 术人员认识到在给定实现中功能模块能够W各种方式定义,而不必从作为一个整体来看的 交互模块的集合中省略所需技术效果
[0187] 通过附图标记参考了附图。在附图或文本中与给定附图标记相关联的措词中的任 何显而易见的不一致性应该被理解为仅仅时拓宽该标记所引用的内容的范围。即使使用相 同的附图标记,给定附图标记的不同实例也可W指不同的实施例。
[0188] 如此处所使用的,诸如"一"和"该"等术语包括了所指示的项或步骤中的一个或多 个。具体而言,在权利要求书中,对一个项的引用一般表示至少一个运样的项存在,并且对 一个步骤的引用表示执行该步骤的至少一个实例。
[0189] 标题仅是为了方便;关于给定话题的信息可在其标题指示该话题的章节之外被寻 找到。
[0190] 所提交的所有权利要求和摘要是说明书的一部分。
[0191] 尽管在附图中示出并在上文中描述了示例性实施例,但本领域普通技术人员将明 白,可作出多种修改而不脱离权利要求书中阐明的原理和概念,且运些修改不需要涵盖整 个抽象概念。尽管用结构特征和/或过程动作专用的语言描述了本主题,但可W理解,所附 权利要求书中定义的主题不必限于权利要求书上面所描述的具体特征或动作。不一定在给 定定义或示例中标识的每一个手段或方面或技术效果都在每个实施例中存在或使用。相 反,所描述的具体特征和动作W及效果是作为供当实现权利要求书时考虑的示例来公开 的。
[0192] 无法包围整个抽象概念但落入权利要求的等效技术方案的意义和范围内的所有 改变都在法律所准许的最大程度内被包含在其范围内。
【主权项】
1. 一种用于生成并执行针对在动态类型化的编程语言中的属性访问的机器代码,所述 系统包括: 至少一个处理器; 与所述处理器能操作上通信的存储器;以及 以下中的至少一个: (a) 直接访问代码生成器,所述直接访问代码生成器发出针对属性访问的直接访问代 码以访问对象的属性,所述对象具有一类型,所述直接访问代码在以下条件被满足时被发 出:在对应于所述属性访问的多形态内联高速缓存中标识的类型是等同的,以及从所述多 形态内联高速缓存中检索的类型集与与编译器值表中的所述对象的类型相关联的类型集 相匹配; (b) 针对属性访问的用于访问对象的属性的所生成的直接访问代码,所述属性访问属 于属性访问序列,所述对象具有一类型和存储器区域,并且其中所述直接访问代码在执行 之际访问被定位在所述对象的存储器区域中被硬编码的偏移处的所述属性的值,并访问所 述值,而在比较类型检查确定所述对象的类型匹配于与所述属性访问序列相关联的等同类 型高速缓存中的条目之后无需要求进一步的类型检查;或 (C)属性等同性记录,所述属性等同性记录针对被单个类型检查所防护的属性访问序 列中的每个属性访问具有一个条目。2. 如权利要求1所述的系统,其特征在于,所述系统包括所述直接访问代码生成器,并 且所述直接访问代码生成器根据以下中的至少一个来操作: (a) 所述多形态内联高速缓存的条目包括属性索引,并且仅在与给定属性访问相关联 的多形态内联高速缓存中的所有条目都包括与所述多形态内联高速缓存中的第一条目相 同的属性索引之后才确定所述多形态内联尚速缓存中的类型为等同的; (b) 与给定属性访问相关联的多形态内联高速缓存中的类型仅在确定以下条件之一被 确切地满足之后才被确定为等同的:所述多形态内联高速缓存中的所有类型都描述包括所 述给定属性的对象,或所述多形态内联高速缓存中的所有类型都描述共享原型的对象并且 所述原型包括所述给定属性; (c) 与给定属性访问相关联的多形态内联高速缓存中的类型仅在确定以下条件之一被 确切地满足之后才被确定为等同的:所述多形态内联高速缓存中的所有类型都描述在对象 的头部上的槽中具有所述给定属性的值的对象,或所述多形态内联高速缓存中的所有类型 都描述在对象的辅助槽阵列上的槽中具有所述给定属性的值的对象。3. 如权利要求1所述的系统,其特征在于,所述系统包括所述所生成的直接访问代码, 并且其中所述所生成的直接访问代码包括全部被单个类型检查所防护的动态类型属性访 问序列。4. 如权利要求1所述的系统,其特征在于,所述系统包括所述所生成的直接访问代码, 并且其中所述所生成的直接访问代码包括不同类型的对象的所访问的属性的属性访问序 列,并且其中以下条件中的至少一个具有: 所述类型针对所述所访问的属性是等同的,并且以下条件之一被确切地满足:所有所 访问的属性是局部属性,或每个所访问的属性来自原型并且所有所访问的属性来自该相同 原型; 所述属性访问全部是内联的,或所述属性访问全部在辅助槽阵列中。5. -种被配置有数据和指令的计算机可读存储介质,所述指令在被至少一个处理器执 行时使得所述处理器执行用于使用等同对象类型专门化来生成针对动态类型化的编程语 言中的属性访问序列的机器代码的算法过程,所述过程包括以下步骤: (a) 当对象的多形态内联高速缓存中的类型不是等同的时,发出非直接属性访问代码, 即包括用于针对不开始所述属性访问序列的至少一个属性访问使用多形态内联高速缓存 的指令的代码; (b) 当所述对象的多形态内联高速缓存中的类型是等同的,但是从编译器值表中没有 可用的与从所述对象的多形态内联高速缓存中计算出的经高速缓存的类型集进行比较的 类型集时,创建等同类型高速缓存并发出针对开始所述属性访问序列的属性访问的类型检 查代码; (c) 当所述对象的多形态内联高速缓存中的类型是等同的并且从编译器值表中检索到 类型集,但是所述对象的多形态内联经高速缓存的类型集不匹配从所述编译器值表中检索 到的类型集时,发出非直接属性访问代码;以及 (d) 当所述对象的多形态内联高速缓存中的类型是等同的并且所述对象的多形态内联 经高速缓存的类型集匹配从所述编译器值表中检索到的类型集时,发出直接属性访问代 码,所述直接属性访问代码在执行之际直接地访问在所述对象的存储器区域中被硬编码的 偏移处的属性值。6. 如权利要求5的经配置的存储介质,其特征在于,所述对象的多形态内联高速缓存中 的类型仅在确定所述多形态内联高速缓存中的所有条目都具有与所述高速缓存的第一条 目相同的值之后才被确定为是等同的。7. 如权利要求5的经配置的存储介质,其特征在于,只有在确定序列中的属性访问都是 局部的或者都针对相同的原型来作出之后,所述对象的等同类型高速缓存中的类型才被确 定为是等同的。8. 如权利要求5的经配置的存储介质,其特征在于,只有在确定序列中的所有属性存储 将对可写属性来作出之后,所述对象的等同类型高速缓存中的类型才被确定为是等同的。9. 如权利要求5的经配置的存储介质,其特征在于,只有在确定访问序列中要被访问的 属性全部都是内联的或全部都将通过辅助槽来访问之后,所述对象的等同类型高速缓存中 的类型才被确定为是等同的。10. 如权利要求5的经配置的存储介质,其特征在于,创建等同类型高速缓存至少部分 地通过创建包括指定的防护类型条目以保持指定的防护类型的高速缓存来完成,并且其中 所述指定的防护类型条目在固定大小阵列中,所述阵列具有针对多个次级条目以保持附加 类型的空间。11. 权利要求5的经配置的存储介质,其特征在于,所述过程还包括创建属性等同性记 录,所述属性等同性记录具有针对被单个类型检查所防护的属性访问序列中的每个属性访 问的条目。12. -种用于执行使用等同对象类型专门化的动态类型化的编程语言中的属性访问序 列的算法过程,所述过程包括: (a)运行通过将对象类型与等同类型高速缓存的指定的防护类型进行比较来进行类型 检查的代码; (b) 当所述对象类型等于所述指定的防护类型时,无需运行进一步的类型检查代码,执 行访问被硬编码到对象的存储器内的偏移处的属性的值的代码; (c) 当所述对象类型不等于所述指定的防护类型时,运行将所述对象类型与所述等同 类型高速缓存的至少一个次级条目进行比较的类型检查比较代码; (d) 当所述类型检查比较代码确定所述对象类型匹配所述等同类型高速缓存中的任一 条目时,无需运行进一步的类型检查代码,执行针对所述属性访问序列的代码,每个属性访 问加载属性值或存储属性值,每个属性访问访问被硬编码到对象的存储器内的偏移处的位 置;以及 (e) 当所述类型检查比较代码确定所述对象类型不于所述等同类型高速缓存中的任意 条目匹配时,执行通过使用与所述等同类型高速缓存相关联的属性等同性记录来确定所述 对象类型是否等同于关于所访问的属性的等同类型高速缓存中的类型的代码。13. 如权利要求12所述的过程,其特征在于,包括执行至少两个全部被单个检查类型所 防护的动态类型属性访问的序列。14. 如权利要求12所述的过程,其特征在于,包括将多个属性访问执行到不同类型的对 象内,所有这些对象针对所访问的属性是等同的,并且其中所访问的属性全部是局部的或 全部来自相同的原型。15. 如权利要求12所述的过程,其特征在于,包括执行涉及不同类型的对象的多个属性 访问,其中所有类型针对所涉及的属性是等同的,并且所访问的属性全部内联在对象的头 部中或所访问的属性全部在对象的辅助槽阵列中。
【文档编号】G06F9/44GK105830025SQ201480069909
【公开日】2016年8月3日
【申请日】2014年12月5日
【发明人】J·("A")·米亚多维茨, P·A·莱瑟斯, L·拉弗里尼尔, 沙特拉 B·G·阿比集思, C·C-C·曼
【申请人】微软技术许可有限责任公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1