CN105830025B - 动态类型化的编程语言中的属性访问 - Google Patents
动态类型化的编程语言中的属性访问 Download PDFInfo
- Publication number
- CN105830025B CN105830025B CN201480069909.0A CN201480069909A CN105830025B CN 105830025 B CN105830025 B CN 105830025B CN 201480069909 A CN201480069909 A CN 201480069909A CN 105830025 B CN105830025 B CN 105830025B
- Authority
- CN
- China
- Prior art keywords
- type
- attribute
- code
- access
- cache
- 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
- G06F8/44—Encoding
- G06F8/443—Optimisation
-
- 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
-
- 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
- G06F9/449—Object-oriented method invocation or resolution
- G06F9/4491—Optimising based on receiver type
-
- 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
-
- 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/45516—Runtime code conversion or optimisation
- G06F9/4552—Involving translation to a different instruction set architecture, e.g. just-in-time translation in a JVM
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
代码生成器可发出用于在在动态类型化的编程语言中促进类型安全性的情况下访问对象的属性的直接访问代码。直接访问代码使用被硬编码到对象的存储器区域内的偏移来访问属性的值。在一些情况下,直接访问代码在防护包括至少一个在先序列成员在内的属性访问序列的单个类型检查后访问该值。在一些情况下,类型检查代码将对象的类型与等同类型高速缓存的指定的防护类型进行比较。可通过使用与等同类型高速缓存相关联的属性等同性记录来检查对象类型与等同类型高速缓存中的类型的因属性而异的访问等同性。当类型关于一属性不是访问等同的时,通过发出用于访问该属性的非直接访问代码来保持类型安全性。
Description
背景
计算硬件通常不基于位(一和零)旨在对人们的含义来在位之间进行区分。在计算系统中,通常出现的是,在字符串、整数值、列表、表、层级、数据结构片段、代码序列和其他数据要被移动或以其它方式被操纵时,这些操纵中的每个使用相同的基础低级硬件来完成,而不管数据所预期的含义。即使在要被处理器执行的位与不要被处理器执行的位之间的区别是由人和人的工具创建的区别的情况下。位的含义以及位移动和位操纵的实际影响最终都取决于人类解释。分配位在智能电话、平板、膝上型电脑、网络和其他系统中的最终含义的是开发者和其他人员。
开发者将含义分配到位的一种方式是使用编程语言来定义软件内容和行为。编程语言的帮助在软件中文档化并实现特定含义的一个方面一般被知晓为“类型化”。类型化也被称为使用短语“类型系统”和“数据类型”等。通过将数据类型与变量、常量、例程、接口以及程序中的其他构造或人工产物相关联,软件开发者将含义添加到底层的位。在没有添加的含义的情况下,程序位仅仅是一和零的序列。
概述
一些实施例或示例在在动态类型化的编程语言中促进类型安全性的指定条件下发出针对属性访问的直接访问代码来访问对象的属性。在一些情况下,直接访问代码在执行之际访问被定位在对象的存储器区域中被硬编码的偏移处的属性的值。在一些情况下,直接访问代码在执行之际在防护属性访问序列的单个类型检查之后访问该值。在一些情况下,类型检查代码将对象类型与等同类型高速缓存的指定的防护类型进行比较。在一些情况下,代码通过使用与等同类型高速缓存相关联的属性等同性记录来确定对象类型是否针对所访问的属性与等同类型高速缓存中的类型等同。
所给出的示例只是说明性的。本发明内容并不旨在标识所要求保护主题的关键特征或必要特征,也不旨在用于限制所要求保护主题的范围。相反地,提供本发明内容是为了以简化的形式介绍将在以下具体实施方式中进一步描述的一些技术概念。本发明由权利要求书限定,在本发明内容与权利要求书有冲突的情况下,应该以权利要求书为准。
附图简述
将参考附图给出更具体的描述。这些附图只示出了选定的方面,且因此不完全确定任一示例的覆盖或范围。
图1是示出包括至少一个处理器以及至少一个存储器的计算机系统以及示出操作环境中可扩展超过多个网络节点的项并还示出一些经配置的存储介质的各方面的框图,其中至少一个处理器和至少一个存储器在用于构建应用的可执行版本的软件的控制下和/或在可执行应用软件的控制下相互交互;
图2是进一步示出对象属性访问代码生成的各方面以及一些体系结构中的对象实现的各方面的框图;
图3是示出在属性访问的生成和/或执行中的一些过程的各步骤和一些经配置的存储介质的流程图;
图4是示出用于实现对对象字段(也称为对象属性)的访问的静态编译的各方面的图;
图5是示出单形态例程调用站的各方面的图;
图6是示出多形态内联高速缓存(也称为PIC)的各方面的图;
图7是示出多形态例程调用站的各方面的图;
图8是示出对象、对象类型以及对象类型布局和对象属性访问等同性或缺乏对象属性访问等同性的各方面的图;
图9是示出针对对象属性访问优化的体系结构的各方面的数据流图;
图10是示出等同类型高速缓存(也称为ETC)的各方面的图;
图11是示出属性等同性记录(也称为PER)的各方面的图;
图12是示出使用等同类型高速缓存来帮助优化对象属性访问的所发出的可执行代码的行为和结构方面的数据流图;
图13是示出使用经高速缓存的单形态属性访问简档数据来帮助优化属性访问的可执行代码生成的行为和结构方面的数据流图;
图14是示出多形态属性访问简档数据收集和使用的行为和结构方面的数据流图;以及
图15是示出具有对等同类型高速缓存以及多形态属性访问简档数据的访问以提供更加优化的属性访问的可执行代码生成过程的行为和结构方面的数据流图。
详细描述
首字母缩略词
一些首字母缩略词在以下被定义,但是其他首字母缩略词可在本文中的其他地方定义或不要求被本领域技术人员理解的定义。
ALU:算术与逻辑单元
AOT:提前
API:应用程序接口
CD:压缩光盘
CPU:中央处理单元
DVD:数字多用盘或数字视频光盘
ECMA:欧洲计算机制造商协会,现在是国际Ecma
ETC:等同类型高速缓存
FPGA:现场可编程门阵列
FPU:浮点处理单元
GPU:图形处理单元
GUI:图形用户界面
IDE:集成开发环境,有时也称为“交互式开发环境”
IoT:物联网
ISO/IEC:国际标准化组织/国际电工委员会
JIT:即时
PER:属性等同性记录
PIC:多形态内联高速缓存
RAM:随机存取存储器
ROM:只读存储器
概览
在本文中描述的某些情况下,代码生成器可减少被生成来访问动态类型化的编程语言中某一对象的属性的指令的数量。这种减少具有相应的效果,诸如针对所生成的代码的降低的执行时间以及更小的所生成的代码,其进而减少处理器负载、功率使用以及代码存储要求。动态类型化的编程语言的示例有许多并且一般对本领域技术人员而言是熟悉的。也许当今最广泛使用的示例是被用在web浏览器和其他地方中的JavaScript语言;其是在ECMA-262规范和ISO/IEC 16262中被标准化的ECMAScript(ECMA脚本)语言的一个实现。
本领域的技术人员意识到在有效地访问(加载和存储)用动态类型化的语言撰写的程序中的属性方面存在挑战。JavaScript的执行性能受到重视,例如作为web浏览器供应商之间竞争的一部分。
产生在生成高效属性访问代码方面的挑战,因为动态类型化的程序中的对象缺乏静态(在编译时)已知的结构(布局)。静态布局允许编译器发出简明的处理器指令来用于从对象的存储器中加载属性值偏移/将属性值偏移存储到对象的存储器中。如图4中示出的,针对一些程序的元数据402包括针对静态已知结构的类型布局信息,并且具体而言包括字段偏移406,字段偏移406的值在程序运行之前在编译时是固定的(“字段”和“属性”在本文中互换地使用)。在这些情况下,编译器可生成直接将偏移作为特定常量数值来包括的代码408,而非生成指令来在之后在所生成的程序代码运行的同时计算偏移。在编译时作为常量被内嵌在所生成的代码中的偏移和其他值被称为“硬编码”。
当偏移不是被硬编码时,属性的值在对象的存储器中的位置必须在每次该值将被访问时在运行时被确定。这种属性访问的稚拙实现导致不可接受的开销,例如在基准测试或消费者产品中的执行速度跌倒竞争者水平之下。因此,已经采用了各种技术来加速属性访问。这些技术在本文中一般称为“优化”,应当理解,优化不必是最佳的可能方式-其而是改进某个可测量技术特征的方式,例如,优化是降低执行时间、减少代码大小、提高可靠性、改进安全性和/或对某个其他有益技术效果进行贡献的方式。
如果给定函数每次仅对一个且相同的对象进行操作,则该对象中属性的值的位置(偏移)可在第一次访问时被高速缓存。在后续访问上,对属性的位置的计算可通过从高速缓存中取得偏移来使用简单查找(其使得代码更快速)。这种方式可被扩展到共享相同布局的多个对象。如果所有对象都标记有它们的布局ID(类型),则该类型可在第一访问上被存储在高速缓存中,并且在后续访问上,经高速缓存的偏移可被使用。只要当前对象的类型匹配被存储在高速缓存中的类型,这种方式就是安全的;这称为“单形态属性访问”。在这个上下文中,“安全”意味着由针对属性访问的可执行代码访问的位将是可预测的并且将实际上是开发者想要访问的位。换言之,如果执行产生与本领域的技术人员通过正确地手动模拟源代码的执行所获得(尽管要慢的多且麻烦的多)的计算结果相同的计算结果,则从程序源代码中生成的可执行代码在这个方面是“安全的”。
图5示出其中被访问的属性在例程502中的特殊情况。类型防护504在运行时检查对象的类型以确定该对象的类型是否与先前经高速缓存的类型相同。如果类型不匹配,则执行相对昂贵的查找计算来找到正确例程主体的偏移。但是,如果当前对象的类型匹配先前经高速缓存的类型,则控制传递到例程的主体506,即被调用的属性的主体。
当所涉及的对象不共享单个布局时,单形态访问方式不是安全的。有时多形态方式是可行的。图7示出用于例程调用的多形态方式。多形态存根702针对已知(先前遇到的)类型的短列表来测试当前对象的类型,并在找到匹配时,将控制传输到对应的位置,或在没有找到匹配的情况下将控制传输到查找计算。关于对象属性访问,高速缓存可被使用来存储类型集和对应的偏移,其中正在考虑的属性的值被存储在所遇到的每个类型布局的对象上。这样的高速缓存实现针对相对小数量的布局的多形态属性访问,因为高速缓存的确添加了程序存储要求。通过例如使用两个、四个或八个条目的高速缓存,可产生可接受的执行加速,而也不增加可接受限制之外的存储器占用。可接受性取决于开发者和环境,但是在许多开发环境中,可能组合的数量足够小来使得它们相应的技术影响的比较成为可能。
多形态或单形态高速缓存可实质上加速属性访问,但是高速缓存依然带来了针对每个个别属性访问来针对存储在高速缓存中的类型检查对象的类型的开销。
现在考虑样本源代码,诸如以下:
在这个示例源代码中,如在某些其他源代码片段中,函数中的属性访问序列涉及相同对象。该对象可以是例如局部变量或输入参数。在这样的情况下,属性访问代码可通过将类型检查的数量减少到在该序列的开始处执行的单个检查来被进一步优化。如果编译器可确定在编译期间所访问的对象的类型在访问的序列期间不能改变,则该优化将是安全的。如果所有属性访问涉及只有一个布局(类型)的对象(即,访问是单形态的),则将被找到的序列中每个属性所处的偏移可在JIT编译时已知(例如,从内联高速缓存),并且编译器可出于速度的目的使用内嵌的偏移常量来向对应的地址发出直接存储器加载或存储指令来代替非直接属性访问代码,该非直接属性访问代码可包括在对象类型属性图中定位属性的索引并且对于发出和执行而言更加昂贵。此外,针对属性访问序列的单个运行时检查的开销可被遍布在潜在大量的属性访问上,从而使得它们中的每一个平均上更快。这种优化可被成为“对象类型专门化”。
然而,如果该序列中的属性访问涉及不同布局的对象,则到不同布局的对象上被相同命名的属性的偏移可以是不同的。在这些多形态情况中,正确的属性偏移在JIT编译期间一般不是已知的,因为类型被动态地选择并且不同的类型具有不同的布局。由此,偏移不能被直接内嵌在被JIT编译的代码中,即使对象的类型在该序列的开始处被验证。这导致对于一般多形态属性访问序列而言对象类型专门化是不实际的。
然而,如本文中教导的,针对这种序列的子集,依然可实现优化。即使不同的类型具有不同的布局,但是在一些情况下,根据一个类型的给定属性的偏移将匹配另一类型的被对应命名的属性的偏移。即,即使多个对象不共享相同的布局,但是它们可共享该布局的一部分,使得一些属性可在两个对象上的对应偏移处被找到,即使这不是对于所有属性都是真的。例如,对象oa={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是偏移等同的,而是不针对所有列出的其他属性偏移等同。偏移等同性是访问等同性的一种形式,区别在于访问等同性不仅仅考虑偏移,还考虑属性存储的其他方面,诸如属性是否是可写的以及它们是否具有相同的对象原型。换言之,被相同命名的属性可在两个类型中具有相同的偏移,该两个类型在至少一个其他属性方面相互不同。特殊情况是,当在相同偏移处的两个被相同命名的属性不是具有任一类型的第一属性时。图8显示另一示例,其中等同属性在注释中使用属性名称之间的“==”被调出,而非等同属性在该注释中使用属性名称之间的“<>”被调出。注意,在一些情况下,所涉及的对象不具有多个属性,但是优化依然可应用的并且可产生性能益处。
通过确定访问等同性何时存在-以及还确定访问等同性何时不存在-编译器或其他代码生成引擎可跨属性的在两个或更多个不同类型中被相同命名的实例来优化对该属性的访问。可优化各种情况。优化可针对其类型布局具有共享前缀的对象来作出,但是共享前缀不在每个情况下都需要。例如,在图8中没有共享前缀,因为布局TYP1槽0属性A不等同于布局TYP2槽0属性P,即使A和P具有相同的偏移,这是因为A和P不是相同的属性。除了偏移之外,本文中的一些示例还通过确定属性是否是局部的、属性是否是可写的、属性是否被存储在辅助槽中和/或属性是否具有相同的对象原型以针对等同性来检查访问的其他方面。这些确定以及本文中相关的技术可统一地、个别地或在子集中被成为等同对象类型专门化。
在等同对象类型专门化的一些示例中,编译器发出用于在在动态类型化的编程语言中促进类型安全性的情况下访问对象的属性的直接访问代码。直接访问代码使用被硬编码到对象的存储器区域内的偏移来访问属性的值。在一些情况下,直接访问代码在防护包括至少一个在先访问在内的属性访问序列的单个类型检查后访问该值。在一些情况下,类型检查代码将对象的类型与等同类型高速缓存的指定的防护类型进行比较。可通过使用与等同类型高速缓存相关联的属性等同性记录来检查对象类型与等同类型高速缓存中的类型的因属性而异的访问等同性。当类型关于一属性不是访问等同的时,通过发出用于访问该属性的非直接访问代码来保持类型安全性。等同对象类型专门化可允许针对其类型关于被用在序列中的属性访问等同的对象集,多形态属性序列与单形态属性序列一样高效地被执行。
示例的性质
此处描述的某些示例可以在较宽泛的上下文中查看。例如,诸如高速缓存、编译、动态类型化、硬编码、对象属性、偏移、多形态、序列、类型检查以及类型布局之类的概念可与具体实施例相关。然而,并不能从宽泛上下文的可用性中得出此处对抽象概念寻求专有权;它们并不是专有的。相反,本发明聚焦于提供适当具体的实施例,其技术效果完全或部分地解决特定技术问题并改进计算机系统的功能。涉及高速缓存、编译、动态类型化、硬编码、对象属性、偏移、多形态、序列、类型检查和/或类型布局的其他介质、系统和方法在本范围之外。因此,在对本发明的正确理解下,也避免了模糊性、抽象性、缺少技术性和附带的证据问题。
本文描述的实施例的技术特征对于本领域技术人员而言将显而易见,并且对于各种关注的读者而言也以各种方式显而易见。第一,一些实施例解决技术问题,诸如对类型检查动态选择的类型的执行性能花费、代码优化、类型等同性确定、单形态属性访问机制的缺点以及无论类型布局的改变而保存类型安全性和性能两者。第二,一些实施例包括诸如计算硬件等技术组件,这些技术组件以除了通用计算机中的典型交互之外的方式与软件交互。例如,除了诸如一般的存储器分配、一般的存储器读写、一般的指令执行和某种I/O排序等普通交互之外,本文描述的一些实施例还用单个初始类型检查来防护对象属性访问序列。第三,一些实施例所提供的技术效果包括在类型检查数量方面的减少而没有在类型安全性方面的对应减少、减少的可执行代码指令分段大小和/或增加的ECMAScript兼容语言的执行速度。第四,一些实施例包括技术适应,诸如等同类型高速缓存、属性等同性记录以及使用属性访问简档数据来在直接和非直接访问代码发出之间进行选择的代码生成器。
此外,一些实施例涉及提供对动态类型化的编程语言中的对象的属性的快速且类型安全的访问的技术问题。一些实施例涉及标识在整体具有不同布局的对象类型内访问等同的各个属性的技术问题。一些实施例涉及跟踪属性访问序列的技术问题,属性访问序列可通过减少类型检查的同时没有从而错认哪个数据类型旨在针对被访问的位而被优化。本公开的各示例中所涉及的其他技术问题对于本领域的技术人员而言也将是明显的。
一些术语
现在将参考诸如附图中所示出的那些示例性实施例,并使用特定语言来对其进行描述。但是,相关技术领域的且拥有本公开内容的技术人员将想到的对此处所示出的特征的更改和进一步的修改以及对此处的特定实施例所示的抽象原理的其他技术应用,都应该被视为在权利要求的范围内。
在本公开中阐明了各术语的含义,因此应该在仔细关注这些阐明的情况下阅读权利要求书。给出了具体示例,但是相关领域的技术人员将理解其他示例也可落在所使用的术语的含义范围内以及落在一个或多个权利要求的范围内。各术语不一定需要具有与它们在一般使用中(尤其在非技术使用中)或在特定行业使用中、或在特定字典或一组字典的使用中所具有的意义相同的意义。附图标记可以与各种措词一起使用,以帮助示出术语的广度。从给定文本片段中省略附图标记不一定意味着没有通过文本讨论附图的内容。发明者维护和行使对于他们自己的辞典编纂的权利,包括将语言从本文中的其他位置复制到权利要求书中的权利。所引用的术语被显式定义,但在隐式定义术语时不使用引用标记。这里可在具体实施方式中和/或在申请文件的别处显式地或隐式地定义术语。
如此处所使用的,“计算机系统”可包括例如一个或多个服务器、主板、处理节点、个人计算机(便携式或非便携式)、个人数字助理、智能电话、蜂窝或移动电话、至少具有处理器和存储器的其他移动设备、和/或提供至少部分地由指令来控制的一个或多个处理器的其他设备。指令可以采用存储器中的固件或其他软件和/或专用电路的形式。具体而言,虽然可发生许多实施例在工作站或膝上型计算机上运行,但是其他实施例也可以在其他计算设备上运行,并且任何一个或多个这样的设备都可以是给定实施例的一部分。
“多线程化”计算机系统是支持多个执行线程的计算机系统。术语“线程”应被理解为包括能够或经历调度(以及可能同步)的任何代码,并且也可以另一名称来为人所知,如“任务”、“进程”或“协同例程”等。线程可以并行地、按顺序、或以并行执行(例如,多处理)和顺序执行(例如,时间分片)的组合来运行。在各种配置中都已设计了多线程化环境。执行线程可以并行地运行,或者线程可以被组织为并行执行,但是实际上轮流按顺序执行。例如,多线程化可以通过在多处理环境中在不同核上运行不同线程、通过对单个处理器核上的不同线程进行时间分片、或者通过时间分片和多处理器线程化的某种组合来实现。线程上下文切换可以例如由内核的线程调度器、由用户空间信号、或由用户空间和内核操作的组合来发起。线程可以轮流对共享数据进行操作,或者例如每一线程都可以对其自己的数据进行操作。
“逻辑处理器”或“处理器”是单个独立硬件线程处理单元,如同时多线程实现中的核。作为另一示例,每核运行两个线程的超线程四核芯片具有8个逻辑处理器。逻辑处理器包括硬件。术语“逻辑”被用来防止给定芯片具有至多一个处理器的错误结论;“逻辑处理器”和“处理器”在此可互换地使用。处理器可以是通用的,或者它们可被定制用于特定用途,例如图形处理、信号处理、浮点算术处理、加密、I/O处理等等。
“多处理器”计算机系统是具有多个逻辑处理器的计算机系统。多处理器环境存在于各种配置中。在一给定配置中,所有处理器可在功能上相同,而在另一配置中,由于具有不同的硬件能力、不同的软件分配或两者,某些处理器可与其他处理器不同。取决于配置,处理器可在单个总线上紧密地彼此耦合,或它们可松散地耦合。在某些配置中,处理器共享一中央存储器,在某些配置中,它们各自具有自己的本地存储器,在某些配置中,存在共享和本地存储器两者。
“内核”包括操作系统、系统管理程序、虚拟机、BIOS代码、以及类似的硬件接口软件。
“代码”指的是处理器指令、数据(包括常量、变量、以及数据结构)、或指令和数据两者。
“程序”在本文中被广泛地使用以包括应用、内核、驱动程序、中断处理程序、库、以及程序员(也被成为开发者)编写的其他代码。
“IoT”或“物联网”指可寻址的内嵌的计算节点的任意联网集合。这样的节点是如本文中定义的计算机系统的示例,但是它们还具有以下特征中的至少两个:(a)没有本地人类可读显示;(2)没有本地键盘;(C)输入的主要源是跟踪非语言数据的源的传感器;(d)没有本地转动盘存储-RAM片或ROM片仅提供本地存储器;(e)没有CD或DVD驱动器;(f)内嵌在家用电器中;(g)内嵌在植入式医疗设备中;(h)内嵌在车辆中;(i)内嵌在过程自动化控制系统中;或(j)聚焦于以下之一的设计:环境监视、市政基础设施监视、工业设备监视、能源使用监视、人类或动物健康监视或物流运输监视。
如此处所使用的“包括”允许附加元素(即,包括意味着包含),除非另外指明。“由...构成”意味着基本上由...构成或完全由...构成。当X中的非Y部分(如果有的话)可以被自由更改、移除和/或添加而不在考虑所述权利要求时更改所要求保护的实施例的功能时,X基本上由Y构成。
“进程”在此有时被用作计算科学领域的术语,并且在该技术意义上涵盖资源使用者,即例如协同例程、线程、任务、中断处理程序、应用进程、内科进程、过程和对象方法。“进程”在此还可被用作本领域的专利法术语,例如,在描述与系统权利要求或制品(经配置的存储介质权利要求)相对的过程权利要求时。类似地,“方法”在此有时被用作计算科学领域内的技术术语(一种“例程”)并且还被用作本领域的专利法术语(“过程”)。技术人员将理解在特定实例中旨在是什么含义,并且还将理解给定所要求保护的过程或方法(在专利法的意义上)有时可使用一个或多个过程或方法(在计算科学意义上)来实现。
“自动地”指的是使用自动化(例如,由用于这里所讨论的特定操作和技术效果的软件配置的通用计算硬件),与没有自动化相对。具体而言,“自动”执行的步骤在理论上或在一个人的意识中不是用手执行的,但这些步骤可由人类来启动或由人类来交互式地引导。自动化步骤使用机器执行的以获得在没有由此提供的技术交互的情况下将不会实现的一个或多个技术效果。
技术人员理解技术效果是技术实施例的假定目标。仅仅是在一实施例中涉及计算并且这些计算也可以在没有技术组件(例如,通过纸和笔或甚至作为脑力步骤)的情况下执行的事实不会移除技术效果的存在或更改该实施例的具体且技术的特性。本领域的技术人员会意识到,在一些情况下,计算就是不能通过脑力步骤或通过纸和笔被足够快速且足够可靠地执行来提供一实施例的技术效果。
“在计算上”同样指的是使用计算设备(至少是处理器加上存储器),且排除了仅通过人类思考或仅通过单独的人类动作而获得结果。例如,用纸和笔作算术不是如本文所理解的在计算上作算术。计算结果更快、更宽泛、更深、更准确、更一致、更全面和/或以其他方式提供超出单独的人类表现范围的技术效果。“计算步骤”是通过计算执行的步骤。然而,“自动地”和“在计算上”都不一定意味着“立即”。“在计算上”和“自动地”在此可互换地使用。
“抢先式”意味着没有来自用户的直接请求。的确,用户甚至可能直到已经向该用户呈现一实施例中的抢先式步骤的结果才意识到该步骤是可能的。除非另外指明,否则此处描述的任何计算和/或自动化步骤都可以被抢先完成。
“语言上”表示,通过使用自然语言或通常在面对面人类对人类通信中采用的另一种形式的通信。语言上通信包括例如,说出、键入、或用一个人的手指、手部、面部和/或身体来作出姿势。
贯穿本文,对任选复数“(诸)”的使用意味着一个或多个所指示的特征存在。例如,“(诸)处理器”意味着“一个或多个处理器”或等效于“至少一个处理器”。
贯穿本文,除非另外明确表明,否则对过程中的某一步骤的任何引用都假定该步骤可直接由所关注的一方执行和/或由该方通过介入机制和/或介入实体而间接地执行,且仍然在该步骤的范围内。也就是说,除非直接执行是被明确表明的要求,否则并不要求由关注方对步骤的直接执行。例如,涉及由所讨论的一方执行的诸如相对于一目的地或其他主体的访问、避免、检查、比较、创建、确定、发出、执行、生成、防护、加载、定位、运行、存储、更新、使用(以及访问、被访问的等)等动作的步骤可涉及中间动作,如由某一其他方执行的转发、复制、上传、下载、编码、解码、压缩、解压、加密、加密、认证、调用等,但仍然被理解为是由该所讨论的一方直接执行的。
在参考数据或指令时,要理解这些项配置了计算机可读存储器和/或计算机可读存储介质,从而将其变换为特定物品,而非简单地存在于纸张上、人的头脑中、或仅仅作为例如传播的信号。除非在权利要求中另外指明,否则权利要求不涵盖信号本身。出于美国专利审查的目的,存储器、计算机可读存储介质和任意其他计算机可读介质不是美国专利商标局(USPTO)对In re Nui jten案例的解释下的可授予专利的主题的范围之外的传播信号或载波。
此外,尽管与本文中的其他地方明显相反,但将理解一方面的(a)计算机可读存储介质、计算机可读介质和计算机可读存储器,和另一方面的(b)也被称为信号介质或传播的信号的传输介质之间的清楚区别。传输介质是传播信号或载波介质。相反,计算机可读介质、计算机可读存储介质和计算机可读存储器不是传播信号或载波介质。除非另外声明,否则“计算机可读介质”意味着计算机可读存储介质,而不是传播信号本身。
本文中的一“实施例”是一示例。术语“实施例”与“本发明”不是可互换的;它们中没有一个是术语“示例”。各实施例可自由地共享或借用各方面来创建其他实施例(产生的结果是可操作的),即使所产生的方面组合本身在本文中没有被明确描述。要求每个以及每次许可的组合被显式地描述对于本领域的技术人员而言不是不要的,并且将会与表明到专利说明书是针对本领域的技术人员而写的策略相反。关于从即使少量的可组合特征中得出的可能组合的数量的正规组合性计算和非正规通用直觉也将指示针对本文描述的各方面存在大量的方面组合。因此,要求对每个以及每次组合的显式详述将与要求专利说明书简洁且要求读者具有本技术领域的知识的策略相反。
操作环境
参考图1,用于一个实施例的操作环境100可包括计算机系统102。计算机系统102可以是多处理器计算机系统,或者也可以不是。操作环境可包括给定计算机系统中的一个或多个机器,它们可以群集的、客户机-服务器联网的、和/或对等联网的。个体机器是一计算机系统,且一组协同操作的机器也是计算机系统。给定计算机系统102可以例如用应用被配置用于最终用户、用于管理员、作为服务器、作为分布式处理节点、作为IoT节点和/或以其他方式配置。
人类用户104可以经由键入的文本、触摸、语音、移动、计算机视觉、姿势和/或其它形式的I/O,通过使用显示器、键盘和其它外围设备106来与计算机系统102交互。用户界面可支持实施例和一个或多个人类用户之间的交互。用户界面可包括命令行界面、图形用户界面(GUI)、自然用户界面(NUI)、语音命令界面和/或其它界面呈现。用户界面可以在本地台式计算机或例如智能电话上生成,或者它可以从web服务器生成并被发送到客户机。用户界面可被生成为服务的一部分并且它可以与诸如社交网络服务等其它服务集成。给定操作环境包括支持这些不同的用户界面生成选项和使用的设备和基础结构。
例如,自然用户界面(NUI)操作可使用例如语音识别、触摸和指示笔识别、屏幕上和屏幕附近的姿势识别、空中姿势、头部和眼睛跟踪、话音和语音、视觉、触摸、姿势、和/或机器智能的那些方法。NUI技术的一些示例包括触敏显示、话音和语音识别、意图和目的理解、使用深度相机(如立体相机系统、红外相机系统、RGB相机系统、以及这些的组合)的运动姿势检测、使用加速度计/陀螺仪的运动姿势检测、面部识别、3D显示、头部、眼睛和注视跟踪、浸入式增强现实和虚拟现实系统,所有这些都提供更自然的接口,以及用于使用电场传感电极(脑电仪和相关工具)的传感大脑活动的技术。
作为另一示例,游戏可以驻留在Microsoft XBOX(微软公司的商标)服务器或其他游戏服务器上。游戏可从控制台购买或者整体或部分在服务器上、在控制台上、或在两者上执行。多个用户可以使用标准控制器、空中姿势、语音或使用诸如智能电话或平板等附随设备来与该游戏交互。给定操作环境包括支持这些不同的使用场景的设备和基础结构。
系统管理员、开发人员、工程技术人员、以及最终用户各自都是特定类型的用户104。代表一个或多个人操作的自动化代理、脚本、回放软件等也可以是用户104。在某些实施例中,存储设备和/或联网设备可以被认为是外围设备。图1中未示出的其他计算机系统可以按各技术方式与计算机系统102进行交互,或者例如通过网络接口设备使用到网络108的一个或多个连接与另一系统实施例进行交互。
计算机系统102包括至少一个逻辑处理器110。计算机系统102与其他合适的系统一样,还包括一个或多个计算机可读存储介质112。介质112可以是不同的物理类型。介质112可以是易失性存储器、非易失性存储器、被安装就位的介质、可移动介质、磁介质、光学介质、固态介质和/或其他类型的物理可持续介质(而不仅仅是传播信号)。具体而言,诸如便携式(即外置)硬盘驱动器、CD、DVD、记忆棒、或其他可移动非易失性存储器介质之类的经配置的介质114在被插入或以其他方式安装时可以在功能上变为计算机系统的技术部分,从而使其内容可被访问以供与处理器110交互并由处理器110使用。可移动的经配置的介质114是计算机可读存储介质112的示例。计算机可读存储介质112的某些其他示例包括内置RAM、ROM、硬盘、以及其他不能被用户104轻松地移走的存储器存储设备。为了符合当前美国专利要求,计算机可读介质、计算机可读存储介质和而计算机可读存储器都不是信号本身。
介质114用可由处理器110执行的指令116来配置;“可执行”在此以宽泛的意义被使用以包括机器代码、可解释代码、字节码和/或在例如虚拟机上运行的代码。介质114还被配置有数据118,该数据通过指令116的执行被创建、修改、引用和/或以别的方式用于技术效果。指令116和数据118配置它们所驻留的存储器或其它存储介质114;当该存储器或其它计算机可读存储介质是给定计算机系统的功能部分时,指令116和数据118还配置该计算机系统。在某些实施例中,数据118的一部分代表了诸如产品特征、清单、物理测量值、设定、图像、读数、目标、卷等等之类的现实世界的项。这一数据还通过备份、还原、提交、中止、重新格式化和/或其它技术操作来变换。
尽管一实施例可被描述为被实现为由计算设备(例如通用计算机、蜂窝电话、或游戏控制台)中的一个或多个处理器执行的软件指令,但这一描述并非意味着穷尽所有可能的实施例。技术人员将会理解还可经常整体地或部分地直接用硬件逻辑来实现相同或相似功能,以提供相同或相似的技术效果。作为对软件实现的替换或补充,本文描述的技术功能可以至少部分地由一个或多个硬件逻辑组件来执行。作为示例并且不排除其它实现,一实施例可包括硬件逻辑组件,诸如现场可编程门阵列(FPGA)、专用集成电路(ASIC)、专用标准产品(ASSP)、片上系统组件(SOC)、复杂可编程逻辑器件(CPLD)和类似组件。一实施例的组件可基于它们的输入、输出和/或它们的技术效果来被分组成各个交互功能模块。
在示出的环境100中,一个或多个应用120具有代码(诸如源代码122和可执行代码124),其包括对象126、例程128以及其他构造(有时成为“人工产物”)。源122用一个或多个编程语言130来撰写。从具有给定编程语言130的源中创建的可执行代码有时被称为具有该语言130,但是可执行代码被理解为包括机器代码。如本文中使用的,“机器代码”表示低层代码或针对特定硬件体系结构定制的或针对特定虚拟机体系结构定制的计算机代码。一些机器代码的熟悉示例包括经编译的代码、微代码、固件代码、二进制代码、本机代码、对象代码、汇编语言代码、p-代码、字节代码、动态链接库代码以及常见的中间语言代码。
如指示的,一些环境100包括通过产生和/或转换代码122、124来协助软件开发的软件开发工具132,诸如编译器134、解释器136以及调试器137。代码122、124、工具121、以及图中和本文中讨论的其他项可各自部分或全部驻留于一个或多个硬件介质112中,由此配置那些介质以实现所有硬件-软件合作操作中固有的“正常”(即,最小公分母)交互的技术效果。除了处理器110(CPU、ALU、FPU和/或GPU)、存储器/存储介质112、显示器138和电池之外,操作环境还可包括其它硬件,诸如总线、电源、有线和无线网络接口卡和加速度计,这些硬件的各自操作在此被描述为并非已经对技术人员显而易见。
给定操作环境100可包括向开发者提供一组协调的软件开发工具132(诸如AOT编译器、JIT编译器、源代码编辑器、剖析器、调试器等)的集成开发环境(IDE)140,。具体而言,对于一些实施例,合适的操作环境中的一些包括或帮助创建被配置成支持程序开发的Visual开发环境(微软公司的商标)。一些合适的操作环境包括环境(Oracle America有限公司的商标),并且一些操作环境包括利用诸如C++或C#(“C-Sharp”)等语言的环境,但本文的教导适用于各种各样的程序设计语言、程序设计模型、以及程序,以及本质上适用于软件开发领域之外的使用内联的技术努力。
在附图中以轮廓形式示出了一个或多个项来强调它们不一定是所示操作环境或所有实施例的一部分,但是可以与此处讨论的操作环境或一些实施例中的各项互操作。未采用轮廓形式的项在任何附图或任何实施例中也不一定是必需的。具体而言,图1是为了方便而提供的;在图1中包括一项目不暗示该项目或对该项目的描述使用在本发明之前是已知的。
技术人员将认识到此处在“操作环境”下呈现的上述各方面和其它方面还可形成给定实施例的一部分。本文的标题不旨在提供将特征严格地归类成实施例和非实施例特征类别。
系统
图9示出一些系统102的一个整体视图。框902表示代码执行和简档收集。执行可包括例如,运行二进制代码、解释字节代码和执行经JIT编译的代码。简档收集包括收集关于在对象属性204加载和存储期间遇到的类型的信息以及将该信息聚集到多形态内联高速缓存246和/或其他多形态属性访问简档232内。属性访问可作为单形态访问开始,其中每个访问包括类型检查、加载偏移以及接着加载或存储在该偏移处的值。根据框904,优化可移除一些类型检查和/或移除一些偏移加载,而不减少类型安全性。优化可利用等同类型高速缓存238和其他结构来产生经优化的代码124,该经优化的代码124包括例如直接属性访问代码224来代替非直接代码228。根据框906,经优化的代码作为应用120的一部分来执行。Web浏览器以及由它们作为插件或以其他方式运行的脚本或其他代码是应用的示例。
图2示出了适合与一些实施例一起使用的体系结构的各方面。代码生成器202通常位于编译器134内。编译器可在一个机器上,而代码生成器的输出形成不同机器上的应用120的一部分。代码生成器202输出尤其包括用于访问对象属性204的可执行代码124的片段,称为属性访问206。属性访问206可被执行其他操作的代码122、124加括号,或属性访问206可在属性访问206序列208中。任一给定属性访问在存储器112区域216中读或写属性值210。值210可被读取来用在计算(诸如加法)或字符串打印中,或者它们可作为调用属性(其是对象方法)的一部分来被读取。读取值的访问206有时被称为“加载”,而将值写入到对象属性内的那些访问有时被称为“存储”。
在一些示例中,对象126具有定义的类型212,其定义对该对象所许可的操作。类型212还隐式地或显式地定义布局214,其在一给定实现中指定存储器112中对象属性的次序、大小和相互关系。布局214可指定一些属性值被存储在属性头部218中,而其他属性值被存储在例如由头部条目指向的位置处,或者值可被存储在辅助阵列244中。在一给定实现中,每个属性204被分派存储器112中的特定数量的位或字节,并且不同的属性可被分派不同量的存储器。当一给定属性所占据的存储器的实际大小不是讨论的重点时,被分派到该给定属性的存储器有时被称为该属性的槽220。槽通常以0开始编号,但是一些开发者以1开始对它们进行编号。对象布局214也可从对象原型222继承或被对象原型222影响。
在一些示例中,代码生成器202输出包括用于访问对象属性204的具有被硬编码的偏移226的直接访问代码224,并且在一些情况下,代码生成器202输出包括用于访问对象属性204的非直接代码228。直接访问代码224比非直接访问代码228更快(有时一个数量级或更快)。直接访问代码224假设先前被硬编码的偏移226依然是正确的,而非直接访问代码228计算当前偏移。
在一些示例中,代码生成器202在发出直接访问代码224和发出非直接访问代码228之间进行选择来实现正被编译的给定属性访问206。如本文中详细解释的,在一些情况下,在直接和非直接属性访问代码之间的选择基于以下中的一个或多个,或使用以下中的一个或多个来实现所选的代码:可尤其被实现为一种多形态内联高速缓存246(又称PIC246)的多形态属性访问简档232中的类型212集230、属性索引234、等同类型高速缓存238的条目236、属性等同性记录240的条目236、编译器值表242中的类型212集230。
一些实施例向计算机系统102提供由电路系统、固件和/软件配置的用于提供诸如本文中描述的使用直接访问代码224来代替非直接代码228的技术效果的逻辑处理器110和存储器介质112。在一个示例中,被配置用于生成和执行针对动态类型化的编程语言中的属性访问的机器代码的系统102包括至少一个处理器110以及与处理器可操作上通信的存储器112。系统102还包括以下各项中的至少一者:直接访问代码生成器202、所生成的直接访问代码224或属性等同性记录240。一些系统既包括直接访问代码生成器202也包括所生成的直接访问代码224。一些系统包括直接访问代码生成器202、所生成的直接访问代码224以及属性等同性记录240。
在一些示例中,直接访问代码生成器202发出针对属性访问206的直接访问代码224以访问对象126的属性204。对象126具有类型212。直接访问代码224在以下条件被满足时被发出:在对应于该属性访问的多形态内联高速缓存246中标识的类型212是等同的,以及从多形态内量高速缓存中检索的类型集230和与编译器134值表242中的对象的类型相关联的类型集230相匹配。熟悉的机制可被用于从编译器的元数据集合中检索类型集230。
图6示出多形态内联高速缓存246的示例,伴随有类型212被实现为指向布局结构(参见例如图8中的布局结构TYP1和TYP2)的存储器地址以及伴随有进入到属性位置图内的属性索引234。多形态内联高速缓存246与给定属性访问206相关联。在条目0,例如,如果对象a来自具有类型typ0的示例源代码,则针对a的布局结构在地址0x1FFA0240处并且对象a的属性x位于槽2中。在一些实现中,PIC 246具有可变大小,诸如具有4到32个条目236,并且在一些实现中,PIC条目的数量由编译器基于在应用120的执行期间遇到的对象类型的数量和分布来调整。多形态内联高速缓存246是多形态访问简档232的阵列实现的示例。出于公开范围的目的,本文中的任何描述可被认为已经用替代于“多形态内联高速缓存”的“多形态访问简档”或其等价体“多形态属性访问简档”来重复,并且附图标记相应地从246改到232,或反之亦然。
在一些示例中,多形态内联高速缓存246条目236包括属性索引234。在操作中,与给定属性访问206相关联的多形态内联高速缓存中的类型212仅在确定该多形态内联高速缓存的所有条目都包括与该多形态内联高速缓存的第一个条目相同的属性索引之后才被确定为等同的。在一些示例中,与给定属性访问206相关联的多形态内联高速缓存中的类型212仅在确定以下条件之一被确切地满足之后才被确定为等同的:该多形态内联高速缓存中的所有类型都描述包括该给定属性的对象126,或该多形态内联高速缓存中的所有类型描述共享原型222的对象126并且该原型包括该给定属性204。在一些示例中,与给定属性访问206相关联的多形态内联高速缓存中的类型212仅在确定以下条件之一被确切地满足之后才被确定为等同的:该多形态内联高速缓存中的所有类型都描述在对象的头部218上的槽220中具有该给定属性的值的对象126,或该多形态内联高速缓存中的所有类型都描述在对象的辅助槽阵列244上的槽中具有该给定属性的值的对象。
在一些示例中,系统102包括针对属性访问的用于访问对象126的属性的所生成的直接访问代码224,并且属性访问206是属于属性访问序列208的非直接访问。对象具有类型212以及所分派的存储器区域216。直接访问代码224在被处理器110执行之际访问位于对象的存储器区域216中被硬编码的偏移226处的属性204的值210。直接访问代码224在以下方面被优化:其在比较类型检查确定对象的类型212匹配与属性访问序列208相关联的等同类型高速缓存238(ETC 238)中的条目236之后访问该值,而不需要进一步的类型检查。
图10示出具有固定大小阵列形式的ETC 238的一示例实现,该固定大小阵列具有针对8个条目的空间,8个条目中的每一个是类型标识符(即类型布局214的存储器地址)的大小。在其他实现中,不同数量的条目236被用在ETC 238中,例如4个条目、12个条目、16个条目或另一数量。ETC 238在编译期间被创建但在执行期间被使用。在一些实施例中,其不被存储在机器代码可执行文件中,而是被维护在运行时系统数据结构中。ETC 238的第一个条目236被用作防护类型,而其他条目具有附加经高速缓存的类型212。
在一些示例中,所生成的直接访问代码224包括动态类型属性访问206序列208,所有动态类型属性访问206由使用例如图10的ETC 238防护类型1002的单个类型检查来防护。以上具有函数foo()的示例源代码是具有动态类型属性访问206序列206的多个可能源代码122之一。针对这样的代码的简档232数据收集可使用熟悉的机制来实现。示出的简档访问在对象a具有在运行时被分配的不同类型的意义上、在对象b具有在运行时被分配的不同类型的意义上和/或在对象a的类型在布局上与对象b的类型不同的意义上可以是多形态的。访问206中的每一个具有其自己的相关联的PIC 246;访问206在源中被a.x.、b.x、a.y和b.y来表示。
在一些示例中,所生成的直接访问代码224包括不同类型212的对象的所访问的属性的属性访问206序列,并且这些类型212在布局2 214方面与所访问的属性是等同的。这可例如在以下条件之一被确切地满足时发生:所有所访问的属性204是局部属性,或每个所访问的属性204来自原型222并且所有所访问的属性来自该相同原型。在一些示例中,所生成的直接访问代码224包括不同类型212的对象126的所访问的属性的属性访问序列,并且属性访问206全部内联(例如,在头部中218或可不需要通过指针的间接来访问)或者它们全部在辅助槽阵列244中。
在一些示例中,系统102包括属性等同性记录240,其针对被单个类型检查防护的属性访问序列208中的每个属性访问206具有一个条目236。图11示出属性等同性记录240的一个示例实现,其可适合于其中对象属性204可被指定为可写或不可写以及其中对象属性可被内联地存储或存储在辅助阵列244中的环境100。在其他示例中,如果所有属性都是可写的,则用于跟踪属性是否是可写的列可被移除。类似地,在其他示例中,如果所有属性被内联地存储,则用于跟踪属性值是否被存储在辅助阵列244的槽中的列可被移除。
在一些实现中,每个属性访问206都具有一个属性等同性记录240,其中显式类型检查被用于该访问以确保类型安全性。属性等同性记录240针对被单个类型检查所防护的给定访问序列中的每个属性访问具有一个条目。由此,在初始访问206后,属性等同性记录240帮助保护对该序列中相同对象的后续访问。例如,在样本源代码中,如果a.x和a.y访问对象a的相同类型的属性,则一个优化避免(忽略、跳过)在检查已经对访问a.x作出之后对访问a.y的类型检查。
在某些实施例中,诸如人类用户I/O设备(屏幕、键盘、鼠标、图形输入板、话筒、扬声器、运动传感器等等)之类的外围设备106将可以在操作上与一个或多个处理器110和存储器进行通信。然而,一实施例也可以深嵌入在诸如物联网的一部分等的技术系统中,以便没有人类用户104直接地且与语言上该实施例进行交互。软件进程可以是用户104。
在某些实施例中,该系统包括通过网络连接的多个计算机或其他设备102。网络接口设备可以使用例如诸如分组交换网络接口卡、无线收发机或电话网络接口之类的组件提供对网络108的接入,并可存在于给定计算机系统中。然而,一实施例也可以通过直接存储器存取、可移动非易失性介质、或其他信息存储-检索和/或传输方法来传递技术数据和/或技术指令,或者,计算机系统中的一实施例可以在不与其他计算机系统进行通信的情况下操作。
某些实施例在“云”计算环境和/或“云”存储环境中操作,其中计算服务不是自有的,而是按需提供的。例如,代码生成器202可在联网云中的一个设备/系统102上发出代码224、228,并且包括该代码的应用120的副本可被存储在该云内的其他设备上。
过程
图3用流程图300示出了某些过程实施例。各附图中示出或以其他方式公开的技术过程可以在某些实施例中(例如通过编译器代码生成器202)自动执行,例如在脚本的控制下或以其他方式需要极少或不需要同时的实况用户输入。除非另外指明,否则过程也可以部分自动地且部分手动地执行。在一给定实施例中,可以重复过程的零个或更多个所示出的步骤,有可能利用不同的参数或数据来操作。一实施例中的步骤也可以按照与图3中展示的自顶向下次序不同的次序来执行。步骤可以串行地、以部分重叠的方式、或完全并行地执行。遍历流程图300以指出在过程中执行的步骤的次序可以在过程的一次执行与该过程的另一次执行之间不同。流程图遍历次序也可以在一个过程实施例与另一过程实施例之间不同。各步骤还可以被省略、组合、重命名、重组、或以其他方式偏离所示出的流程,只要所执行的过程是可操作的,并符合至少一个权利要求。
此处提供了帮助示出该技术的各方面的示例,但是在本文内给出的示例并未描述所有可能的实施例。实施例不仅限于此处所提供的具体实现、布置、显示、特征、方法或情形。给定实施例可包括例如附加的或不同的技术特征、机制、和/或数据结构,并可以以别的方式偏离此处所提供的示例。
在一些示例中,提供用于使用等同对象类型专门化来执行动态类型化的编程语言中的属性访问序列的算法过程。例如,该过程可执行至少两个全部被单个检查类型所防护的动态类型属性访问的序列。
在一些情况下,过程运行304代码,该代码使用314 ETC 238通过将对象类型212与等同类型高速缓存238的指定的防护类型1002进行比较来进行类型检查。当对象类型等于指定的防护类型时,接着无需运行进一步的类型检查代码320(从而避免342类型检查开销),过程执行代码224,该代码224访问324被硬编码到对象的存储器112、216内的偏移226处的属性的值。当对象类型不等于指定的防护类型时,过程运行318类型检查比较代码320,其将对象类型212与等同类型高速缓存238的至少一个次级(非初始)条目236进行比较。当类型检查比较代码320确定330对象类型匹配等同类型高速缓存中的任一条目时,接着无需运行进一步的类型检查代码(从而避免342开销),过程执行针对属性访问序列208的代码,其中每个属性访问加载属性值或存储属性值,并且其中每个非初始属性访问访问被硬编码到对象的存储器内的偏移处的位置。当类型检查比较代码确定330对象类型不与等同类型高速缓存中的任意条目匹配时,过程执行代码,该代码确定328对象类型是否等同于关于所访问的属性的等同类型高速缓存中的类型。该确定328使用340与等同类型高速缓存相关联的属性等同性记录来进行。
在一些示例中,过程通过插入在类型检查比较代码320的执行期间没有被初始地发现在等同类型高速缓存的任意条目中的对象类型212来更新346等同类型高速缓存。
在一些示例中,过程将多个属性访问206执行到不同类型的对象126中,但是所有对象针对所访问的属性是等同的。不同的类型具有不同的布局214,并且布局不必在相同的偏移处具有被相同命名的属性的任意共享的前缀。在一些情况下,所访问324的属性204全部是局部的或它们全部来自相同的原型。在一些情况中,所访问的属性全部内联在对象的头部218中,或所访问的属性全部在对象的辅助槽阵列244中。
经配置的介质
一些实施例包括经配置的计算机可读存储介质112。介质112可包括盘(磁盘、光盘,或其他)、RAM、EEPROM或其他ROM、和/或其他可配置存储器,特别包括计算机可读介质(而不仅仅是传播信号)。经配置的存储介质可以特别地是诸如CD、DVD或闪存之类的可移动存储介质114。可以是可移动的或不可移动的且可以是易失性的或非易失性的通用存储器可被配置到使用诸如经优化的代码生成器202、ETC 238、和PER 240等项目的实施例中来形成配置的介质,这些项目采用从可移动介质114和/或诸如网络连接等另一源读取的数据118和指令116的形式。
经配置的介质112能够使计算机系统执行本文所述的用于属性访问代码优化的技术过程步骤。由此,附图1、2、6、8和9-11帮助示出了经配置的存储介质实施例和过程实施例,以及系统和过程实施例。具体而言,图3、9和/或图12-15中示出的各过程步骤中的任一步骤或本文以其他方式教导的任一步骤可被用来帮助配置存储介质来形成经配置的介质实施例。出于公开范围的目的,在这个“经配置的介质”标题下的讨论被视为在“过程”标题下重复,并且在“过程”标题下的讨论被视为在这个“经配置的介质”标题下重复。此外,过程也在本公开的其他地方处被讨论,而不在以上任何标题下。标题仅仅是为了方便;它们不对本文中教导的范围或内容进行限制。
在一些示例中,计算机可读存储介质112被配置有数据118和指令116,该指令116在被至少一个处理器110执行时使得该处理器执行用于使用等同对象类型专门化来生成针对动态类型化的编程语言130中的属性访问206序列208的机器代码124的算法过程。以下描述一些代码生成302示例。如之前提到的,出于公开范围的目的,对多形态内联高速缓存246的引用可由对多形态属性访问简档232的引用来被替换。
在一些示例中,代码生成302过程包括以下。当对象126的多形态内联高速缓存246中的类型212不是等同的时,经优化的代码生成器202发出308非直接属性访问代码228。非直接代码228是包括用于针对没有开始属性访问序列的至少一个属性访问使用多形态内联高速缓存的指令116的代码124。当对象的多形态内联高速缓存中的类型被确定328是等同的,但是从编译器值表242中没有可用的类型集230要与从对象的多形态内联高速缓存中计算的经高速缓存的类型集进行比较时,经优化的代码生成器202创建等同类型高速缓存238并发出316针对开始属性访问序列的属性访问206的类型检查代码320。当对象的多形态内联高速缓存中的类型是等同的并且从编译器值表242中检索322到类型集以供使用323,但是对象的多形态内联经高速缓存的类型集不匹配从编译器值表中检索到的类型集时,经优化的代码生成器202发出308非直接属性访问代码。然而,当对象的多形态内联高速缓存中的类型被确定328是等同的并且对象的多形态内联经高速缓存的类型集匹配从编译器值表中检索322到的类型集时,经优化的代码生成器202发出306直接属性访问代码224,其在执行之际直接地访问324在属性的对象的存储器区域216中被硬编码的偏移226处的属性值。
在一些示例中,发出308非直接属性访问代码228包括在对象类型属性图中定义326属性的索引234,其相比于直接访问代码224在发出和执行方面更加昂贵(更慢,更多用于处理的指令)。非直接访问代码访问被属性的索引指示的存储器112位置处的属性值。
在一些示例中,仅在确定对象的多形态内联高速缓存246中的所有条目236都具有与该高速缓存的第一个条目相同的值之后,对象的多形态内联高速缓存246或所使用310的其他属性访问简档232中的类型212才被确定328是等同的。图13示出用于针对给定属性访问来确定类型集是否是等同的一个过程。即,图13描绘了确定多形态内联高速缓存中的所有类型针对所访问的属性是否等同的算法。预期的索引变量被分配1302第一个高速缓存246条目236的值。循环发生以走查通过各条目,进而将每个条目视为当前条目。当前条目与预期的索引进行比较1304。如果它们是相等的并且当前条目是最后一个条目,则高速缓存被标记1306为仅具有等同类型212并且等同性确定完成。如果当前条目与预期的索引是相等的,但是当前条目不是高速缓存246中的最后一个条目,则下一条目变成1308当前条目并且控制如显示的循环。如果当前条目与预期的条目从来不等同,则高速缓存被标记1310为缺乏等同类型212(即,被标记为具有至少两个相互不等同的类型),并且等同性确定完成。
在一些示例中,只有在确定332序列中的属性访问全部将是局部的或者全部将针对相同的原型来作出之后,对象的等同类型高速缓存238中的类型才被确定为是等同的。在一些示例中,只有在确定334序列中的所有属性存储将对可写属性来作出之后,对象的等同类型高速缓存238中的类型才被确定为是等同的。在一些示例中,只有在确定336访问序列中要被访问的属性全部都是内联的或全部都将通过辅助槽来访问之后,对象的等同类型高速缓存中的类型才被确定为是等同的。
在一些示例中,对等同类型高速缓存238的使用在ETC 238的编译器创建312之前。创建等同类型高速缓存238可至少部分通过创建包括指定的防护类型条目1002以保持指定的防护类型的高速缓存来完成。指定的防护类型条目可在固定大小的阵列中,该阵列具有针对多个次级条目以保持附加类型的空间。
一些示例包括创建338属性等同性记录240。PER 240具有针对被单个类型检查所防护的属性访问序列中的每一个属性访问206的条目。图11示出PER 240的一个实现,其针对具有不可写属性和辅助槽阵列的环境来定制。
图12、14和15进一步示出在一些实施例中对PIC 246(或其他属性访问简档232)和/或ETC 238的创建、填充和使用。在图9示出的上下文中,图14示出主要在根据框902的执行和简档收集期间发生的活动,图15示出主要在根据框904的经优化的代码的生成期间发生的活动,并且图12示出主要在根据框906的经优化的代码的执行期间发生的活动。然而,本领域的技术人员将意识到,每个附图还帮助示出在其他时间发生的活动,因为结构(诸如PIC和ETC)在各个时间被创建和/或使用。
图14示出用于针对多形态属性访问的简档收集的一些过程,包括针对更快属性访问的PIC填充和使用。示出的过程图包括在所收集的简档信息中定位1402多形态属性访问数据,加载1404对象类型212,寻找1406简档条目以及将对象类型与简档条目236进行比较1408。如果对象类型匹配简档条目,则过程从简档条目中加载属性的索引234并基于该属性索引来移动1412属性值。如果对象类型不匹配简档条目,则过程从属性图中加载1414属性的索引234,基于该属性索引来移动1412属性值,并更新1416属性访问简档,使得找到匹配的机会在下一比较1408上被提升。
作为具体示例,考虑在以上示例源代码中的属性访问a.x。该访问206具有相关联的PIC 246,此处被表示为PIC1,其可例如被实现为进入PIC 246阵列的索引。一个符合图14的过程加载PIC1,从对象a中加载1404对象a的对象类型(参考例如图8,其中对象类型被表示为TYP1和TYP2),并例如通过使用散列表或线性搜索来定义1406针对该对象类型的PIC1高速缓存条目。如果对象类型匹配(过程已经在之前看到过该对象或其类型),则在运行时过程从PIC1条目中加载1410属性索引,并接着将属性值210加载或存储到被该属性索引指示的对象a上的存储器位置。如果对象类型不匹配,则在运行时可使用更慢的方式。过程在对象类型的属性图中(例如,在布局214中)定位1414属性索引,并将属性值210加载或存储到被来自属性图的属性索引指示的对象a上的存储器位置。接着,PIC1条目被盖写,以用对象a的类型和来自属性图214的属性索引来更新1416PIC1。
图15示出用于生成关于至少一些属性访问来优化的代码的一些过程。显示的过程图包括尝试在收集应用简档信息中定位1402属性访问简档。该尝试返回不需要被填充的简档232,使得过程检查1502简档232以查看其是否被填充以及它包括什么种类的信息。如果简档没有被填充,则过程发出308例如使用单形态高速缓存信息的较不优化的非直接代码。如果简档被多形态属性访问信息填充,则过程发出1504可包括被硬编码的偏移226的经对象类型专门化的属性访问代码。如果简档被非单形态属性访问信息填充并且类型等同性没有清晰地存在,则过程发出308例如使用多形态高速缓存信息的较不优化的非直接代码。如果简档被非单形态属性访问信息填充但是类型等同性清晰地存在,则过程尝试从编译器值表中检索322类型集。该值表包括在编译中的给定点处存活的每个符号的值以及语义信息,例如对象的类型。“值”在此处指值编号算法中的值,而不是给定用户变量将对其执行的值。如果类型集被检索322,则访问类型集和检索到的类型集被比较1506。如果它们不匹配,则过程发出308使用多形态高速缓存信息的较不优化的非直接代码,但是如果它们匹配,则过程发出306更优化的直接属性访问代码。如果没有类型集被检索322,则过程创建312ETC238,用目前的类型来填充1508ETC,并发出316类型检查代码320。
在一些示例中,符合图15的过程在编译期间发生,之后是经编译的函数的控制流以及针对每个所遇到的属性访问来执行图15的步骤。经优化的代码的生成结合以下在编译期间发生:对经编译的函数的控制流的分析以确定,针对每个经优化的属性访问,编译器可正确地假定(或还通过发出适当的类型检查来确保)只有等同类型的对象才能达到该属性访问。一些示例使用值跟踪和编号机制来针对每个其属性访问要被优化的对象126跟踪预期的类型或可能的等同类型集。一些示例还跟踪每个要被优化的序列中的所有属性访问操作。
在一些示例中,符合图15的过程在所收集的简档信息中定位1402属性访问数据。如果数据没有被填充,则过程发出使用单形态高速缓存的较不优化的代码,这与图14一致。如果数据被填充并且是单形态的,则过程发出经对象类型专门化的属性访问代码,这也与图14一致。如果所填充的数据不是单形态的,则过程检查等同性是否存在,这与图13一致。如果等同性不存在,则过程发出使用多形态高速缓存(PIC)的较不优化的代码,这与图14一致。如果等同性存在,则过程尝试从编译器符合值表242中检索针对对象的预期的类型集。类型集可能是空的。如果类型集不可用,则注意力从PIC切换到ETC。例如,过程创建新的ETC(这与图11一致),并用来自PIC的信息来填充它,将第一类型放置为防护1002。接着,过程发出将加载对象的类型并将其与ETC防护类型进行比较的类型检查代码320。接着,过程发出306从对象的存储器中的被硬编码的偏移中的直接属性值加载代码/进入到对象的存储器中的被硬编码的偏移中的直接属性值存储代码。这是快速访问代码,潜在地在即使存在有不同布局的多形态的情况下依然与单形态访问一样快速。如果类型集可用,则过程比较类型集。如果它们匹配,则过程发出306从对象的存储器中的被硬编码的偏移中的直接属性值加载代码/进入到对象的存储器中的被硬编码的偏移中的直接属性值存储代码。如果类型集不匹配,则完全优化不是适当的,所以过程发出使用PIC信息的较不优化的代码。
在一些示例中,经优化的代码生成器(又称发射器)202使用包括在PIC中的信息来决定是否能应用等同对象类型优化。如果生成器202决定应用优化,则它将生成经优化的代码并创建ETC,其中所发出的代码将在它被执行时使用。代码生成器使用PIC中的信息来填充ETC以及ETC所包括(或与其链接的)的属性等同性记录。当所发出的代码稍后被执行时,它将对其属性要被加载或存储的对象进行操作。所发出的代码将针对ETC中的类型来比较这个对象的类型。如果该类型匹配防护类型或8槽类型数组中的任意类型,则执行进行以将属性值直接地224加载或存储到对象的存储器中的槽。如果对象的类型不匹配ETC中的任意类型,则来自这个ETC的等同性记录被用于针对这个序列中的属性来确定对象的类型(推测之前没有遇到过)是否实际上等同于ETC中的类型。换言之,属性等同性记录仅在高速缓存未命中之后被使用。被用来使用属性等同性记录来确定对象的类型与ETC中的类型的等同性的工作在某种程度上类似于代码生成器在检查PIC时所做的,但是其是在执行期间而非在编译期间完成的。
图12示出用于执行关于至少一些属性访问来优化的代码的一些过程。过程从对象的头部218加载1202对象的类型212,并将对象的类型与防护类型1002进行比较1204。如果它们是相等的,则接下来运行的代码将是用于从被硬编码到对象的所分派的存储器216内的偏移226处的位置中加载1206或存储1208属性值的代码。如果对象的类型不匹配防护类型,则这可能是由于防护是空值。一些示例针对空值防护来执行检查1210,其在相对不平常的情况中被用作用于将由JIT编译器生成的代码跳出1212到经解释的模式内的信号。这个空值防护跳出可在例如当属性不再是可写的、已经从原型中移除或已经被隐藏时发生。过程针对对象的类型来检查314ETC;如果找到匹配,则优化代码被运行304。如果没有找到匹配,则过程使用340PER来尝试并验证328对象的类型等同于防护类型。如果是等同的,则ETC被更新346并且优化代码被运行304。否则,过程跳出1212到解释器136。
作为具体示例,一个过程从对象的头部加载1202对象a的类型,并将对象a类型与防护类型进行比较。在一些示例中,ETC的位置被直接硬编码在所发出的机器代码中。如果类型是相等的,则最快速的代码被运行,其使用被硬编码到对象a的存储器内的偏移来加载或存储属性值。如果类型不是相等的,则代码将对象a的类型与ETC中经高速缓存的类型中的每一个进行比较,直到找到匹配或不存在更多的类型。如果找到匹配,则最快速的代码被运行,其使用被硬编码到对象a的存储器内的偏移来访问属性值。如果在ETC中没有找到匹配,则代码尝试使用ETC中的PER来验证对象a的类型针对这个属性访问是等同的。如果不是等同的,控制从经优化的代码跳出到解释器。如果是等同的,则代码通过将对象a的类型(即,类型的布局的地址)作为防护类型来插入到ETC内来更新ETC。
其他示例
下面提供了额外的细节和设计考虑。如同此处的其他示例,在给定实施例中,所描述的特征可以单独地使用和/或组合地使用,或根本不使用。
那些本领域的技术人员将理解,实现细节可以涉及诸如特定API、特定存储器地址、特定属性和对象名称和特定样本程序之类的特定代码,且因此不必出现在每个实施例中。本领域的技术人员还将理解,在讨论细节时所使用的程序标识符和某些其他术语是针对具体实现的,且如此不必涉及每个实施例。尽管如此,虽然它们不一定需要出现在这里,但是提供了这些细节,因为它们通过提供上下文可以帮助一些读者,和/或可以示出此处所讨论的技术的许多可能的实现中的一些。
以下讨论是从某个Windows 9“阈值(Threshold)”文档中得出的。Windows 9是由微软公司实现的软件,并且沿着“阈值”一般在营销或其他材料(来自第三方以及微软)中指软件(微软公司的标记)的版本。这个软件和/或文档的各方面与本文描述的实施例中的一些的各方面一致或另行解说本文描述的实施例中的一些的各方面。然而,要理解,这样的文档和/或实现选择不必约束本文中描述的任意示例或实施例的范围,且同样地“Windows 9阈值”代码和/或其文档将很好地包含位于这些实施例和示例范围外的特征。还要理解,下面的讨论是部分作为对未必是本领域技术人员的读者的帮助的一部分来提供的,并且因此可能包含和/或省略了其下面的引述没有被阉割要求来支持本公开的细节。
本文中的一些教导关注等同对象类型专门化的算法和实现。等同对象类型专门化允许针对其类型关于被用在序列中的属性等同的对象集,访问多形态属性的一些序列与具有单形态属性的序列一样高效地被执行。在本文中教导的类型等同性下,两个或更多个不同的对象布局(类型)可具有被定位在离开对象的开始的匹配偏移处的公共属性子集。该公共子集可包括但不限于,在对象的存储器的开始处的属性和/或在存储器中被相互紧接地存储的属性。这样的类型等同性可被用于通过以下来优化多形态属性操作序列:乐观地发出具有被硬编码的偏移的存储器访问序列(该序列被在该序列开始处的单个类型检查所防护)并接着仅当执行乐观序列安全时才这么做。
一些技术设计对等同类型高速缓存的设计。例如,等同类型高速缓存可具有指定的单个类型槽,其地址可被硬编码在机器代码中,从而使得初始类型检查非常高效。等同类型高速缓存可被用作针对对所防护的属性访问序列中的一个或多个属性的相关特征(偏移、可写性)的改变的防护,使得单个类型检查针对未预期的类型以及同时环境中的其他改变来进行保护。一些技术关注用于跟踪可通过等同对象类型专门化被优化的属性访问序列的算法和/或用于跟踪在经等同对象类型专门化的序列中所涉及的属性(以及它们的特征)的算法。
在一些示例中,等同对象类型专门化涉及数个组件和步骤,其在以下出于便于引用的目的被提到。与本文中的其他示例一样,提到的步骤和结构可被本领域的技术人员以任意可操作的方式来忽略、重复和/或组合。
第一,多形态内联高速缓存在早期代码执行期间被用于记录在每个多形态属性访问处已经遇到什么对象类型。一个多形态内联高速缓存与每个属性相关联,使得针对每个遇到的类型,多形态内联高速缓存记录到该类型的对象上正被考虑的属性的偏移。
第二,当函数已经被执行充分数量次时,其被排队以用于经优化的JIT编译。在这个上下文中,本领域的技术人员将基于情况(诸如例如代码先前经历了多少测试以及其他发布准则)来确定多少执行次数是“充分”的次数。在一些情况下,单次执行将被认为是充分的,而在其他情况下,充分性由相对代码覆盖(例如,函数的75%的实例已经被调用)或由PIC或ETC的大小(例如,函数已经被至少执行与在任一高速缓存中的条目的数量一样多的次数)来测量。在优化期间,该函数中的每个多形态高速缓存针对类型等同性被检查。如果高速缓存的针对所有类型的条目都存储相同的偏移(即,属性值在该属性访问迄今为止所遇到的所有对象布局上被定位在相同的偏移处),则该高速缓存被认为是等同的且被如此标记。还关注根据所使用的语言的语义来确保类型是完全等同的。例如,如果语言支持原型继承(如JavaScript那样),则所有属性应当存在于实例自身上或从原型中加载(两种的混合不是等同的)。类似地,如果语言许可属性访问器以及简单值(JavaScript这么做),则针对被认为是等同的类型,所有类型上的属性值应当是访问器或应当是简单数据属性。最后,对于属性存储,所有属性应当是可写的。
第三,在编译期间,来自每个等同多形态高速缓存的数据被收集并与对应的属性访问相关联。等同类型集(类型集)是这一数据的一部分。
第四,随着程序被分析,优化编译器202跟踪涉及相同等同类型集(在一些实例中,部分重叠的类型集也被考虑)的属性访问206序列208并将它们标记为针对等同类型专门化的候选。对于所标识的每个序列,编译器还跟踪所涉及的属性,使得在适当时,类型等同性可在运行时被验证。
第五,编译器针对每个所标识的属性访问序列来创建等同对象类型专门化高速缓存(ETC)。ETC包括已经被验证为等同的类型集,伴随有将在所发出的机器代码中被该序列的开始处的类型检查使用的指定的类型槽。ETC还用作防护,使得在条件改变的情况下(例如,属性之一变成只读的情况下)可通过将这个防护的值设为0来使得整个机器代码序列无效(触发跳出)。最后,ETC包括PER或具有相关联的PER,其存储关于所涉及的属性以及它们的特征(例如,只读状态)的补充信息以帮助验证任何新传入类型的等同性。
第六,编译器发出如以上描述的开始于针对高速缓存的防护槽的类型检查的机器代码序列。每个后续属性访问是来自/去往离开对象的开始的被硬编码的偏移的间接存储器访问操作,而无需任意附加的运行时检查。如果类型检查成功,则存储器加载/存储的其余部分与如在单形态对象类型专门化中那样高效地执行。
第七,如果类型检查失败并且防护值为0,则乐观优化代码不再有效,并且执行直接跳到跳出例程,从那里其将在解释器中继续。
第八,如果类型检查失败但是防护值是非0,则乐观优化代码依然有效并可被执行,只要传入对象的类型关于序列中的属性等同。这个等同性检查可被实现在两个部分中。第一,传入类型与ETC中的类型集进行比较。这些类型已经被预先验证为等同的,所以如果传入类型匹配它们中的任一,则执行根据经优化的属性访问路径来继续。这个部分可被直接发出到机器代码内以供更快速的执行,或者其可以是在初始类型检查失败之际被所发出的代码调用的助手例程的第一部分。并且,检查可涉及对经高速缓存的类型的线性扫描或基于散列的查找,其中传入类型会被散列到经高速缓存的类型的阵列中的索引中。
最后,如果传入类型不匹配被存储在高速缓存中的任一类型,它必须针对等同性被显式地检查。为此,存储在ETC中的属性列表以及关于它们所要求的特征的辅助数据针对传入类型的属性来比较。如果这个检查成功,执行根据经优化的属性访问路径来继续。此外,ETC被更新(新的类型被放置在防护槽中,并被添加到等同类型的阵列,虽然它可取代另一类型)。通过这种方式,在对这个属性访问序列的后续执行上,初始类型检查将成功,并且大部分优化代码将被执行。另一方面,如果这个检查失败,则传入类型不是等同的,并且后续机器指令针对被处理的对象不是有效的。执行直接跳转到跳出例程,并且在解释器中继续。在许多示例中,这种消耗时间的逐属性的检查将很少被执行,并且在大部分时间,大部分优化代码路径将被执行。
PIC和ETC
本文中的一些示例参考两种不同种类的高速缓存。存在与每个属性访问指令(例如,示例源代码中的指令“a.x”、“a.y”、“b.x”和“b.y”中的每一个)相关联的多形态内联高速缓存(PIC)。PIC记录该指令所遇到的所有对象的类型。这些高速缓存被检查来确定它们所记录的类型是否是等同的。如果PIC类型是等同的,则一实施例尝试将等同类型专门化应用到对应的指令。另一方面,当一实施例选择使用等同类型专门化来优化属性访问指令序列时,等同类型高速缓存(ETC)被创建。每个这样的序列被给予一等同类型高速缓存,其存储已经针对这个属性访问序列被确定为等同的类型,来促进快速类型检查。这两个高速缓存用作不同的目的。等同类型高速缓存中的类型已经已知为等同的,而多形态内联高速缓存中的类型可能是或可能不是等同的。在附图中:图6显示PIC;整体系统的图9涉及PIC(经由属性访问简档232)并且还涉及ETC 238;图10显示ETC;图11显示结构上是ETC的一部分或以其他方式与ETC相关联的PER;图12涉及ETC;图13和14中的每一个涉及PIC;并且图15涉及PIC和ETC两者。
附加组合和变体
用于生成和执行针对动态类型化的编程语言中的属性访问的代码的系统S1包括至少一个处理器、与该处理器可操作上通信的存储器以及直接访问代码生成器,其发出针对属性访问的直接访问代码以访问对象的属性。该对象具有一类型。直接访问代码在对应于该属性访问的多形态内联高速缓存中所标识的类型是等同时被发出。
用于生成和执行针对动态类型化的编程语言中的属性访问的代码的系统S2包括至少一个处理器、与该处理器可操作上通信的存储器以及直接访问代码生成器,其发出针对属性访问的直接访问代码以访问对象的属性。该对象具有一类型。直接访问代码在从多形态内联高速缓存中检索到的类型集匹配于与编译器值表中对象的类型相关联的类型集时被发出。
用于生成和执行针对动态类型化的编程语言中的属性访问的代码的系统S3包括至少一个处理器、与该处理器可操作上通信的存储器以及针对属性访问的用于访问对象的属性的所生成的直接访问代码。属性访问属于属性访问序列。对象具有一类型和存储器区域。直接访问代码在执行之际访问被定位在对象的存储器区域中被硬编码的偏移处的属性值,并访问该值,而在比较类型检查确定对象的类型匹配于与该属性访问序列相关联的等同类型高速缓存中的条目之后无需要求进一步的类型检查。
用于生成和执行针对动态类型化的编程语言中的属性访问的代码的系统S4包括属性等同性记录,该属性等同性记录包括针对属性访问序列中的每个属性访问的一个条目,该属性访问序列相对于被每属性访问一个类型检查所防护而言仅被单个类型检查所防护,即使属性属于具有布局差异的类型。所生成的直接访问代码可包括全部被单个类型检查所防护的动态类型属性访问序列。
系统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。
系统S1、S2、S3、S4中任一单个或组合可被装备有用于确定多形态内联高速缓存中的类型是否等同的装置。合适的装置可包括例如,存储在存储器中并可由处理器执行的代码,该代码操作使得仅在与给定属性访问相关联的多形态内联高速缓存中的所有条目都包括与该多形态内联高速缓存中的第一条目相同的属性索引之后才确定与该多形态内联高速缓存中的类型为等同的。合适的装置还或替换地包括例如,操作使得仅在确定以下条件之一被确切地满足之后才确定与对给定属性的给定属性访问相关联的多形态内联高速缓存中的类型是等同的代码:该多形态内联高速缓存中的所有类型都描述包括该给定属性的对象,或该多形态内联高速缓存中的所有类型描述共享原型的对象并且该原型包括该给定属性。合适的装置还或替换地包括例如,操作使得仅在确定以下条件之一被确切地满足之后才确定与对给定属性的给定属性访问相关联的多形态内联高速缓存中的类型是等同的代码:该多形态内联高速缓存中的所有类型都描述在对象的头部上的槽中具有该给定属性的值的对象,或该多形态内联高速缓存中的所有类型都描述在对象的辅助槽阵列上的槽中具有该给定属性的值的对象。具有由图6中示出的结构形式的多形态内联高速缓存(大小可改变)或功能等同也是所述装置的一部分。图13中显示的算法的实现或功能等同可以是所述装置的一部分。
多形态内联高速缓存可被认为是多形态属性访问简档的一个实现。除了固定大小阵列高速缓存之外的机制可被用于在本章节或本文中其他地方中提供的系统、经配置的机制或过程的任一中用“多形态属性访问简档”来代替“多形态内联高速缓存”。例如,可使用高效增长的阵列。一种高效增长阵列的方式是分派更大的阵列,将原始阵列的数据复制到该阵列中,并清空原始阵列。另一方式是创建链接列表、树、散列表或其他链接结构,其将对所持有的属性简档数据可用的空间扩展到初始阵列中的空间之外。
进一步关注系统S4的变体,其中该系统包括所生成的直接访问代码,并且其中所生成的直接访问代码包括不同类型的对象的所访问的属性的属性访问序列,在一些情况下,所述类型在以下条件之一被确切地满足时针对所述所访问的属性是等同的:所有所访问的属性是局部属性,或每个所访问的属性来自原型并且所有所访问的属性来自该相同原型。在一些情况下,所生成的直接访问代码包括不同类型的对象的所访问的属性的属性访问序列,并且其中所述属性访问全部内联或全部在辅助槽阵列中。
计算机可读存储介质M1被配置有数据和指令,该指令在被至少一个处理器执行时使得该处理器执行用于使用等同对象类型专门化来生成针对动态类型化的编程语言中的属性访问序列的机器代码的算法过程。在一特定示例M1a中,当对象的多形态内联高速缓存中的类型不是等同的时,该过程发出非直接属性访问代码,即包括用于针对不开始该属性访问序列的至少一个属性访问使用多形态内联高速缓存的指令的代码。在一特定示例M1b中,当对象的多形态内联高速缓存中的类型是等同的,但是从编译器值表中没有可用的与从对象的多形态内联高速缓存中计算出的经高速缓存的类型集进行比较的类型集时,该过程创建等同类型高速缓存并发出针对开始该属性访问序列的属性访问的类型检查代码。在一特定示例M1c中,当对象的多形态内联高速缓存中的类型是等同的并且从编译器值表中检索到类型集,但是对象的多形态内联经高速缓存的类型集不匹配从编译器值表中检索到的类型集时,该过程发出非直接属性访问代码。在一特定示例M1d中,当对象的多形态内联高速缓存中的类型是等同的并且对象的多形态内联经高速缓存的类型集匹配从编译器值表中检索到的类型集时,该过程发出直接属性访问代码,该直接属性访问代码在执行之际直接地访问在该对象的存储器区域中被硬编码的偏移处的属性值。变体M1a、M1b、M1c、M1d可单独出现,或与一个其他变体一起出现(M1a+M1b、M1a+M1c、M1a+M1d、M1b+M1c、M1b+M1d、M1c+M1d),或与两个其他变体一起出现(M1a+M1b+M1c、M1a+M1b+M1d、M1a+M1c+M1d、M1b+M1c+M1d)或它们中的全部可出现在一给定示例中(M1a+M1b+M1c+M1d)。发出非直接属性访问代码可包括在对象类型属性图中定位属性的索引以及发出访问在被属性的索引所指示的存储器位置处的属性值的代码。
在M1a、M1b、M1c和/或M1d的这些组合的任一中,对象的多形态内联高速缓存中的类型仅在确定该多形态内联高速缓存中的所有条目都具有与该高速缓存的第一条目相同的值之后才被确定为是等同的。在这些组合中的任一中,只有在确定序列中的属性访问都是局部的或者都针对相同的原型来作出之后,对象的等同类型高速缓存中的类型才可被确定为是等同的。在这些组合中的任一中,只有在确定序列中的所有属性存储将对可写属性来作出之后,对象的等同类型高速缓存中的类型才被确定为是等同的。在这些组合中的任一中,只有在确定访问序列中要被访问的属性全部都是内联的或全部都将通过辅助槽来访问之后,对象的等同类型高速缓存中的类型才被确定为是等同的。
在M1a、M1b、M1c和/或M1d的这些组合以及它们的变体的任一中,创建等同类型高速缓存可至少部分地通过创建包括指定的防护类型条目以保持指定的防护类型的高速缓存来完成。指定的防护类型条目可位于固定大小阵列中,该阵列具有针对多个次级条目来保持附加类型的空间。
在M1a、M1b、M1c和/或M1d的这些组合以及它们的变体的任一中,该过程可包括创建属性等同性记录,该属性等同性记录具有针对被单个类型检查所防护的属性访问序列中的每个属性访问的条目。
M1a、M1b、M1c和/或M1d的这些组合以及它们的变体的任一还可通过配置考虑中的系统的存储器112和/或配置考虑中的系统的可移动介质114来与以上描述的系统S1、S2、S3、S4以及它们的变体中的任一个相组合。
一种使用等同对象类型专门化来执行动态类型化的编程语言中的属性访问序列的过程P1a包括运行代码,该代码通过将对象类型与等同类型高速缓存的指定的防护类型进行比较来进行类型检查。过程P1b包括执行访问在被硬编码到对象的存储器内的偏移处的属性的值的代码,而无需在对象类型等于指定的防护类型之后运行进一步的类型检查代码。过程P1c包括运行类型检查比较代码,该代码在对象类型不等于指定的防护类型时将该对象类型与等同类型高速缓存的至少一个次级条目进行比较。过程P1d包括执行针对在对象存储器中被硬编码的偏移处的属性访问序列的代码,而无需在类型检查比较代码确定对象类型匹配于等同类型高速缓存中的条目之后运行进一步的类型检查代码。此处,如本文中其他地方那样,“访问”属性值指从对象的存储器区域中加载属性值或将属性值存储到对象的存储器区域中。过程P1e包括执行通过使用与等同类型高速缓存相关联的属性等同性记录来确定对象类型是否针对所访问的属性与等同类型高速缓存中的类型等同的代码。
在第一变体中,该过程包括执行至少三个全部被单个检查类型所防护的动态类型属性访问的序列。在第二变体中,该过程包括通过插入通过类型检查比较代码的执行没有被初始地发现在等同类型高速缓存的任意条目中的对象类型来更新等同类型高速缓存。在第三变体中,该过程包括将多个属性访问执行到不同类型的对象内,所有这些对象针对所访问的属性是等同的,并且其中所访问的属性全部是局部的或全部来自相同的原型。在第四变体中,该过程包括执行涉及不同类型的对象的多个属性访问,其中所有类型针对所涉及的属性是等同的,并且所访问的属性全部内联在对象的头部中或所访问的属性全部在对象的辅助槽阵列中。每个变体可单独地发生,或与其他变体中的任意一个或多个组合地发生。每个变体可与过程P1a、P1b、P1c、P1d、P1e中的任一个一起来发生,并且每个过程可与其他过程中的一个或多个相组合。此外,每个过程或过程的组合(包括变体)可与以上描述的介质组合和变体中的任意一个相组合。
结语
虽然具体实施例在此处被明确示出并描述为进程、已配置的介质、或系统,但是可以理解,对一种类型的实施例的讨论也一般性地延伸到其他实施例类型。例如,结合图3和12-15的过程描述还帮助描述配置的介质,并帮助描述如结合其他附图讨论的那些技术效果效以及系统和制品等技术效果以及系统和制品的操作。对一个实施例的限制也不一定适用于另一个实施例。具体而言,进程不一定仅限于在讨论诸如已配置的存储器之类的系统或产品时呈现的数据结构和方案。
本文对具有某一特征X的实施例的引用以及本文别处对具有某一特征Y的实施例的应用不从具有特征X和特征Y两者的本公开的实施例中排除,除非这一排除在此被明确指明。所有可能的负面权利要求限制在以下意义上在本公开的范围内:被表述为一实施例的一部分的任一特征也可在表达上从包括在另一实施例中移除,即使该特定排除没有在本文中任意示例中被给出。术语“实施例”在此仅仅被用作过程、系统、制品、经配置的计算机可读介质和“/或此处如以与适用法律一致的方式应用的教导的其它示例的更方便的形式。”因此,给定“实施例”在该实施例与至少一个权利要求一致的情况下可包括此处所公开的特征的任何组合。
不是图中所示出的每一项都需要存在于每个实施例中。相反,实施例可以包含图中未显式地示出的项。虽然一些可能性在此处通过具体示例在文本和附图中示出,但是各实施例可以偏离这些示例。例如,一示例的具体技术效果或技术特征可以被省略、重命名、以不同的方式分组、重复、不同地以硬件和/或软件实例化,或是在两个或更多示例中出现的效果或特征的混合。在一些实施例中,在一个位置示出的功能也可以在不同位置提供;技术人员认识到在给定实现中功能模块能够以各种方式定义,而不必从作为一个整体来看的交互模块的集合中省略所需技术效果
通过附图标记参考了附图。在附图或文本中与给定附图标记相关联的措词中的任何显而易见的不一致性应该被理解为仅仅时拓宽该标记所引用的内容的范围。即使使用相同的附图标记,给定附图标记的不同实例也可以指不同的实施例。
如此处所使用的,诸如“一”和“该”等术语包括了所指示的项或步骤中的一个或多个。具体而言,在权利要求书中,对一个项的引用一般表示至少一个这样的项存在,并且对一个步骤的引用表示执行该步骤的至少一个实例。
标题仅是为了方便;关于给定话题的信息可在其标题指示该话题的章节之外被寻找到。
所提交的所有权利要求和摘要是说明书的一部分。
尽管在附图中示出并在上文中描述了示例性实施例,但本领域普通技术人员将明白,可作出多种修改而不脱离权利要求书中阐明的原理和概念,且这些修改不需要涵盖整个抽象概念。尽管用结构特征和/或过程动作专用的语言描述了本主题,但可以理解,所附权利要求书中定义的主题不必限于权利要求书上面所描述的具体特征或动作。不一定在给定定义或示例中标识的每一个手段或方面或技术效果都在每个实施例中存在或使用。相反,所描述的具体特征和动作以及效果是作为供当实现权利要求书时考虑的示例来公开的。
无法包围整个抽象概念但落入权利要求的等效技术方案的意义和范围内的所有改变都在法律所准许的最大程度内被包含在其范围内。
Claims (15)
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所述的方法,其特征在于,包括执行涉及不同类型的对象的多个属性访问,其中所有类型针对所涉及的属性是等同的,并且所访问的属性全部内联在对象的头部中或所访问的属性全部在对象的辅助槽阵列中。
Applications Claiming Priority (5)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US14/137,356 | 2013-12-20 | ||
US14/137,356 US9207914B2 (en) | 2013-12-20 | 2013-12-20 | Execution guards in dynamic programming |
US14/490,429 US9104434B2 (en) | 2013-12-20 | 2014-09-18 | Property accesses in dynamically typed programming languages |
US14/490,429 | 2014-09-18 | ||
PCT/US2014/068680 WO2015094706A1 (en) | 2013-12-20 | 2014-12-05 | Property accesses in dynamically typed programming languages |
Publications (2)
Publication Number | Publication Date |
---|---|
CN105830025A CN105830025A (zh) | 2016-08-03 |
CN105830025B true CN105830025B (zh) | 2019-05-07 |
Family
ID=52358964
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201480069909.0A Active CN105830025B (zh) | 2013-12-20 | 2014-12-05 | 动态类型化的编程语言中的属性访问 |
Country Status (4)
Country | Link |
---|---|
US (1) | US9104434B2 (zh) |
EP (1) | EP3084597A1 (zh) |
CN (1) | CN105830025B (zh) |
WO (1) | WO2015094706A1 (zh) |
Families Citing this family (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US10482194B1 (en) * | 2013-12-17 | 2019-11-19 | EMC IP Holding Company LLC | Simulation mode modification management of embedded objects |
US9207914B2 (en) | 2013-12-20 | 2015-12-08 | Microsoft Technology Licensing, Llc | Execution guards in dynamic programming |
DE102015206666A1 (de) * | 2015-04-14 | 2016-10-20 | Siemens Aktiengesellschaft | Verfahren zum Betrieb einer Zugsicherungsanordnung, Zugsicherungsanordnung und Schienenfahrzeug mit einer Zugsicherungsanordnung |
KR20180007792A (ko) * | 2016-07-14 | 2018-01-24 | 삼성에스디에스 주식회사 | 클라우드 서비스 기반의 데이터 제공 장치 및 방법 |
US10516675B2 (en) * | 2017-01-17 | 2019-12-24 | Microsoft Technology Licensing, Llc | Altering application security to support just-in-time access |
US10282274B2 (en) * | 2017-06-14 | 2019-05-07 | Microsoft Technology Licensing, Llc | Presenting differences between code entity invocations |
US10521208B2 (en) * | 2017-06-23 | 2019-12-31 | Microsoft Technology Licensing, Llc. | Differentiated static analysis for dynamic code optimization |
CN108304650B (zh) * | 2018-01-31 | 2021-10-26 | 广东三维家信息科技有限公司 | 一种基于参数驱动算法的橱柜衣柜3d设计方法 |
US11182272B2 (en) * | 2018-04-17 | 2021-11-23 | International Business Machines Corporation | Application state monitoring |
CN110825531B (zh) * | 2018-08-14 | 2023-05-30 | 斑马智行网络(香港)有限公司 | 针对动态类型语言的优化方法、装置、设备以及存储介质 |
US11449317B2 (en) | 2019-08-20 | 2022-09-20 | Red Hat, Inc. | Detection of semantic equivalence of program source codes |
CN111078566A (zh) * | 2019-12-20 | 2020-04-28 | 大唐网络有限公司 | 一种基于es6的对象自检方法 |
US11436030B2 (en) * | 2020-02-11 | 2022-09-06 | Cisco Technology, Inc. | Modular Java manager performing capturing and overriding of access check failures for inter-module operations between Java modules by an agent using inserted instrumentation |
CN113741869B (zh) * | 2020-09-10 | 2023-05-26 | 吕戈 | 一种高性能的可变语法编程语言的构造方法 |
US11025671B1 (en) | 2021-02-23 | 2021-06-01 | Five Media Marketing Limited | Monitoring of javascript object properties for detection of web browser security threats |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1862542A (zh) * | 2006-06-09 | 2006-11-15 | 无锡永中科技有限公司 | 共享对象属性的方法 |
CN101523398A (zh) * | 2006-09-15 | 2009-09-02 | 索尼达德克奥地利股份公司 | 用于管理对插件数据文件访问的系统和方法 |
CN101894132A (zh) * | 2010-06-10 | 2010-11-24 | 南京国电南自轨道交通工程有限公司 | 采用双高速引擎的面向对象实时数据库存储方法 |
Family Cites Families (16)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CA2332085A1 (en) | 2001-01-23 | 2002-07-23 | Ibm Canada Limited-Ibm Canada Limitee | Adapting polymorphic inline caches for multithreaded computing |
US7526760B1 (en) | 2004-03-17 | 2009-04-28 | Sun Microsystems, Inc. | Methods for implementing virtual method invocation with shared code |
US8392881B1 (en) * | 2008-05-13 | 2013-03-05 | Google Inc. | Supporting efficient access to object properties in a dynamic object-oriented programming language |
US8244775B1 (en) * | 2008-05-13 | 2012-08-14 | Google Inc | Using map objects to access object properties in a dynamic object-oriented programming language |
KR101782995B1 (ko) * | 2011-01-13 | 2017-09-29 | 삼성전자주식회사 | 자바스크립트 코드 저장 및 최적화를 통한 웹 브라우징 방법 및 장치 |
US9342274B2 (en) | 2011-05-19 | 2016-05-17 | Microsoft Technology Licensing, Llc | Dynamic code generation and memory management for component object model data constructs |
US8539463B2 (en) | 2011-07-28 | 2013-09-17 | Qualcomm Innovation Center, Inc. | Apparatus and method for improving the performance of compilers and interpreters of high level programming languages |
US10466989B2 (en) | 2011-09-02 | 2019-11-05 | Microsoft Technology Licensing, Llc. | Fast presentation of markup content having script code |
US8819649B2 (en) | 2011-09-09 | 2014-08-26 | Microsoft Corporation | Profile guided just-in-time (JIT) compiler and byte code generation |
US8972952B2 (en) | 2012-02-03 | 2015-03-03 | Apple Inc. | Tracer based runtime optimization for dynamic programming languages |
US20130205282A1 (en) | 2012-02-07 | 2013-08-08 | Microsoft Corporation | Transferring program execution from compiled code to interpreted code |
US9110751B2 (en) | 2012-02-13 | 2015-08-18 | Microsoft Technology Licensing, Llc | Generating and caching software code |
JP2013235386A (ja) * | 2012-05-08 | 2013-11-21 | Internatl Business Mach Corp <Ibm> | 最適化装置、最適化方法、及び最適化プログラム |
US9104449B2 (en) | 2012-06-18 | 2015-08-11 | Google Inc. | Optimized execution of dynamic languages |
US9569342B2 (en) | 2012-12-20 | 2017-02-14 | Microsoft Technology Licensing, Llc | Test strategy for profile-guided code execution optimizers |
US9251071B2 (en) * | 2013-08-30 | 2016-02-02 | Apple Inc. | Concurrent inline cache optimization in accessing dynamically typed objects |
-
2014
- 2014-09-18 US US14/490,429 patent/US9104434B2/en active Active
- 2014-12-05 EP EP14828069.6A patent/EP3084597A1/en active Pending
- 2014-12-05 CN CN201480069909.0A patent/CN105830025B/zh active Active
- 2014-12-05 WO PCT/US2014/068680 patent/WO2015094706A1/en active Application Filing
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1862542A (zh) * | 2006-06-09 | 2006-11-15 | 无锡永中科技有限公司 | 共享对象属性的方法 |
CN101523398A (zh) * | 2006-09-15 | 2009-09-02 | 索尼达德克奥地利股份公司 | 用于管理对插件数据文件访问的系统和方法 |
CN101894132A (zh) * | 2010-06-10 | 2010-11-24 | 南京国电南自轨道交通工程有限公司 | 采用双高速引擎的面向对象实时数据库存储方法 |
Also Published As
Publication number | Publication date |
---|---|
US20150178057A1 (en) | 2015-06-25 |
EP3084597A1 (en) | 2016-10-26 |
CN105830025A (zh) | 2016-08-03 |
WO2015094706A1 (en) | 2015-06-25 |
US9104434B2 (en) | 2015-08-11 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN105830025B (zh) | 动态类型化的编程语言中的属性访问 | |
US10241784B2 (en) | Hierarchical directives-based management of runtime behaviors | |
CN106133685B (zh) | 对运行时行为的基于分层指令的管理 | |
CN106716361B (zh) | 用于运行时例程冗余跟踪的编译器高速缓存 | |
CN105408873B (zh) | 用于诊断数据的基于活动的采样的系统和方法 | |
CN102902529B (zh) | 用于管理数据源的方法和系统 | |
CN105247483B (zh) | 应用内的带外框架库 | |
CN108633309B (zh) | 协同程序的编译器优化 | |
Aronis et al. | Optimal dynamic partial order reduction with observers | |
CN102193810A (zh) | 模块间内联候选标识 | |
CN104428750A (zh) | 代码片段的泛化和/或特化 | |
US9292270B2 (en) | Supporting dynamic behavior in statically compiled programs | |
US8935686B2 (en) | Error-code and exception-based function dispatch tables | |
CN114830099A (zh) | 集成引用和次对象的标记 | |
CN104321774B (zh) | 用于防逆向工程和/或篡改程序的方法、系统以及设备 | |
US10203940B2 (en) | Compiler with type inference and target code generation | |
US8688918B2 (en) | Program converting apparatus, program converting method, and medium | |
Kennard et al. | Is there convergence in the field of UI generation? | |
Malviya et al. | Development of a plugin based extensible feature extraction framework | |
Tian | An input centric paradigm for program dynamic optimizations and lifetime evolvement | |
Nadkarni et al. | GraphAudit: Privacy Auditing for Massive Graph Mining | |
Mottishaw | Synchronization via scheduling: techniques for efficiently managing concurrent shared memory accesses | |
O’Boyle et al. | D3. 4-Report on compilation for performance, energy efficiency and extraction of parallelism for the SARC architecture |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |