的主题不必要限于上述的特征或上述动作。相反,所述特征和动作被公开作为实现权利要求的示例形式。
[0026]本领域的技术人员将领会,本发明可以在具有许多类型的计算机系统配置的网络计算环境中实现,包括个人计算机、台式计算机、膝上型计算机、消息处理器、手持设备、多处理器系统、基于微处理器的或可编程的消费者电子设备、网络PC、小型计算机、大型计算机、移动电话、PDA、寻呼机、路由器、交换机等等。本发明也可以在分布式系统环境中实现,在分布式系统环境中,通过网络链接(或通过硬线数据链路、或通过无线数据链路、或通过硬线和无线数据链路的组合)的本地和远程计算机系统两者均执行任务。在分布式系统环境中,程序模块可位于本地和远程的存储器存储设备两者中。
[0027]图2图示其中此处所述的原理可操作的环境200。环境200包括跟踪对象图表的隔离和易变性的框架210。框架210通过控制对引用的访问来组织对对象图表的各种引用221。引用可以是局部变量、方法参数、对象字段、或者对对象图表的任何其他引用。在图示实施例中,引用221被图示为包括引用221A到221E,尽管椭圆221F字符地表示了框架210可以管理对任何数量的引用220的访问。
[0028]框架210通过向引用分配许可来管理对引用221的访问。“许可”是对引用的注释,该注释指示与引用是否可变有关的某一属性。这种许可由图2中的许可211抽象地表示。许可包括可读许可211A、可写许可211B以及不可变许可211C。
[0029]“可读”许可211A意指相应的对象(以及其全部直接和间接可达成员)仅仅可被读。
[0030]“可写”许可21IB意指相应的对象可被写。
[0031]“不可变”许可21IC类似于可读许可211A,但进一步保证没有其他人具有对该对象的可写引用。不可变许可211C还可以保证不再会有对该对象的可写引用。因此,不可变许可211C意指相应的对象不再被写(以及其全部直接和间接可达成员将不再被写),类似地,其全部字段以及其全部字段的字段等等将不再被写。对象中的所有静态字段被视为通过框架210具有不可变许可211C。
[0032]“新鲜”许可211D规定:1)对已返回引用所引用的特定对象图表(或该特定对象图表内的任何对象)没有外部引用,以及2)在对象图表内没有对该对象图表外部的任何对象的可变引用。以下将进一步详细描述“未构造”许可211E。
[0033]框架210也包括隔离的存储器管理器212,该隔离的存储器管理器212将存储器位置注释为隔离。存储器位置上的“隔离”注释意指该位置存储一个外部唯一的值。也就是说,对于该位置中存储的任何对象,在系统中没有对该对象的外部引用,也没有对存储在该位置中的对象的任何直接或间接可达成员的任何引用。例如,隔离的存储器管理器212管理隔离的存储器位置222。隔离的存储器位置被图示为包括两个隔离的存储器位置222A和222B,尽管椭圆222C表示隔离的存储器位置222可以包括任何数量的隔离的存储器位置。
[0034]注释组件201构建于框架210上。或者或另外,注释组件201可以作为框架210的一部分而操作。注释组件201被配置成评估返回一引用的可执行组件,所述引用诸如图2的引用221之一。
[0035]该描述解决了处理引用许可的系统中与如何表示在构建完成时总是不可变的类型有关的难题。这些类型的字段是不可变且只读的,且它们甚至不能通过可写引用被改变。目前没有能藉此发生改变的机制。下文中,这些类型将被称为“不可变类型”,而其他将被称为“可变类型”。
[0036]不可变类型在系统编程中是常见的,因为它们表示可以在不同组件和不同线程间自由共享的数据块。没有比一个组件会以其结果对另一组件可见的方式改变数据更危险的了。
[0037]归类不可变类型中的第一个难题是不可变类型通常将被归类为“可写”的输入参数带入其构造器。然而,可写输入不被存储于字段中,而是构造下的实例,因此,对象类型总体不再会被视为不可变、而会是可变类型。然而,不可变类型可以不基于(based off)可写输入参数来计算某些不可变数据,然后将该最终不可变值存储为字段。因此,不可变类型自相应实例被构造的那点开始保留其不可变特征。
[0038]如果对构造器的输入仅包含不可变的或新鲜的输入,则该对象可以被升级为“不可变”。然而,这一规则不会导致所有不可变对象都被归类为不可变。例如,考虑以下伪代码示例:
[0039]public class Container
[0040]{
[0041 ] readonly immutable string m_name ;
[0042]readonly immutable string m_address ;
[0043]public Container(writable Student student)
[0044]{
[0045]m_name = student.Name ;
[0046]m_address = student.Address ;
[0047]}
[0048]}
[0049]在该示例中,Container在构造之后实际是不可变的,而类型Container获得称为Student的输入参数,该输入参数被声明为可写。因此,规则(S卩,若到构造器的输入仅包含具有不可变或新鲜许可的输入参数,则对象可以被提升为“不可变”)会因此使该类型不具备被提升为不可变的资格,因为它采用了可写输入。这会允许可读的最大许可。
[0050]第二个难题在于为不可变类型和非不可变类型定义公共存储器。在编程时,有利的是定义可以是可用于任何对象的存储的位置,使得所存储的值可以以原始状态被检索。当存储位置需要接受可变和不可变类型时这打破,因为不存在针对两种类型都可行的可能的许可。考虑以下伪代码示例:
[0051]writable Student student =...;
[0052]immutable string name =...;
[0053]??? object storage ;
[0054]if (condit1n) {
[0055]storage = name ;
[0056]}
[0057]else{
[0058]storage = student ;
[0059]}
[0060]在该示例中,没有办法为“storage (存储)”位置取得许可,该许可将允许来自“student (学生)”和“name (名字)”两者的分配、且允许以其原始许可被检索。每个许可具有一个问题。例如,“可写”许可会防止“name (名称)”被分配,因为不可变引用不能被存储在被标记为“可写”的引用中。“不可变”许可会防止“student (学生)”被分配,因为可写引用不能被存储在不可变位置中。“可读”许可会防止向“storage (存储)”的分配以及自“storage (存储)”的检索,因为所分配的和检索的值会具有与其原始拥有的值所不同的许可。
[0061]此处描述的原理通过介绍不可变类型的概念而解决了这些问题。存在用户向类型声明添加用于指示该类型的所有实例不可变的明确注释。例如,尽管此处描述的原理不限于不可变类型被声明的方式,但是考虑以下示例伪代码:
[0062]immutable class String{
[0063]...
[0064]}
[0065]图3图示其中可采用此处所述的原理的环境300。创作进程310 (诸如创作程序)允许编程或其他编程实体(诸如软件)生成代码311 (诸如源代码或中间语言代码),所述代码311包括不可变类型声明312,以上刚示出不可变类型声明312的一个示例。然后,编译器320编译代码311,在编译之际遇到