对中间码的逻辑扩展的制作方法

xiaoxiao2020-7-22  8

专利名称:对中间码的逻辑扩展的制作方法
对中间码的逻辑扩展背景传统上,软件创建工具产生二进制代码。软件创建工具所产生的二进制代码一般包括操作系统运行该代码所需的一切东西,但不包括其他。例如,二进制代码一般包含代码的机器指令、关于将指令放在存储器中何处的信息等等。典型的二进制代码中不存在描述该二进制代码的特征的附加信息,例如代码中各个函数的名称、每个函数所预期的参数类型、代码所使用的数据类型的布局等,尽管该信息存在于原始源代码中。因此,从源代码到二进制代码的转换是有损的过程。它产生了可被视为相对不透明的结果,意味着难以通过查看二进制代码来重构丢失的信息。描述二进制代码的特征的附加信息有时被称为元数据描述其他数据的数据的通用术语,在该情况下所描述的数据是二进制代码。如果没有元数据,诸如开发工具和编译器之类的其他软件难以并有时不可能确定二进制代码包含什么、完成什么或预期做什么。例如,通过检查二进制代码,工具一般不能确定代码定义了什么数据类型、类型定义了什么方法、特定方法试图满足的契约、软件调试工具如何显示数据类型、软件分析工具要如何分析数据类型和方法,等等。相反,将代码编译为中间字节码表示的系统一般对所产生的输出而不仅仅是对二进制代码放置了多得多的信息。包含中间字节码表示的容器有时称为汇编件,或者在Java 中称为Java类文件或JAR文件(存档文件,即包含多个类文件的打包文件)。这里使用的术语“汇编件”是指字节码和元数据的任何这样的容器。除了中间字节码以外,汇编件因此可包括描述二进制代码本身的各方面的附加信息(元数据)。当今公知的汇编件包括描述类、其字段、方法等以及关于类成员的自定义属性的元数据。它还包含关于汇编件的依赖关系的信息、到可能已被移出汇编件的类型的链接、等等。元数据使其他软件能检索关于中间码的信息。因此,和传统的二进制代码模块相比,汇编件对于检查该汇编件的工具来说更为透明(意味着关于二进制代码的信息更可被发现)。然而,附加的元数据及其产生的透明度通常伴随着不期望的成本。例如,意图供工具和代码设计者使用但不在运行时使用的元数据可能在运行时占用存储器。运行代码可能要求类型的中间字节码实现,但是类型的中间字节码实现可能不是在设计时需要或被许多非运行时工具需要。在已知的系统中,在将源代码编译到中间字节码中以创建汇编件时,需要已知所有可能的元数据。汇编件的代码和元数据中的大多数一般驻留在单个储存库中二进制汇编件本身,尽管附加元数据也可驻留在分开的程序数据库(PDB)储存库中。当软件开发者把源代码编译到期望的汇编件中时,软件开发者创建汇编件的这些代码和元数据储存库。 结果,只有汇编件的原始作者才能创建或修改该汇编件。安全性特征一般使已改变的代码无效。创作、组织、访问以及修改代码和元数据的能力也受到为支持中间字节码的文字编译和执行而施加的约束条件所限制。这些约束条件也可以不期望的方式影响诸如性能、安全性等这样的特征。
概述可以以多种方式对汇编件聚集进行创作、代理、访问、修改和分布等,所述汇编件聚集包括中间码和元数据的任意定义的集合的虚拟的逻辑视图。可以聚集汇编件信息的多个物理容器以创建称为汇编件聚集的单个逻辑汇编件。汇编件可以被重新定义为针对(或投影至)汇编件聚集的逻辑视图。汇编件可以被定义为针对(或投影至)汇编件信息的多个物理容器的聚集的逻辑视图。汇编件可以针对请求者也就是,汇编件可以根据工具和/ 或执行上下文而不是遵循运行时所强制的显式或隐式要求而被重新定义。有针对性的定制的视图可以被消费到虚拟汇编件中。可以构造到与汇编件聚集相关联的中间码和元数据中的任意视图,包括扩展或改变每一个的格式和描述性能力。构成汇编件聚集的各组件可以被扩展、编辑和创作、后编译、以及在汇编件已被软件企业分发后,而不使该汇编件无效。扩展汇编件可以使用现有的元数据/字节码格式来创作,所述现有的元数据/字节码格式允许现有的工具和应用程序编程接口(API)使用扩展汇编件。提供本发明内容是为了以简化的形式介绍将在以下具体实施方式
中进一步描述的一些概念。本发明内容并不旨在标识出所要求保护的主题的关键特征或必要特征,也不旨在用于限定所要求保护的主题的范围。附图简述在附图中

