关于资源引用的寿命的声明的制作方法_2

文档序号:9457652阅读:来源:国知局
执行的引用212的寿命。
[0028] 图3示出了用于宣布软件程序中的特定引用具有有限寿命的方法300的流程图。 方法300可以由图2的类型定义生成组件201执行。方法包括访问构建中的包括定义资源 的引用的软件程序(动作301)。软件程序可以是例如源代码或可能甚至是中间代码。然 后,软件程序中的引用(例如,引用213)被注释为与具有有限寿命的特定作用域215相关 联(动作302)。再次,注释被构建使得编译器将引用的寿命强制执行为基于特定作用域的 寿命。例如,注释可以被构建使得编译器将引用的寿命强制执行为不比特定作用域的寿命 长。替代地,注释可以被构建使得编译器将引用的寿命强制执行为比特定作用域的寿命短。
[0029] 再次参考图2,类型定义访问组件202访问包括被限定了作用域的引用212的类型 定义211。编译组件203通过制订导致引用213的寿命是特定作用域215的寿命的函数的 计算机可执行指令217,对被限定了作用域的引用212作出响应;以及,作为编译的计算机 程序217的一部分,包括制订的计算机可执行指令217。
[0030] 图4示出了用于编译具有注释的计算机程序的方法400的流程图。该方法可以 由例如图2的编译组件203来执行。但遇到正在被编译的计算机程序中的注释之际(动 作401),编译组件就制订导致引用的寿命基于特定作用域的寿命的计算机可执行指令(例 如,指令217)(动作402)。例如,这样的指令可以导致引用的寿命不比特定作用域的寿命 长,或者或许可以导致引用的寿命不比特定作用域的寿命短。编译器包括计算机可执行指 令,作为编译的计算机程序的一部分(动作403)。例如,包括指令217,作为图2的已编译 的程序216的一部分。
[0031] 有三种类型的作用域,此处将只作为示例描述。现在将按顺序描述这三种类型,第 一种此处被称为"词法作用域",第二种被称为"栈框架作用域",而第三种被称为"对象关系 作用域"。然而,较广泛的原理不仅限于这些特定作用域,因为原理可以应用于将引用寿命 绑定到具有有限寿命的任何一个其他引用的寿命。
[0032] 第一种类型是词法作用域。这使用C#概念的块作为作用域。任何给定块都比它 被嵌套在其中的块年轻,并且可以将被限定了作用域的引用指定到内层块中。将引用指定 到定义块之外的任何企图都会导致编译器错误。考虑下列伪代码示例:
[0033] scopedWidgetouter;
[0034] if(condition) {
[0035] scopedWidgetinner=outer;//ok
[0036] …
[0037] }
[0038] outer=inner;//error
[0039] 有两个规则要考虑。上面的示例示出了一个规则:每一被限定了作用域的引用都 与一个作用域相关联,较年轻的作用域中的引用不可被使用,就好像它们是较旧的作用域 中的引用。在此示例中,第一指定的"scopedWidgetinner=outer"是正确的分配,因为 变量"outer"与比它在此分配中分配到的被限定了作用域的引用较旧的作用域相关联。进 一步考虑下列伪代码示例
[0040] scopedWidgetouter;
[0041 ] if(condition) {
[0042] Widgetinner=outer;//error
[0043] …
[0044] }
[0045] 此示例示出了第二规则,其中引用也可以未被限定作用域。未被限定作用域的引 用不与作用域相关联,不管它们在程序的文本中在词法上在哪里发生。未被限定作用域的 另一种理解方式是将其理解为最大的可能的作用域。因此,未被限定作用域的引用可以被 使用,就好像它们是被限定作用域的引用,但反过来不成立。在此示例中,"Widgetinner= outer"的分配不被准许,尽管"inner"在未被限定作用域的变量中。这是因为变量"inner" 是未被限定作用域的变量,而变量"outer"是被限定作用域的变量。如此,在此示例中,尝试 使用被限定作用域的变量"outer",就好像它是未被限定作用域的变量,这是不被准许的。
[0046] 第二种作用域区域严格地处理对象寿命,此处被称为"栈框架作用域"。这常常与 词法作用域很紧密地对齐,但是跟踪不同的思想。每一栈框架都表示不同的作用域,较新的 框架比它们前面的那些较年轻。还有比每一栈区域旧的堆区域。此作用域跟踪确保在给定 栈框架上分配的对象决不会被存储到将比它们被分配于其中的框架存活得长的框架中。
[0047] 第三种被限定作用域的区域是对象关系作用域。这允许引用被限定作用域到特定 对象实例。所产生的引用不会比它被关联到的对象存活得长。甚至在特定引用的被限定作 用域的区域是未知的情况下,这也可以实现。例如,考虑下列伪代码示例:
[0048]
[0049]
[0050] 在此示例中,从GetField返回的值将与在其上调用GetField的对象相同的作用 域中被定义。如果对象没有与它相关联的作用域,则对返回的值的访问将同样未受限制。
[0051] 为了消费被限定了作用域的值,方法将把其参数或这一值标记为被限定了作用 域。这将参数或"这一值"的使用限制到未限定作用域的所有输入值的最小寿命。
[0052] 除对资源的控制之外,被限定作用域的引用提供的另一个优点是能够在栈上而不 是在堆上有效率地分配对象。通常,受管理的对象将在堆上执行其大部分对象分配,并且当 存储器不再使用时,让垃圾回收器稍后收回存储器。在分配被密切地监视并且堆分配常常 被禁止的系统编程中,这常常是无法接受的。被限定作用域的引用允许我们保证对象不在 超出程序中的某一点以外的地方被引用,消除了存储到堆中的必要性。考虑下列伪代码:
[0053]
[0054] 在此示例中,Widget实例被分配到被限定了作用域的引用位置。这将Widget值 的使用限制到包含本地命名的"widget"的词法作用域。一旦退出作用域,就可保证该值在 系统中未被取别名,并可以被立即收回。这允许我们在栈上安全地执行此分配,并避免不必 要的堆污染。此机制还允许我们在栈上能证实地分配lambda函数以及它们的相关联的闭 包(closure)对象。
[0055] 如前所述,系统中的某些类型只为资源管理而存在。它们旨在只以被限定了作用 域的方式使用,否则,将构成资源的无效使用。清理例程通常也与这些类型相关联(释放句 柄)。此构造被制订为具有下列属性的被限定了作用域的类型:1)被限定了作用域的类型 只能被分配到被限定了作用域的引用或被限定了作用域的类型的字段中,以及,2)被限定 了作用域的类型可以定义将在值刚刚要超出作用域之前执行的清理功能。另外,由于它们 始终以被限定了作用域的方式使用,因此被限定了作用域的类型可以始终被在栈上分配。
[0056] 相应地,描述了用于对引用的寿命的有效率的并且有效的实施的机制。本发明可 具体化为其它具体形式而不背离其精神或本质特征。所描述的实施例在所有方面都应被认 为仅是说明性而非限制性的。从而,本发明的作用域由所附权利要求书而非前述描述指示。 落入权利要求书的等效方案的含义和作用域内的所有改变应被权利要求书的作用域所涵 盖。
【主权项】
1. 一种用于声明软件程序中的特定引用具有有限寿命的计算机实现的方法,所述方法 包括: 访问构建中的包括定义资源的引用的软件程序的动作;以及 注释要与具有有限寿命的特定作用域相关联的所述软件程序的引用的动作, 其特征在于,所述注释被构建使得所述编译器将所述引用的寿命强制执行为基于所述 特定作用域的所述寿命。2. 根据权利要求1所述的方法,其特征在于,所述注释被构建使得所述编译器将所述 引用的所述寿命强制执行为不比所述特定作用域的寿命长。3. 根据权利要求1所述的方法,其特征在于,所述特定作用域是词法作用域。4. 根据权利要求1所述的方法,其特征在于,所述特定作用域是栈框架作用域。5. 根据权利要求1所述的方法,其特征在于,所述特定作用域是对象关系作用域。6. 根据权利要求1所述的方法,其特征在于,所述软件程序是源代码。7. 根据权利要求1所述的方法,其特征在于,所述软件程序是中间代码。8. -种计算机程序产品,包括在其上具有计算机可执行指令的一个或多个计算机可读 取的存储介质,所述计算机可执行指令被构建为,使得当由计算系统的一个或多个处理器 执行时,导致所述计算系统执行编译器,所述编译器被配置成在遇到计算机程序中的注释 时执行下列操作,所述注释将所述引用与特定作用域相关联: 制订导致所述引用的寿命基于所述特定作用域的所述寿命的计算机可执行指令的动 作;以及 包括所制订的计算机可执行指令,作为所编译的计算机程序的一部分。9. 根据权利要求8所述的计算机程序产品,其特征在于,所述计算机可执行指令导致 所述引用的寿命不比所述特定作用域的寿命短。10. 根据权利要求8所述的计算机程序产品,其特征在于,所述特定作用域是词法作用 域、栈框架作用域、或对象关系作用域。
【专利摘要】通过指定表示资源的引用的寿命来提高系统编程中的安全性的语言扩展。根据语言扩展,寿命以这样的方式引用特定作用域,其中编译器生成将引用的寿命强制执行为基于特定作用域的寿命(例如,不比其长)的计算机可执行指令。相应地,可以预先指定资源寿命具有特定作用域。这会帮助执行资源管理,因为典型的受管理的语言程序可以允许资源无限制地存在。此外,由于资源具有定义的有限寿命,因此,它们可以更方便地在栈上(而不是在对上)被分配,以便更有效的处理。
【IPC分类】G06F9/45
【公开号】CN105210035
【申请号】CN201480004086
【发明人】J·P·帕森斯, J·J·达菲, G·S·凯岑伯格, A·D·布罗姆菲尔德, Y·罗岑菲尔德
【申请人】微软技术许可有限责任公司
【公开日】2015年12月30日
【申请日】2014年1月3日
【公告号】EP2941700A1, US20140196015, WO2014107545A1
当前第2页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1