当前位置: 首页 > 专利查询>微软公司专利>正文

高速缓存运行时生成的代码制造技术

技术编号:7154131 阅读:364 留言:0更新日期:2012-04-11 18:40
标识生成代码但不扰乱全局状态的程序实体。可以在第一次执行由所标识的程序实体产生的代码时给它指派标识符并将其高速缓存。程序实体的随后的执行可以消除代码的生成和/或所生成的代码到本机二进制代码的翻译。运行时生成的代码和本机二进制代码可以被高速缓存在机器范围的高速缓存中,或者可以被添加到从程序实体的源代码生成的汇编件的元数据。

【技术实现步骤摘要】
【国外来华专利技术】高速缓存运行时生成的代码背景传统上,软件编译器产生本机代码,S卩,对代码将在其上运行的机器来说是专用的二进制代码。由传统的编译器生成的本机(非托管)代码通常包括操作系统运行代码所需要的所有事物,除此之外很少有别的。相比之下,在虚拟机环境中,源代码被编译成对任何特定的机器来说不是专用的中间字节代码表示。另外,托管代码编译器的输出通常包括比仅二进制代码多得多的信息。该附加信息描述二进制代码的特性,且有时被称为元数据用于描述其他数据的数据的通用术语,其中在此情况中,所描述的数据是二进制代码。包含中间字节代码和元数据的容器有时被称为托管汇编件。这些容器还可以被称为类文件、Java 档案或Java模块。在此所使用的术语“汇编件”或“托管汇编件”是指任何这样的字节代码和元数据的容器。在非托管环境中,在运行时,预先存在的本机指令被加载到存储器并被执行。在托管环境中,在运行时,托管汇编件可以就在执行之前被编译或被翻译成本机二进制指令。即,托管汇编件可以被加载到存储器并被即时(just-in-time,JIT)编译器或运行中 (on-the-fly)编译器编译成机器专用的和运行时专用的指令,然后执行该指令。尽管托管环境的编译/翻译阶段涉及可以影响性能的另外的处理,但另一方面,JIT/运行中编译器可以进行非托管环境所不能利用的环境专用的优化。例如,如果JIT/运行中编译器知道正在执行的代码完全可信任地运行,则它可以跳过在非托管环境中不能跳过的某些昂贵的安全检查。在托管环境中,代替就在执行托管汇编件之前编译托管汇编件,源代码或中间字节代码可以由优化编译器编译成本机二进制代码并在宿主系统上运行之前被存储(被高速缓存)。例如,诸如NGEN等的本机映像生成器可以通过在接收到执行该汇编件之前将中间字节代码转换成二进制的本机机器指令来产生用于该环境的本机二进制映像。以此方式,在运行时,以类似于传统的本机代码环境的方式,预先存在的可执行代码可以无需第二编译/翻译阶段就被加载和运行。尽管高速缓存旨在通过移除在运行时的JIT/运行中编译 /翻译过程来使得该汇编件执行得更快,但可能不改善性能,这是因为在预先高速缓存汇编件时不能进行由JIT/运行中编译器进行的环境专用的优化。如上面所说明的,大多数本机语言不跟踪关于源代码的内部结构的信息。相反,由于在托管环境中产生的中间字节代码中所包括的元数据,可以容易地在运行时生成利用当前现有的对象、创建新的对象、从现有的对象继承等等的代码。运行时生成的代码可以要求使用专用的机制以便无需从长期存储介质(例如,硬盘)加载运行时生成的代码就创建或加载动态代码。这样的机制在本文档的其余部分中被称为反射发出(Reflection Emit)。 也被称为动态地生成的代码的在运行时生成的代码通常在每一进程实例期间被编译成中间字节代码,且然后,被JIT/运行时编译器处理。这是并非微不足道的每进程成本。概述如果诸如托管汇编件或托管汇编件的部分(例如方法或函数)等的实体在运行时生成另外的代码,如果该方法或函数是纯的,则高速缓存另外的运行时生成的代码,以使得在该实体的随后的执行时可以通过从缓存查找经高速缓存的运行时生成的代码的标识符并从高速缓存检索所标识的代码来从高速缓存检索该代码,这旁路了代码生成的一个或多个阶段。此外,所高速缓存的代码可以由编译器预先编译和/或可以作为额外的数据而被添加到源汇编件的元数据。因此,运行时生成的代码可以被高速缓存并跨越程序的各实例而被重用。在运行时,检查一个或多个运行时生成的代码高速缓存,且如果所标识的实体存在于高速缓存中,则加载和使用该实体,这消除了中间字节代码生成阶段、编译/翻译阶段或中间字节代码生成阶段和编译/翻译阶段两者。提供本概述以便以简化形式介绍下面在详细描述中进一步描述的概念的选集。本概述不旨在标识所要求保护的本主题的关键特征或必要特征,也不旨在用于限制所要求保护的本主题的范围。附图简述各图中附图说明图1是根据在此公开的本主题的各方面的用于高速缓存运行时生成的代码的系统的示例的框图;图加是本领域中已知的用于执行动态程序的方法;图2b是根据在此公开的本主题的各方面的用于高速缓存运行时生成的代码的方法的示例;图2c是根据在此公开的本主题的各方面的用于高速缓存运行时生成的代码的方法的另一示例;图3是阐释在此公开的本主题的各方面可以在其中实现的计算环境的示例的框图;和图4是根据在此公开的本主题的各方面的集成开发环境的示例的框图。详细描述概览反射发出是允许在运行时动态地创建另外的程序指令并调用这些程序指令的机制。即,可以在运行时基于在运行时适用的数据、服务和具体的操作来决定该程序体系结构本身。例如,假定特定的程序执行数学运算且用户想要基于具体大小的矩阵来执行计算。一种方法是写出能够对任何大小的矩阵执行计算的类属函数。这样的函数是静态的,这是因为它采用的算法直接地求解所期望的问题。这样的程序可能由于它要求对任何大小的矩阵起作用而具有低效率。替代地,该问题的动态解决方案可以涉及生成自定义算法以便解决该问题。这样的解决方案将涉及静态函数A,给予静态函数A各种输入自变量,静态函数A 将使用那些自变量中的一些来生成新的动态函数B,且然后将其他各种输入自变量传递给该动态函数。此自定义动态函数将可能仅对特定的输入起作用,但是可以以允许对于给定的受限的输入集的最佳性能的方式来写出它。例如,静态函数A可以接收到将大小为16x16 的两个矩阵相乘的请求。静态函数A可以生成仅能够将16x16矩阵相乘的新的动态函数B。 然后,静态函数A可以将把矩阵相乘的实际任务委托给动态函数B。通过使用诸如反射发出等的机制,可以在运行时编程地(动态地)对程序指令进行添加。即是说,继续上面的示例,通过使用诸如反射发出等的机制,可以在运行时编程地 (动态地)对类属程序指令进行优化,以便优化程序对16x16矩阵的这一特定执行。由诸如5反射发出等的机制做出的动态修改可以改善性能、增加兼容性或提供其他有用的优点。在面向对象的环境的上下文内,反射发出允许创建新类型和关于各类型的新方法,且可以指定新方法实现的算法。在托管代码环境内,可以通过反射发出生成中间字节代码。在已知的现有系统中,运行时生成的中间字节代码必须在每次程序运行时被编译/被转换成本机机器指令。根据在此公开的本主题的各方面,动态程序第一次运行时,中间字节代码被创建、 被给予执行上下文专用的标识符并被高速缓存。在程序下次运行时,可以无需重新创建中间代码。例如,假定动态函数(即,在运行时生成中间字节代码的函数)存在。进一步假定函数接受在该函数的各次执行之间可以改变或可以不改变的两个自变量。取决于所接收的自变量的值,将创建不同的中间字节代码。根据在此公开的本主题的各方面,可以创建基于自变量值和动态代码生成函数名称的标识符,并将其与由该函数的这一执行产生的中间字节代码相关联。所标识的字节代码可以被高速缓存在中间字节代码高速缓存或该汇编件的元数据部分的任一个中,使得下次以自变量的相同的值执行该函数,可以从高速缓存检索所高速缓存的字节代码并将其直接加载到存储器中,这消除了对重新生成中间字节代码的需要。类似地,动态函数的标识符可以基于被给予生成动态函数的函数的自变量值。所高速缓存本文档来自技高网...

【技术保护点】
1.一种缓存运行时生成的代码的系统(100),包括:在计算机上的托管代码环境中执行的组件(120),所述组件将实体(116,111)高速缓存在第一高速缓存(109,118)或第二高速缓存(109,118)中,所缓存的实体(116,111)包括运行时生成的代码,所述运行时生成的代码由动态代码生成实体在运行时生成,其中所述动态代码生成实体不扰乱全局状态,其中在所高速缓存的实体(116,111)的随后的执行中从所述第一高速缓存(109,118)或所述第二高速缓存(109,118)检索所高速缓存的实体(116,111),这旁路了代码生成的至少一个阶段,所旁路的代码生成的至少一个阶段包括中间字节代码的生成或本机二进制代码的生成。

【技术特征摘要】
【国外来华专利技术】...

【专利技术属性】
技术研发人员:N·赫林
申请(专利权)人:微软公司
类型:发明
国别省市:US

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1