图1是一系统的示例的框图,在该系统中,可以按照本文所公开主题各方面作出对中间码的逻辑扩展;图2是根据本文所公开主题的各方面用于扩展中间码的方法的示例;图3是示出其中可实现本文所公开主题的各方面的计算环境的示例的框图;以及图4是根据本文所公开主题的各方面的集成开发环境的示例的框图。详细描述概览历史上,为在不托管运行时环境中执行而生成的二进制代码尚未以容易检查和理解的后编译形式被分发。这一局限在不存在调试符号且代码在编译和代码生成过程期间已得到显著优化时特别明显。然而,即使当没有优化而编译时,并且在存在丰富的调试符号的情况下,源代码(考虑到经由调试程序的动态执行和检查)和二进制代码相比通常更容易被人类所理解。工具分析本机码后编译的能力也受到限制。因此,大多数本机分析工具或者针对源而执行或者与编译器/链接器集成一段时间,在该段时间内存在代码及其相应元数据的最全局理解。除了上面列出的复杂性以外,不托管运行时一般不提供用可支持人类驱动的和工具驱动的场景的开放集合的任意元数据注释可执行代码的能力。然而,随着托管运行时环境的增长与普及,该情况开始改变。托管运行时环境的例子包括Sun Microsystem公司的JAVA和微软公司的.NET。Java编译器将Java源代码转换成Java字节码(Java虚拟机(JVM)的一种中间语言)。Java运行时环境(JRE)在进行中将中间字节码转换成本机机器代码。微软通用语言运行时(Microsoft Common Language Runtime)提供了驱动通用语言架构(CLI)标准的原始实现。CLI定义了用于将源代码编译成CIL (通用中间语言,以前公知为MSIL或微软中间语言)字节码的规范,并且支持以称为托管汇编件为单元的元数据。托管汇编件以及Java类文件包括最终可被编译成机器代码解译成操作码和操作数的直接表示时,是人类可读语言。托管汇编件中的附加元数据提供了有助于验证字节码并将其转换成实际机器代码的支持信息(类型和成员细节、安全性许可等),实际机器代码对于人类驱动的和工具驱动的场景的开放数也是容易可用的。在正常的加载和执行代码以外,用于检查中间字节码和元数据的机制被称为反射(Reflection)。元数据可以是可扩展的。元数据可扩展性的形式可以是自定义属性,它是一种用简单名称和(任选地)由特定系统原语(诸如字符串、整数等)组成的数据团来注释全部元数据对象的机制。元数据也可以通过使用自定义修改程序以任意地扩展成员签名来扩展。 这些修改程序可用于支持诸如对成员的解析、重载或绑定这样的操作。用于声明、枚举和检索自定义属性和成员签名元数据的元数据API —般是可用的,使得与自定义属性相关联的任何附加数据也可通过检查API来恢复。然而,最终,用户可能希望在汇编件中运行(执行)代码。一般而言,用户希望代码运行得尽可能快,使用尽可能少的资源。然而,包括所有可发现信息可能造成显著的运行时成本。例如,将元数据添加至汇编件增加了汇编件的物理尺寸。较大的汇编件占用了较大的磁盘空间。将较大的汇编件加载到存储器中要求更多的输入输出操作并且占用更多时间,因为有更多数据要读取。将较大的汇编件映射到存储器中要求更多的虚拟地址空间,这为其他目的留出较少的可用地址空间。较大的汇编件也会负面影响其他性能特征,诸如工作集和引用的位置。此外,操作系统必须筛选和执行在文字上不相关的全部信息以找到和执行相关的信息。因此,尽管将和汇编件执行不相关的信息添加至该汇编件会向开发者提供好处 (例如,软件开发期间的较好性能、较好的代码分析、较容易的调试、更有意义的性能统计量等等),但是这样做可能降低运行时性能。此外,已知系统的效应有几个限制。例如,目前仅有汇编件作者才能扩展元数据元数据只能在修改相关源代码和/或构造机制后在编译上下文中被扩展。汇编件身份被限制为二进制码的特定构造,并且进一步受到与其相关联的任何版本信息所限制。最后,并非所有期望描述的事物都能由运行时属性来表示。为了解决这些限制及其他限制,引入了一实体,在此称为汇编件聚集。汇编件聚集可以指描述一组类型的元数据和代码(可能为字节码和本机码)的组合。该聚集的一些可能组成部分包括但不限于一个或多个托管汇编件、诸如htellisense文件这样的XML文件、JavaDoc文件和程序数据库(PDB)文件。如目前所定义的,运行时汇编件是可以为了创建其类型之一的实例并且/或者为了在一类型的成员的一个或多个中执行代码(或者执行存在于汇编件全局范围的代码)而被加载的模块。一些元数据(诸如关于串行化的信息、安全性许可、可见性等)驻留在该汇编件中,使得可以执行全部可用的代码。此外,运行时汇编件可能包含或可能不包含在字面上执行汇编件代码不相关的附加元数据(诸如自定义属性定义)。这类元数据在下文中称为“冷元数据”。相反,汇编件聚集在逻辑上是运行时汇编件中包含的信息的一个适当超集。按照本文公开的主题的各方面的运行时汇编被定义为运行时环境所使用的汇编件聚集上的视图或投影。运行时汇编件视图可以针对视图请求者的需求。运行时汇编件视图可以仅包括来自产生当前运行时汇编件所需的聚集的信息。聚集汇编件的其他视图可由不同工具使用。例如,当在链接时间解析引用时,编译器可能需要汇编件聚集的视图,所述视图包含与公共类型和方法以及它们的自定义属性有关的信息、但不需要检查所引用的代码中的方法主体。因此,被提供给编译器的聚集汇编件的视图可包括与公共类型和方法以及它们的自定义属性有关的信息、但不包括所引用的代码中的方法主体。可以通过组合多个现有的元数据和代码储存库(二进制运行时汇编件文件、诸如 XML htelliSense文件这样的文本文件、二进制PDB数据文件等)来创建汇编件聚集。按照本文所公开的主题的这一方面,对汇编件聚集的底层组件的改变可能改变聚集汇编件。 储存库可以被定义,储存库包括该汇编件聚集并且可以用指定的元数据和代码来加载。要求和元数据或代码有关的信息的应用程序可以向汇编件聚集器或汇编件聚集视图提供器请求关于该元数据和代码的视图,并且响应于此,可从汇编件聚集视图提供器接收针对请求者的视图。可以创建汇编件聚集来根据需要提供传统组件。例如,托管代码运行时环境可以请求汇编件聚集器/汇编件聚集视图提供器产生指定的运行时汇编件的特定版本。于是, 汇编件聚集器/汇编件聚集视图提供器可以创建所请求的运行时汇编件。响应于对汇编件聚集的特定设计时视图的请求,可以返回自定义的设计时托管汇编件。类似地,对来自汇编件聚集的运行时汇编件的本机码图像的请求可能导致产生经NGEN的图像。微软通用语言运行时的本机图像生成器(NGEN)为特定的环境产生本机二进制图像。字节码在运行时之前被完全转换成本机CPU指令,消除了 JIT编译进程开销。当针对汇编件运行NGEN时,所产生的本机图像可以被置入本机图像高速缓存中,供其他托管汇编件使用。按照本文所公开的主题的其他方面,可以要求汇编件聚集器/汇编件聚集视图提供器来生成聚集汇编件。二进制重写器可以既产生运行时汇编件,又产生冷元数据的单独存储机制。可以存储汇编件的并行源形式,并行源形式描述了汇编件与之相关的API的特性并且包括附加元数据、但不包括实现细节。源形式可以被编译成二进制形式以便于和工具集成,或者可以以源形式公开地分发以提供人类可读评论。该第二存储格式可以提供运行时汇编件所提供的契约的公开的、持久的表示。可以理解,汇编件聚集可担当对系统其余部分不透明的代码和元数据的储存库, 并且可以以任何期望的格式被存储。当今所知的托管汇编件中的压缩元数据二进制码可以被分成多段,并且存储在稳态存储上的一个或多个文件中。类似地,与托管汇编件相关联的字节码可以被分到一个或多个物理汇编件中。所有其他托管元数据,包括安全性许可、成员签名、资源、编组细节、范围统计量及其他实体,也可以跨多个文件被分发。根据元数据的目的,该信息可能被复制,或者可能跨多个文件而不同。尽管在大多数情况下,可能存在意图被运行时编译和执行的至少一个基础或标准的托管汇编件,但是汇编件聚集可包括多于一个的运行时汇编件二进制码。因此,汇编件聚集包括用于以灵活的方式组织托管信息的虚拟方案。例如,单个汇编件聚集可以组织已分发的类型的每一个版本的信息。汇编件聚集可以组织针对类型的同一版本的实际的物理类型信息,因为它已在多个实现中传送。可以创建保持逻辑组(诸如例如,包括“微软CLR vl. 1可重分配的所有标准”的组)中每一实体的元数据的单个汇编件聚集,等等。因此可使用汇编件聚集来提供灵活的粒度。与一特定的工具或执行上下文密切相关的代码和元数据可以被打包在不连续的模块中,使得和在目前已知的被聚集在单个运行时汇编件中相比,该数据的部署和访问更为有效、安全、性能佳。类似地,与工具或运行时情况非密切相关的字节码和元数据可以在物理上被分到一个单独存储。可以使用汇编件来提供可虚拟化的视图。汇编件聚集可以作为单个逻辑实体被访问,或者可以将任何组份汇编件(或汇编件的组合)分组到一起以提供汇编件的字节码和元数据的视图。可以使用汇编件来提供灵活的身份。汇编件聚集的身份可以是灵活的,因为它可能并不遵循由CLI或 JAVA运行时定义的、并且在目前一般理解和使用的汇编件身份的标准概念。例如,汇编件聚集可以呈现已被分发给消费者的类型的每一个版本的单个视图。可使用汇编件聚集来提供灵活的内容。对汇编件聚集内容的查看可以是灵活的, 因为可以通过对一个或多个组份扩展所提供的数据进行聚集、组合、转换等操作来导出相关的字节码和元数据。这一视图可以呈现最终被编译和执行的运行时汇编件。可使用汇编件聚集来提供灵活的访问。对汇编件聚集执行的部署、发现、访问和其他操作可以不受当前存在的要求所限制。可使用汇编件聚集来提供灵活的创作。汇编件聚集可以由任意作者、 在任意时刻、通过工具化、以及由支持运行时汇编件的确定源的编译以外的进程来扩展。到中间码的逻辑扩展图1示出向中间码提供逻辑扩展的系统100的示例。系统100可以包括以下的一个或多个编译器102、汇编件聚集器/汇编件聚集视图提供器104、一个或多个物理汇编件 106、以及一个或多个信息源108、110等。系统100的全部或部分可以驻留在诸如以下参照图3所述的计算机这样的一个或多个计算机上。系统100或其部分可以包括如下参照图4 所描述和示出的集成设计环境600 (IDE)的一部分,所述集成设计环境600驻留在诸如以下参照图3所述的计算机这样的一个或多个计算机上。或者,系统100或其部分可被提供作为独立系统或作为插件。编译器102可以包括将以.NET语言编写的源代码编译成中间字节码的.NET编译器。· NET 语言包括但不限于 C#、C++、F#、J#、JScript. NET、Managed(托管)Jscript、 IronPython、IronRuby> VBx> VB. NET、Windows PowerShel 1> A#、Boo、Cobra、Chrome (针对.NET 而非 Google 浏览器的对象 Pascal 语言)、Component (组件)Pascal、IKVM. NET、 IronLisp、L#、Lexico、Mondrian> Nemerle> P#、Phalanger、Phrogram、PowerBuilder、 #Smalltalk、AVR. NET、Active Oberon、APLNext> Common Larceny> Delphi. NET、Delta Forth. NET、DotLisp、EiffelEnvision、Fortran. NET、Gardens Point Modula-2/CLR、针对· NET 的 Haskell.Haskel 1. net、针对· NET 的 Hugs、IronScheme、L0LCode. NET、· NET 上的 Mercury> Net Express、NetCOBOL、OxygenScheme> S#、sml. net、Wildcat Cobol> X# 或任何其他.NET语言。编译器102可以包括将以JAVA编写的源代码编译成字节码的JAVA编译器。编译器102可以将源代码114编译到一个或多个物理托管汇编件106等中。物理托管汇编件可以包括定义类型和执行码所必需的字节码和原始元数据。汇编件聚集器/ 汇编件聚集视图提供器104的聚集器部分可以将一个或多个物理汇编件106等和来自其他信息源108、110等的扩展元数据聚集到一个汇编件聚集112中。可以通过组合多个现有的元数据和代码储存库(二进制运行时汇编件文件、诸如XML htelliSense文件这样的文本文件、二进制程序数据库(PDB)数据文件、故障修复文件、电子邮件文件、规则文件和/或其他信息源)来创建汇编件聚集112。想要和该元数据或代码有关的信息的应用程序(未示出)可以请求一特定汇编件聚集,该特定汇编件聚集包括来自汇编件聚集器或汇编件聚集器视图提供器104的元数据和代码的逻辑视图。作为响应,汇编件聚集器或汇编件聚集器视图提供器104可以返回预先计算的汇编件聚集112,或者可以创建所请求的逻辑视图并且返回所创建的汇编件聚集112。可以提供规则,以确定可以被过滤出汇编件聚集的视图的信息。提供汇编件聚集的视图可以将一个汇编件映射到多个物理汇编件,以及/或者可以将许多汇编件映射到一个视图。通过使用现有的元数据文件格式,现有的编译器和工具可以读取汇编件聚集的视图,并因此无需被修改而与视图协同工作。汇编件聚集112可以包括构建时参考汇编件,该构建时参考汇编件包括汇编件聚集元数据的经过滤的视图。例如,来自规则文件或在单独工具中被编码的规则可以指定“所有具有特定定制属性的方法要被过滤出”。参考汇编件可以定义表面积(意指编译器、IDE 和静态分析工具的汇编件聚集的类型和成员的一个子集),并且为在编译时间或静态分析时间有用的附加注释提供机会。由构建时参考汇编件所提供的元数据的逻辑视图可以被限制为对取决于元数据的代码进行编译所需的元数据的子集。构建时参考汇编件是汇编件聚集如何提供灵活的粒度和访问的示例。例如,构建时参考汇编件可以包括针对公共可见的项但排除专用项的元数据。构建时参考汇编件的方法主体可以为空,因为中间语言方法主体不与构建操作相关。构建时参考汇编件因此可以是轻量实体,它不展示特定工具驱动的上下文所需的代码和元数据以外的中间码和元数据。构建时参考汇编件可以被置于任何 (任意)一个或多个位置中,所述位置包括访问时不需要管理特权的目录。构建时参考汇编件聚集可以用聚集汇编件作为输入被生成为一个后构建步骤,或者可以从以源语言编写的独立人为产物而生成。汇编件聚集可以在规范构建环境内部或外部在任一时刻被扩展,并且可以由包括软件提供者和软件使用者(例如软件提供者的消费者)在内的不确定集合的作者来扩展。 对汇编件聚集的改变可以反映在根据下一请求从聚集产生的构建时参考汇编件中。按照本文揭示的主体的一些方面,跨版本或跨平台的参考汇编件可以对在逻辑上等价但是根据所发布的版本或根据目标平台的不同而不同的构造进行聚集。可以从汇编件聚集检索定制的视图。在标准的运行时汇编件中,不可能描述同一类型的两个不同版本。另一方面,汇编件聚集可以对构成类型定义的中间码和元数据的全部或一个子集进行组合。 从该汇编件聚集中,工具可以检索用于各种目的的各种视图,例如用于标识跨版本的断开改变。按照本文揭示的主题的一些方面,为了改进运行时JIT编译进程开销或运行中编译开销以及降低工作集(由此改进性能),并且为了不影响执行而允许丰富的工具情况,可以分离出执行所不需要的数据。示例包括设计时、编译时和分析时的特定属性。在调试操作和代码分析中,包括分离的中间语言在内的参考汇编件视图可以与确定的中间语言聚集在一起,以便扩充静态的和/或运行时分析和运行时执行。确认方法(以及对象不变量)的预先条件和后续条件的跟踪语句或中间语言可以被存储在分离的汇编件中作为字节码。汇编件聚集可以提供该数据的经聚集的视图,适用于由工具或者由JIT 或运行中编译器本身进行消费。由于参考汇编件允许运行时汇编件和可用类型的编译时视图之间的分离,因此可以使用参考汇编件在编译时检查某些运行时策略决策。考虑一安全模型(诸如CLR和 Silverlight的透明度模型),其中诸方法被分成“安全”、“关键”和“安全一关键”桶,且不可信的应用程序仅能调用“安全”或“安全一关键”方法。在该视图中,运行时实施需要确保应用程序不调用任何“关键”的方法。可以通过向用户给予聚集的参考汇编件视图来提高开发体验,该参考汇编件视图仅包含“安全”和“安全一关键”方法。对访问“关键”方法的任何尝试会导致编译时差错而非运行时差错(由于失败的安全检查)。尽管这并未减轻运行时继续实施其安全模型,它通过确保不需要包括高度代码覆盖来确保遵循安全模型,从而显著地帮助了开发者。同一类型的过滤可以应用于诸如代码访问安全等其他安全模型, 以便为完全可信的和部分可信的消费者产生参考汇编件。参考汇编件视图可允许以更受训的方式来实现朋友汇编件。朋友关系首先在C++ 中的类层上引入,并且已在CLI中扩展以便把方法包括在标记为“内部”的汇编件中。目前,朋友汇编件的实现一般允许第一汇编件中的全部内部方法对于第二汇编件中的所有类型可见。朋友汇编件间的表面积未受紧密控制。由于对内部成员的方法几乎没有限制,因此开发者较不可能对内部方法的契约进行严格关注,或甚至有可能决定移除内部方法。如果显式地获悉特定方法曾被一朋友汇编件使用,则会获悉该方法和典型的内部方法相比, 具有额外的版本和兼容性要求。这样做的一种方式是用“FriendAccessAllowed(朋友访问被允许)”属性来扩展运行时的朋友汇编件的概念,并且仅把用该属性标记的内部方法包括在参考汇编件中(而不使所有内部方法都被包括在汇编件中的已知实现)。相反,按照本文揭示的主题的各方面,参考汇编件中展示的较小的内部表面积可防止对内部方法的访问, 除非显式地标记了内部方法。可以使用多个参考汇编件来展示库的子集,用于朋友汇编件的安全的补充编译时实施。多个参考汇编件也可用于编程模型限制。图2示出根据本发明主题的各方面用于提供中间码的方法的示例。在202,源代码可由诸如参照图1所述的编译器进行编译。编译器的输出是以中间码编写的物理汇编件。 元数据可以与所产生的字节码相关联。在204,诸如参照图1描述的汇编件聚集器/汇编件聚集视图提供器可以将(如上所述来自一个或多个源的)一个或多个物理汇编件和元数据聚集到一个汇编件聚集中。在206,汇编件聚集器/汇编件聚集器视图提供器可以从应用程序或其他实体接收对特定视图的请求。在208,汇编件聚集器/汇编件聚集器视图提供器可以确定所请求的视图是否已被预先计算。在210,如果汇编件聚集器/汇编件聚集器视图提供器确定所请求的视图已被预先计算和存储,则汇编件聚集器/汇编件聚集器视图提供器可以将所请求的视图返回至请求者。在208,如果汇编件聚集器/汇编件聚集器视图提供器确定所请求的视图不可用,则在212,汇编件聚集器/汇编件聚集器视图提供器可以计算该视图并将所请求的视图返回至请求者。在214,汇编件聚集的组份组件可以改变,从而改变汇编件聚集216。对已改变的汇编件聚集的视图的后续请求可返回更新的视图。可以理解,对汇编件聚集的一个或多个组份组件的改变可以在任何时刻发生,如上更完全描述的,视图可以被预先计算和存储。例如,可以在接收到对逻辑视图的请求之前把附加元数据添加至汇编件聚集。还可以理解,对物理汇编件的改变会改变汇编件聚集。对底层数据源的改变可以被自动地传播。例如,汇编件聚集可以被实现为指针的表,其中每个指针指向一个数据源,每个数据源包括一个或多个托管物理汇编件或者元数据的一个或多个源。
合适计算环境的示例为了提供有关本文所公开的主题的各个方面的上下文,图3以及以下讨论旨在提供其中可以实现各实施例的合适计算环境510的简要概括描述。尽管本文所公开的主题是在诸如程序模块等由一个或多个计算机或其它计算设备执行的计算机可执行指令的通用上下文中描述的,但本领域技术人员将认识到,本文所公开的主题的各部分还能够结合其它程序模块和/或硬件和软件的组合来实现。通常,程序模块包括执行特定任务或实现特定数据类型的例程、程序、对象、物理人为产物、数据结构等。通常,程序模块的功能可以在各个实施例中按需进行组合或分布。计算环境510只是合适的操作环境的一个示例,并且不旨在对此处所公开的主题的使用范围或功能提出任何限制。参考图3,描述了计算机512形式的通用计算设备。计算机512可包括处理单元 514、系统存储器516和系统总线518。处理单元514可以是各种可用处理器中的任一种。还可以使用双微处理器及其他多处理器体系结构作为处理单元514。系统存储器516可包括易失性存储器520和非易失性存储器522。非易失性存储器522可包括只读存储器(ROM)、 可编程ROM (PROM)、电可编程ROM (EPROM)或闪存。易失性存储器520可包括可充当外部高速缓冲存储器的随机存取存储器(RAM)。系统总线518将包括系统存储器516的系统物理人为产物耦合到处理单元514。系统总线518可以是几种类型的总线结构中的任何一种,包括存储器总线、存储控制器、外围总线、外部总线或局部总线,并且可以使用各种可用总线体系结构中的任一种。计算机512通常包括各种计算机可读介质,诸如易失性和非易失性介质、可移动和不可移动介质。计算机存储介质可以通过用于存储诸如计算机可读指令、数据结构、程序模块或其它数据等信息的任何方法或技术来实现。计算机存储介质包括但不限于,RAM、 ROM、EEPR0M、闪存或其它存储器技术、CDR0M、数字多功能盘(DVD)或其它光盘存储、磁盒、 磁带、磁盘存储或其它磁存储设备、或可以用来储存所期望的信息并可由计算机512访问的任一其它介质。将理解,图3描述了可充当用户与计算机资源之间的媒介的软件。该软件可以包括可存储在盘存储5M上的操作系统528,该操作系统可控制并分配计算机系统512的资源。盘存储5M可以是通过诸如接口 5 的不可移动存储器接口连接到系统总线518的硬盘驱动器。系统应用程序530利用由操作系统5 通过存储在系统存储器516或者存储在盘存储5M上的程序模块532和程序数据534对资源的管理。应该明白,计算机可用各种操作系统或操作系统的组合来实现。用户可通过输入设备536向计算机512输入命令或信息。输入设备536包括但不限于定点设备,诸如鼠标、跟踪球、指示笔、触摸垫、键盘、话筒等。这些及其他输入设备通过系统总线518经由接口端口 538连接到处理单元514。接口端口 538可表示串行端口、并行端口、通用串行总线(USB)等。输出设备540可与输入设备使用相同类型的端口。提供输出适配器M2以举例说明存在像监视器、扬声器、以及打印机的需要特定适配器的一些输出装置M0。输出适配器542包括但不限于,在输出设备540和系统总线518之间提供连接的视频卡和声卡。其他设备和/或设备系统,诸如远程计算机M4,可提供输入和输出两种能力。计算机512可以使用到诸如远程计算机544之类的一个或多个远程计算机的逻辑
11连接来在联网环境中操作。远程计算机544可以是个人计算机、服务器、路由器、网络PC、对等设备或其它常见的网络节点,并且通常包括许多或所有以上相对于计算机512所描述的元件,尽管在图3中仅示出了存储器存储设备M6。远程计算机544可经由通信连接550逻辑地连接。网络接口 548涵盖诸如局域网(LAN)和广域网(WAN)这样的通信网络,但也可包括其他网络。通信连接550是指用来将网络接口 548连接到总线518的硬件/软件。连接550可以在计算机512内部或外部并且包括诸如调制解调器(电话、电缆、DSL和无线) 和ISDN适配器、以太网卡等内部和外部技术。应该理解,所示网络连接仅是示例,并且可以使用在计算机之间建立通信链路的其它手段。本领域的普通技术人员可以理解,计算机512或其它客户机设备可作为计算机网络的一部分来部署。在这一点上,本文所公开的主题涉及具有任意数量的存储器或存储单元以及在任意数量的存储单元或卷上发生的任意数量的应用程序和进程的任何计算机系统。本文所公开的主题的各方面可应用于具有部署在网络环境中的具有远程或本地存储的服务器计算机和客户计算机的环境。本文所公开的主题的各方面也可应用于具有编程语言功能、解释和执行能力的独立计算设备。图4示出集成开发环境(IDE)600和通用语言运行时环境602。IDE 600可允许用户(例如,开发者、程序员、设计者、编码者等)在计算机系统中设计、编码、编译、测试、 运行、编辑、调试或构建程序、程序集、网站、web应用程序和web服务。软件程序可包括以一种或多种源代码语言(例如,Visual Basic、Visual J#、C++、C#、J#、Java Script、APL、 COBOL、Pascal、Eiffel、Haskell、ML、Oberon、Perl、Python、Scheme^ Smalltalk 等)创建的源代码(组件610)。IDE 600可提供本机码开发环境,或者可提供在虚拟机上运行的托管代码开发,或者可提供其组合。IDE 600可提供使用.NET框架的托管代码开发环境。可使用语言专用源编译器620从源代码组件610和本机码组件611创建中间语言组件650,并且在执行应用时使用中间语言编译器660(例如,即时(JIT)编译器,或在较简单的实施例中的解释器)从中间语言组件650创建本机码组件611(例如,机器可执行指令)。S卩,当IL 应用被执行时,其在被执行的同时被编译成适合正在其上执行它的平台的合适机器语言, 藉此使代码能跨若干平台便携。或者,在其他实施例中,程序可被编译成适合其目标平台的本机码机器语言(未示出)。用户可根据已知软件编程技术以及与特定源语言相关联的特定逻辑和句法规则经由IDE 600中的用户接口 640和源代码编辑器651来创建和/或编辑源代码组件。此后, 源代码组件610可经由源编译器620被编译,藉此可创建该程序的中间语言表示,诸如汇编 630。汇编630可包括中间语言组件650和元数据642。应用程序设计可以能够在部署前被验证。此处所述的各种技术可结合硬件或软件,或在适当时以其组合来实现。由此,本文所公开的方法和装置或其特定方面或部分可采取包含在诸如软盘、CD-ROM、硬盘驱动器或任何其它机器可读存储介质等有形介质中的程序代码(即,指令)的形式,其中当程序代码被加载到诸如计算机等机器内并由其执行时,该机器成为用于实现本文所公开的主题的各方面的装置。在程序代码在可编程计算机上执行的情况下,计算设备通常将包括处理器、该处理器可读的存储介质(包括易失性和非易失性的存储器和/或存储元件)、至少一个输入设备、以及至少一个输出设备。可例如通过使用数据处理API等来利用域专用编程模型各方面的创建和/或实现的一个或多个程序可用高级过程编程语言或面向对象的编程语言来实现以与计算机系统通信。然而,如果需要,该程序可以用汇编语言或机器语言来实现。 在任何情形中,语言可以是编译语言或解释语言,且与硬件实现相结合。
虽然已结合附图描述了本文所公开的主题,但是应理解,可作出修改以按不同方式执行相同功能。
权利要求
1.一种向中间码提供逻辑扩展的系统(100),包括汇编件聚集器(104),用于聚集多个物理汇编件的至少一个物理汇编件(106),所述至少一个物理汇编件(106) 包括由编译器(10 与所述至少一个物理汇编件相关联的原始元数据,用来自多个数据源 (110)的至少一个数据源(108)的扩展元数据来创建汇编件聚集(112),所述汇编件聚集 (112)包括所述至少一个物理汇编件(106)和来自所述至少一个数据源(108)的扩展元数据的逻辑视图;以及从请求者接收对所述汇编件聚集的特定视图的请求,并且返回被定向至所述请求者的所述特定视图。
2.如权利要求1所述的系统,其特征在于,所述汇编件聚集器预先计算定向至所述请求者的特定视图并将其存储在数据存储中。
3.如权利要求1所述的系统,其特征在于,所述汇编件聚集器响应于所述请求计算所述汇编件聚集的特定视图并将所计算的视图返回至所述请求者。
4.如权利要求1所述的系统,其特征在于,响应于对所述汇编件聚集的组件的改变,所述汇编件聚集被改变。
5.如权利要求1所述的系统,其特征在于,所述汇编件聚集的特定视图包括传统组件、 特定环境的本机二进制图像、NGEN的图像、包括被限制为将源代码编译成中间字节码所需的元数据的元数据子集在内的构建时参考汇编件、或者包括被限制为执行参考汇编件所需的元数据的元数据子集在内的运行时参考汇编件。
6.一种扩展中间码的方法,包括生成多个物理汇编件的至少一个物理汇编件O02),所述至少一个物理汇编件包括由编译器生成的原始元数据;将所述至少一个物理汇编件和来自多个数据源中至少一个数据源的扩展元数据聚集到一汇编件聚集中O04),所述汇编件聚集包括所述至少一个汇编件和来自所述至少一个数据源的所述扩展元数据的逻辑集合;以及将所述汇编件聚集存储在数据存储中012)。
7.如权利要求6所述的方法,其特征在于,还包括从请求者接收对所述汇编件聚集的特定逻辑视图的请求。
8.如权利要求6所述的方法,其特征在于,还包括预先计算所述汇编件聚集的特定逻辑视图并存储预先计算的特定逻辑视图。
9.如权利要求7所述的方法,其特征在于,还包括将所述汇编件聚集的所请求的特定逻辑视图返回至所述请求者。
10.一种包括计算机可执行指令的计算机可读存储介质,所述指令在被执行时使计算环境生成多个物理汇编件的至少一个物理汇编件的逻辑视图012),所述至少一个物理汇编件包括由编译器生成的原始元数据,还包括来自多个数据源中至少一个数据源的扩展元数据,将所述至少一个物理汇编件和所述扩展元数据聚集到一汇编件聚集中,所述汇编件聚集包括所述至少一个汇编件和来自所述至少一个数据源的所述扩展元数据的逻辑集合; 以及向请求者提供所述汇编件聚集的逻辑视图,所述逻辑视图被提供给被定向至所述请求者的请求者012)。
11.如权利要求10所述的计算机可读存储介质,其特征在于,还包括在被执行时使所述计算环境执行以下动作的计算机可执行指令从所述请求者接收对所述汇编件聚集的特定视图的请求。
12.如权利要求11所述的计算机可读存储介质,其特征在于,还包括在被执行时使所述计算环境执行以下动作的计算机可执行指令将所述汇编件聚集的所述特定视图返回至所述请求者。
13.如权利要求11所述的计算机可读存储介质,其特征在于,还包括在被执行时使所述计算环境执行以下动作的计算机可执行指令预先计算和存储所述特定视图,所述特定视图被定向至所述请求者并且将所保存的视图返回至所述请求者。
14.如权利要求10所述的计算机可读存储介质,其特征在于,还包括在被执行时使所述计算环境执行以下动作的计算机可执行指令扩展、编辑或创作对所述汇编件聚集的组件的改变,而无须使所产生的汇编件无效,所述组件包括所述至少一个数据源或者编译后的所述多个物理汇编件中的物理汇编件。
15.如权利要求12所述的计算机可读存储介质,其特征在于,还包括在被执行时使所述计算环境执行以下动作的计算机可执行指令提供统组件、特定环境的本机二进制图像、NGEN的图像、包括被限制为将源代码编译成中间码所需的元数据的元数据子集在内的构建时参考汇编件、或者包括被限制为执行参考汇编件所需的元数据的元数据子集在内的运行时参考汇编件。
全文摘要
可以对汇编件聚集进行创作、代理、访问、修改和分布等,所述汇编件聚集包括中间码和元数据的任意定义的集合的虚拟的逻辑视图。可以聚集汇编件信息的多个物理容器以创建称为汇编件聚集的单个逻辑汇编件。汇编件可以被重新定义为针对(或投影至)汇编件聚集的逻辑视图。这一汇编件可以被定向至请求者也就是,汇编件可以根据工具和/或执行上下文而不是遵循运行时所实施的显式或隐式要求而被重新定义。
文档编号G06F9/45GK102177502SQ200980140371
公开日2011年9月7日 申请日期2009年9月30日 优先权日2008年10月8日
发明者B·E·瑞克托, B·H·文特尔, B·M·格林克迈尔, K·J·克瓦利纳, M·C·范宁 申请人:微软公司

最新回复(0)