带有增量改变的高效不可变句法表示的制作方法

文档序号:6351780阅读:103来源:国知局
专利名称:带有增量改变的高效不可变句法表示的制作方法
带有增量改变的高效不可变句法表示
背景技术
在计算机科学中,树是被链接的节点的分层数据结构。树是非循环连接图,其中该树中的每一节点具有零个或更多子节点以及最多一个父节点。节点可包含值、条件,或可表示分开的数据结构(诸如另一树)。按 照惯例,子节点在树中位于其父母“之下”,就是说,计算机科学的树(不像自然的树)是向下生长而非向上生长。具有孩子的节点被称为该孩子的父节点、其祖先或其上级节点。树在计算机中由存储器中的节点以及表示该树中边缘的引用来表示。每一父节点具有对其子节点的引用,但并非每一子节点都具有对其父节点的引用。没有孩子的节点被称为叶子节点或端节点。节点的高度是从该节点至叶子的最长向下路径的长度。根的高度是该树的高度。节点的深度是至其根的路径(即,其根路径)长度。树中最上面的节点被称为根节点。根节点不具有父母。对树的操作通常在根节点处开始。树中的任何节点可通过跟随各节点之间的指针或链接从根节点到达。当到达树中特定节点时,操作被频繁地执行。中间节点是树中具有子节点的任何节点。由此,因为叶子节点没有子节点,所以叶子节点不是中间节点。树中每一节点可被看作从该节点传下来的子树的根节点。术语“子树”指的是包含树中一节点以及树中该节点的所有子孙的树。对应于根节点的子树是整个树;对应于任何其他节点的子树被称为真子树。树可以用许多不同的方式来表示。某些常见表示将节点表示成被分配在堆(不要与堆数据结构混淆)上带有指向其子节点、其父亲、或指向子节点和父节点两者的指针的记录,或被表示成阵列中的项,该阵列(例如,二进制堆)具有由各节点在阵列中的位置所确定的各节点之间的关系。可通过跟随一系列父节点和这些父节点的子节点之间的连接或指针来对树进行遍历。前序遍历在其到达父节点的子节点之前抵达该父节点。后序遍历是其中在遍历父节点之前遍历该父节点的子节点的一种遍历。解析树或句法树通常是根据某些形式语法来表示串的句法结构的有序的有根树。在解析树中,内部节点由语法的非终端来标记,而叶子节点由语法的终端来标记。产生这些树的一种类型的程序被称为解析器。解析树或句法树经常在计算机编程语言的处理期间被生成。

发明内容
不可变的树可允许多线程上的多个客户机使用同一树,而不会有观察到由其他线程同时造成的改变的风险。此外,能够使用并重复使用树的各部分使得处理更为高效,因为当只有树的小部分被改变时整个树不必一次又一次地被创建。部分的树可在单向树中被重复使用,单向树是其中该树的节点仅指向或是直接在其之下或是直接在其之上的一个或多个节点的一种树。即,在只在一个方向上具有指针的树中,根可指向直接在其之下的节点,且这些节点中的每一个可指向直接在其之下的一个或多个节点(依次类推),但树中任何节点都不指向其父节点和其子节点两者。这是通常情况,然而,在两个方向上都具有指针(双向指针)的树比具有单向指针的树有用得多。传统的具有双向指针的树不能重复使用,而不能重复使用的树在处理资源方面成本较高,且因此通常较不高效。为使消费者能够创建由多个消费者使用的新版本的树而不牺牲高效性或数据完整性,创建了包括第一不可变私人树和第二公共树的数据结构。公共树控制对私人树的访问。私人树和公共树的结合使得数据结构中能够存在向上引用和向下引用,且使得不可变(只读或不能改变的)和可改变的特性能够在同一数据结构中共存。数据结构的部分可在其他树数据结构中被重复使用。私人树保留了允许其被重新组装和重复使用的相对信息。公共树保留了消费者专用信息,且使得工具能够搜索并将私人树中的子树定位目标。公共树(除根节点之外)的构建可被推迟,直到公共树中的节点被请求。响应于对访问私人树中节点的消费者请求,可按需构建公共树。
上述数据结构可用于以允许双向指针的方式来呈现编译器生成的诸如解析树、句法树、语义树和绑定树之类的树,要呈现的消费者专用且相对的位置是不可变的但是允许树的高效创建和进化,从而创建数据结构的只读树的新版本而无需重新创建整个树。提供本概述以便以简化形式介绍将在以下详细描述中进一步描述的一些概念。本概述并不旨在标识所要求保护主题的关键特征或必要特征,也不旨在用于限制所要求保护主题的范围。


在附图中图Ia是本领域已知的树数据结构的示例的框图;图Ib是本领域已知的树数据结构的另一示例的框图;图Ic是本领域已知的树数据结构的另一示例的框图;图Id示出了根据此处所公开的主题的各方面的用于带有增量改变的高效不可变句法表示的系统100的示例;图Ie是根据此处所公开的主题的各方面的数据结构的框图;图2a是根据此处所公开的主题的各方面的用于带有增量改变的高效不可变句法表示的方法的示例的流程图;图2b是根据本文所公开主题的各方面的根节点的示例的框图;图2c是根据此处所公开的主题的各方面的非根节点的示例的框图;图2d是根据此处所公开的主题的各方面的非根节点的另一示例的框图;图3是示出了其中可以实现此处所公开的主题的各方面的计算环境的示例的框图;以及图4是根据此处所公开的主题的各方面的集成开发环境的示例的框图。
具体实施例方式概览诸如计算机语言解析树(描述被拆分成语法元素的输入源代码的语言解析器的输出)、句法树、语义树和绑定树(包括诸如导出成员等的绑定信息的树)之类的树对于许多不同类型的消费者是有用的,包括诸如编译器、调试器、源代码编辑器、类设计器、架构资源管理器(architecture explorer)、诸如度量、规则检查器和源代码解构工具等代码分析器之类的开发工具。为给予多个消费者在同一时间对同一树的访问权同时维护数据完整性,树可被表示成不可变(只读)结构。消费者还可能希望能够或是直接地或是间接地(例如,通过修改从中生成树的文件中的文本来间接修改该树)对树作出修改。然而,由于消费者不能直接地修改共享的只读树,因此必需构建新的只读树以表示消费者对树的已修改版本,而仍然允许其他消费者用原始树来工作。理想地,至少部分的现有的树会在构建新树时能够被重复使用。树数据结构的消费者常常希望具有向上和向下导航通过该结构的能力,使得向上和向下引用都是有用的,但带有向上和向下引用的树的片段不能在其他树中被重复使用。为理解为何如此,图Ia示出了解析树,即可能被生成以表示“返回3. 14打~2”语句的树10。树10具有向下指(自父节点至子节点)的单向指针。现在参考图lb,假设消费者希望修改树10以反映语句“返回Math. PI*r~2”(用表示“Math. PI”的节点来代替表示 “3. 14”的节点)。图Ib的树12反映了新语句,即“返回Math.PI*r~2,,。如图Ia和Ib中所示,树10与树12分开。这意味着树12与树10基本使用相同的存储器量,因为与树10不共享任何节点的分开的树(树12)已被构建。对于包含数千个节点的大树,这样的进程缺乏高效性(是资源成本高的)。为使得创建表示已修改语句“返回Math. PI*r~2”的树的该进程更高效,树10的未改变部分可由两个树共享。在树10与同树10共享某些节点的第二树之间显然不能共享的节点是表示“Math”的节点16、表示“PI”的节点18以及表示”的节点20。这些节点不能被共享,因为树10中没有与节点16和节点18对应的节点,并且与树12中表示”的节点20对应的节点是树10中表示“3. 14”的节点22。显然,节点20与节点22不相同。树10中还有不能被重复使用的其他节点。树12中表示的节点24与树10中表示的节点26不相同,因为节点26具有两个子节点,其中最左边的一个是表示“3. 14”的节点22,而树12的表示的节点24具有最左边的表示”的子节点20。类似地,尽管树12中的节点28表示“Stmt”而树10中的节点30也表示“Stmt”,但节点28与节点30不相同,因为节点28的最右边的孩子是节点24,该节点24与树10中的节点26不是相同的节点。类似地,树12的节点32与树10的节点34不是相同的节点。然而,其他节点,即在两个树(图Ia的树10和图Ib的树12)中由间断线表示的且由参考数字9标记的节点可被共享。由于这些节点结构上是相同的,因此它们可被重复使用。只要树中的指针是单向的(在该示例中从父节点指向子节点),则所有用虚线表示的节点可被共享。图Ic示出树14(其中某些信息可在各树之间被共享)是通过将新树(即树14)的节点指向树10的未改变节点来共享的。可以理解,树的各共享部分维护了数据完整性,直到树中从孩子指向父亲的指针被添加。例如,检查图Ic中树10的节点36揭示了对于树14的节点36、节点24以及树10的节点24存在两个可能的父节点。由此,对树10和树14进行多个可能的后序遍历是可能的。由于对树10和14进行多个可能的后序遍历是可能的,因此数据完整性由于例如对于问题“节点36的父节点是什么? ”存在两个可能的回答而丢失。根据本文所公开的主题的各方面,数据结构包括私人树和公共树,私人树对一个 或多个消费者不直接可用,而公共树对一个或多个消费者直接可用。公共树提供对私人树的间接访问。私人树具有从父节点指向子节点的单向指针且可被重复使用。公共树可以是不可重复使用的双向引用树,或可以是可重复使用的单向指向树。公共树中的树元素还可指向消费者不可访问的私人树中对应或等效的树元素。即,公共树中的节点可指向其在公共树中的父节点,并且还可指向等效的私人树节点。公共树中的该节点还可具有指向其在公共树中的子节点的指针。指向公共树中子节点的指针可在消费者请求时被懒惰地(按需)确定。如果公共树中的节点不具有指向其在公共树中的子节点的指针,则对于每一请求创建公共子节点且公共子节点不被保留或重复使用。因为数据结构对于一个或多个消费者看起来具有双向引用,而由于隐藏的私人树仍维护数据完整性。上述特性允许对数据结构的高效增量更新。假设消费者希望创建与原始树仅在单个节点上有区别的树的版本。消费者可创建包括新的公共树以及新的不可访问的私人树在内的数据结构,新的公共树表示已修改的语句,而新的不可访问的私人树可与先前私人树共享节点。为新的公共树所创建的根表示具有区别节点的树,且可与原始树的根共存而且最大地共享原始树中的现有节点。
新树可按需被创建,使得仅在消费者作出请求以访问或改变原始树所表示的语句 的情况下才产生新树的子节点。作为结果,所描述的数据结构提供了带有双向指针的不可变树结构,从而使得能够进行允许预更新和后更新树共存的高效非破坏性更新,所描述的数据结构并且准许在不同版本的私人树之间共享。带有增量改变的高效不可变句法表示图Id示出了根据此处所公开的主题的各方面的带有增量改变的高效不可变句法表示的系统100的示例。系统100的全部或某些部分可以驻留在诸如下面参考图3所描述的计算机之类的一台或多台计算机上。系统100的全部或某些部分可以驻留在诸如下面参考图4所描述的计算机之类的一台或多台软件开发计算机(例如,计算机102)上。系统100或其一些部分可以包括诸如下面参考图4所描述的和所示出的那些集成开发环境(例如,IDE 104)的一部分。替代地,系统100或其一些部分可以作为独立系统或作为插件或附加件来提供。系统100可包括以下各项中的一个或多个处理器(诸如处理器142)、存储器144、和用于带有增量改变的高效不可变句法表示的模块106。也可以包括本领域已知的其他组件,但此处未示出。能够理解,用于带有增量改变的高效不可变句法表示的模块106可以被加载到存储器144中以致使诸如处理器142之类的一个或多个处理器执行以归因于用于带有增量改变的高效不可变句法表示的模块106的动作。根据本文所公开的主题的各方面,用于带有增量改变的高效不可变句法表示的模块106可接收或生成诸如解析树108之类的只读树,并且可产生包括如下文更完整地描述的一个或多个数据结构110的输出。用于带有增量改变的高效不可变句法表示的模块106可包括以下各项中的一个或多个编译器,比如后台编译器、并行编译器或增量编译器;解析器,比如后台解析器、并行解析器或增量解析器;或者插件、预处理器、或附件;或者对IDE、解析器、编译器或预处理器的扩展。用于带有增量改变的高效不可变句法表示的模块106可拆卸文本或非文本信息,并且可从中建立表示信息块的树。用于带有增量改变的高效不可变句法表示的模块106可被附连至交互式设计时源代码编辑器、并入其内或与其相关联,并且可能能够解析任何编程语言,包括 C# (CSharp)、Visual Basic、C、C++、Java、Ruby、Perl、Python、Fortran、Cobol以及其他。在操作中,用于带有增量改变的高效不可变句法表示的模块106可生成或接收一个或多个树,包括但不限于诸如解析树、句法树、语义树、绑定树等编译器生成的树,且可从中生成如下文更完整地描述的数据结构。现在参考图le,给定只读第一树(如,私人树),例如表示语句“返回Math. PI*r~2”的树40,用于带有增量改变的高效不可变句法表示的模块106向消费者隐藏第一树、或使得第一树对消费者不可访问或不可用。用于带有增量改变的高效不可变句法表示的模块106可响应于接收包括对访问或修改树40中节点的请求的输入来隐藏私人树,或另选地,树可在来自消费者的请求被接收之前向消费者呈递为不可用。树40的不可用性在图Ie中通过所示围绕树40的框42来表示。根据本文所公开的主题的某些方面,通过创建诸如树43之类的控制对第一树的访问的第二只读树(例如,只读公共树),来向消费者授权对只读第一树的间接访问。第二树(树43)不能直接由消费者修改,然而,可在一个或多个新树的构建中使用第二树,其中新树表示以下信息作为对用于生成第二树的信息的修改。 为创建第二树(树43),根节点(根节点44)被创建,该根节点(根节点44)覆盖第一树(树40)的根节点46。第二树的根节点担当第一树的根节点周围的代理或外观,但维持其自己的身份。与第一树中的节点有关的任何信息可通过在第二树中创建节点来获取,其中所创建的第二树的节点覆盖第一树中对应的节点。为获取与第一树的特定节点有关的信息,对应节点在第二树中被创建,这些节点沿着至所请求的特定节点的路径覆盖第一树的对应节点。第二树从第一树获取信息,并将来自第一树的信息返回给消费者。除了创建第二树中的节点,从孩子到父亲的指针在第二树中也被创建。例如,假设树40中节点48的内容是期望的。再次参考图le,根节点,即覆盖根节点46的根节点44被创建。根节点44指向根节点46。根节点46的子指针被访问以寻找根节点46的子节点,即节点52。指向节点52的节点54在树43中被创建。节点54中的字段包括指向节点52的指针,即指针56。指向节点54的父节点(根节点44)的指针也被创建(例如,指针50)。对于只读第一树中沿着至期望节点的路径的所有节点都遵循这一过程。通常,当对树的操作正被执行时,只有一小部分的树被遍历。假设例如消费者正寻找树40中的特定节点。假设消费者正寻找树(如,树40)中特定位置处的节点。假设该特定位置处的节点是节点48,该节点的内容为“Math”。在这一示例中,针对在至内容为“Math”的节点的路径上的节点(即,节点62、节点64和节点66 )来创建节点。在树43中创建对应于节点62的节点68。在树43中创建对应于节点64的节点70。在树43中创建对应于节点66的节点72。不创建与第一树中任何其他节点对应的节点。根据本文所公开的主题的其他方面,对于第一树中其他路径,没有节点在第二树中被创建。根据本文所公开的主题的各方面,只读树潜在的任何部分可通过创建第二树中的节点来访问,但节点只在它们是沿着至期望节点的路径的情况下才被创建,因此给予树操作中的高效性同时维护可由多个消费者共享的只读树,而不牺牲数据完整性。另选地,两个分开的树在开始时被创建,且完整的处理成本在开始时被评估。根据本文所公开的主题的各方面,在消费者完成了使用第二树时,可由垃圾收集或内务管理进程将第二树从存储器中清除。不再由任何剩余第一或第二树节点引用的第一树的子树也可从存储器中被清除。
类似地,当代替检查只读树中的节点时,消费者希望修改只读树中的节点,新树被创建。上述过程是针对公共只读树来执行的,除了新树中对应节点不指向与只读树中节点对应的、消费者想要改变的节点的内容。同样,新树的节点的内容被设置成新值。即,新树的内容字段可被设置成与只读公共树中对应节点中对应域的值不同的值。例如,如果消费者想要将树43中节点58的内容从“Math”改变成“PI”,则节点58的指针不会被创建,且与节点58对应的新树的节点的内容会被设置成“PI”。可按需将附加节点添加至新树,如通常所知的。由于新树由单个消费者使用,因此新树中每一节点都可用于追踪消费者专用信息,诸如节点在特定文件或文档中的绝对位置。例如,给定包括文本的文档,该文档中的每一单词可存在于文本缓冲区内与该文档的版本相关联的特定位置。单词“Math”可以位于例如该文档的文本缓冲区中的位置20。在新树中与树43中节点58相对应的节点可包括绝对位置20,因为新树不可由另一消费者重复使用。相反,对于只读公共树(如,树43)中的节点,由于每一消费者的文本缓冲区很可能在不同位置处开始,因此只读公共树中的节点包含相对位置信息,诸如节点的宽度或节点中的字符数。新树可将至特定节点的路径中的各节点的宽度求和,并且将该总和添加到文本缓冲区的开始位置,以便确定节点在文档中的绝对位置。图2a是根据此处所公开的主题的各方面的用于带有增量改变的高效不可变句法表示的方法200的示例。根据此处所公开的主题的某些方面,在202处,获取、生成或接收只读私人树。可通过创建公共树的新根(其中公共树的新根覆盖私人树的根节点并控制对私人树的访问)来使得私人树对消费者不可访问。现在参考图2b,新的根节点(例如,新节点276)可包括以下字段中的一个或多个指向私人树的根节点的指针270、以及指向子节点的一个或多个指针,如图2b中指向子字段(child field)的指针272、274等所示。在204处,接收来自消费者对访问或修改树中节点的请求。响应于此,向消费者提供对表示公共树的根节点的访问,该公共树控制对私人树的访问。在206处,响应于接收到该请求,公共树中的附加节点可通过跟随私人树中的指针以便从私人树中的路径遍历至所需节点来创建。只要到达私人树中的下一节点,就在公共树中创建对应节点。在208处,生成公共树中的指针。例如,从所创建的或所生成的节点创建指针,该指针指向所生成的节点的父节点。非根节点结构的示例在图2c中示出。第二树中的节点290可包括指向私人树的对应节点的指针的字段278、存储内容的一个或多个字段(字段280、282等)、从节点290指向其在公共树中的父节点的指针284、以及指向公共树中节点290的子节点的一个或多个指针(字段286、288等)。针对私人树中的路径中的每一节点,在公共树中创建各节点,直到达到私人树中的所需节点。如果消费者请求是访问请求,则当消费者完成公共树时,它使用的空间可在210处由垃圾收集回收。消费者可请求对公共树进行改变。在212处,这样的请求导致要产生新的公共树并且导致要产生新的消费者不可访问的私人树。新的不可访问的树可与先前的私人树共享节点。即,如果消费者请求是创建包括对现有树的修改的新树,则该新树可重复使用原始私人树的子树。如果消费者创建了这样的树,则新创建的树不可被共享。消费者主动地从旧的子树与新片段的结合中创建新树,从而将新树中对应节点的内容设置成新值。对于被添加到在只读公共树中不存在对应节点的新树的子树,可按需将附加节点添加、到新树。在这一情况下,指向只读树的对应节点的指针(字段278)被设置成空。另选地,第二非根节点类型可能不具有指向只读树字段278的对应节点的指针的字段,如图2d的节点292所示。如果消费者想要修改新树,则包含指向新树的根节点的只读根节点的另一树可被创建。另选地,在例如消费者请求访问或修改新树中的节点的情况下,可构建整个新树的只读副本、版本或快照。只读树的根节点可被覆盖,从而使得通过创建指向第三树的根节点的指针的第四可修改树,依次类推。合适计算环境的示例为了提供有关本文所公开的主题的各个方面的上下文,图3以及以下讨论旨在提供其中可以实现各实施例的合适计算环境510的简要概括描述。尽管本文所公开的主题是在诸如程序模块等由一个或多个计算机或其它计算设备执行的计算机可执行指令的通用上下文中描述的,但本领域技术人员将认识到,本文所公开的主题的各部分还能够结合其它程序模块和/或硬件和软件的组合来实现。通常,程序模块包括执行特定任务或实现特定数据类型的例程、程序、对象、物理人为产物、数据结构等。通常,程序模块的功能可在各 个实施例中按需进行组合或分布。计算环境510只是合适的操作环境的一个示例,并且不旨在对此处所公开的主题的使用范围或功能提出任何限制。参考图3,描述了计算机512形式的用于软件开发计算设备。计算机512可包括处理单元514、系统存储器516和系统总线518。处理单元514可以是各种可用处理器中的任何一种。也可以使用双微处理器及其他多处理器体系结构作为处理单元514。系统存储器516可包括易失性存储器520和非易失性存储器522。非易失性存储器522可包括只读存储器(ROM)、可编程ROM (PR0M)、电可编程ROM (EPROM)或闪存。易失性存储器520可包括可充当外高速缓冲存储器的随机存取存储器(RAM)。系统总线518将包括系统存储器516的系统物理人为产物耦合到处理单元514。系统总线518可以是几种类型的总线结构中的任何一种,包括存储器总线、存储控制器、外围总线、外总线或局部总线,并且可以使用各种可用总线体系结构中的任一种。计算机512通常包括各种计算机可读介质,诸如易失性和非易失性介质、可移动和不可移动介质。计算机存储介质可以通过用于存储诸如计算机可读指令、数据结构、程序模块或其它数据等信息的任何方法或技术来实现。计算机存储介质包括但不限于,RAM、ROM、EEPR0M、闪存或其它存储器技术、⑶ROM、数字多功能盘(DVD)或其它光盘存储、磁盒、磁带、磁盘存储或其它磁存储设备、或可以用来储存所期望的信息并可由计算机512访问的任何其他非瞬态介质。将理解,图3描述了可充当用户与计算机资源之间的媒介的软件。该软件可以包括可存储在盘存储524上的操作系统528,该操作系统可控制并分配计算机系统512的资源。盘存储524可以是通过诸如接口 526的不可移动存储器接口连接到系统总线518的硬盘驱动器。系统应用程序530利用由操作系统528通过存储在系统存储器516或者存储在盘存储524上的程序模块532和程序数据534对资源的管理。可以理解,计算机可用各种操作系统或操作系统的组合来实现。用户可通过输入设备536向计算机512输入命令或信息。输入设备536包括但不限于定点设备,诸如鼠标、跟踪球、指示笔、触摸垫、键盘、话筒等。这些及其他输入设备通过系统总线518经由接口端口 538连接到处理单元514。接口端口 538可表示串行端口、并行端口、通用串行总线(USB)等。输出设备540可与输入设备使用相同类型的端口。提供输出适配器542以举例说明存在像监视器、扬声器、以及打印机的需要特定适配器的一些输出设备540。输出适配器542包括但不限于,在输出设备540和系统总线518之间提供连接的视频卡和声卡。其他设备和/或设备系统,诸如远程计算机544,可提供输入和输出两种能力。计算机512可以使用到诸如远程计算机544之类的一个或多个远程计算机的逻辑连接来在联网环境中操作。远程计算机544可以是个人计算机、服务器、路由器、网络PC、对等设备或其它常见的网络节点,并且通常包括许多或所有以上相对于计算机512所描述的元件,尽管在图4中仅示出了存储器存储设备546。远程计算机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 (例如,机器可执行指令)。即,当IL应用被执行时,其在被执行的同时被编译成适合正在其上执行它的平台的合适机器语言,藉此使代码能跨若干平台便携。替代地,在其他实施例中,程序可被编译成适合其目标平台的本机代码机器语言(未示出)。用户可根据已知软件编程技术以及与特定源语言相关联的特定逻辑和句法规则经由IDE 600中的用户接口 640和源代码编辑器651来创建和/或编辑源代码组件。此后,源代码组件610可经由源编译器620被编译,藉此可创建该程序的中间语言表示,诸如汇编630。汇编630可包括中间语言组件650和元数据642。应用设计可以能够在部署前被验证。本文所述的各种技术可结合硬件或软件,或在适当时以其组合来实现。由此,本文所公开的方法和装置或其特定方面或部分可采取包含在诸如软盘、CD-ROM、硬盘驱动器或任何其它机器可读存储介质等有形介质中的程序代码(即,指令)的形式,其中当程序代码被加载到诸如计算机等机器内并由其执行时,该机器成为用于实现本文所公开的主题的各方面的装置。在程序代码在可编程计算机上执行的情况下,计算设备通常将包括处理器、该处理器可读的存储介质(包括易失性和非易失性的存储器和/或存储元件)、至少一个输入设备、以及至少一个输出设备。可例如通过使用数据处理API等来利用域专用编程模型各方面的创建和/或实现的一个或多个程序可用高级过程编程语言或面向对象的编程语言 来实现以与计算机系统通信。然而,如果需要,该程序可以用汇编语言或机器语言来实现。在任何情形中,语言可以是编译语言或解释语言,且与硬件实现相结合。虽然已结合附图描述了本文所公开的主题,但是应理解,可作出修改以按不同方式执行相同功能。
权利要求
1.一种系统,包括 处理器和存储器,所述存储器包括一模块,其被配置成使所述处理器执行 创建至少ー个消费者可访问的数据结构,所述数据结构表示树,其中所述数据结构包括 可重复使用的第一树,该第一树表示所述至少一个消费者不可直接访问的共享的只读树的,其中所述只读树中的节点具有单向指针,使得第一树的所述节点不具有指向父节点的指针;以及 所述至少一个消费者可访问的第二树,该第二树包括控制所述至少ー个消费者对第一树的访问的至少ー个根节点,其中第二树的根节点包括指向第一树的根节点的指针。
2.如权利要求I所述的系统,其特征在于,第二树是通过为第一树中位于至第一树中所请求的节点的路径上的每ー节点在第二树中生成节点而按需构建的,其中所生成的节点与第一树中位于至所请求的节点的路径上的下ー节点相对应,所生成的节点包括指向第一树的对应节点的指针、以及指向在第二树中所生成的节点的父节点的指针。
3.如权利要求I所述的系统,其特征在于,第一树是保留相对信息的私人树,而第ニ树是保留消费者专用信息的公共树。
4.如权利要求I所述的系统,其特征在于,所述树是包括解析树、句法树、语义树或绑定树在内的编译器生成的树。
5.如权利要求3所述的系统,其特征在干,响应于接收来自所述至少一个消费者的对经修改的树的请求,新的公共树被产生且新的私人树被产生,其中所述新的私人树重复使用第一树的至少ー个子树。
6.ー种方法,包括 在软件开发计算机的IDE中,生成消费者可访问的数据结构,所述数据结构表示 第一只读私人单向指向树,其中第一树中的至少ー个节点包括至少ー个单向指针,所述至少ー个单向指针包括从第一树的父节点指向第一树的子节点的指针;以及 第二消费者可访问树,其中第二树的节点包括双向指针,所述双向指针包括从第ニ树的所述节点指向其在第二树中的子节点(208)的指针、以及从第二树中所述节点指向其在第二树中的父节点的指针,且其中第二树的所述节点包括从第二树中所述节点指向第一树中对应节点的指针,其中第二树的各节点是响应于来自消费者的对访问第一树中的节点的请求来按需创建的,且其中第二树控制对第一树的访问。
7.如权利要求6所述的方法,其特征在于,还包括 响应于接收对表示经修改的第一树的树的请求,创建新的公共树和新的私人树,其中所述新的私人树表示与所述第一私人树在至少ー个节点有区别的树,且其中所述新的公共树表示与第二消费者可访问树在至少ー个节点有区别的树,其中所述第一树的至少ー个子树在所述新的私人树中被重复使用。
8.如权利要求6所述的方法,其特征在于,还包括 在所述消费者已完成使用第二树时,对第二树进行垃圾收集。
9.如权利要求6所述的方法,其特征在干, 其中,第一树和第二树包括句法树、语义树、解析树或绑定树。
10.如权利要求6所述的方法,其特征在干,还包括其中,第一树是私人树而第二树是公共树。
11.ー种包括当执行时使至少ー个处理器执行下列操作的计算机可执行指令的计算机可读存储介质 创建表示树的数据结构,其中所述数据结构包括 消费者不可访问的第一只读、可重复使用的树,该第一树具有单向指针,使得第一树中的父节点包括指向所述父节点的子节点的指针,且所述父节点不包括指向第一树中所述父节点的父节点的指针;以及 所述消费者可访问的、不可重复使用的第二树,该第二树具有双向指针,使得第二树中的父节点包括指向所述父节点的子节点的指针,且所述父节点包括指向第二树中所述父节点的父节点的指针,其中第二树控制所述消费者对第一树的访问。
12.如权利要求11所述的计算机可读存储介质,其特征在干,进ー步包括当执行时使所述至少一个处理器执行下列操作的计算机可执行指令 创建所述数据结构,其中第二树是响应于所述消费者对访问第一树中节点的请求来按需创建的。
13.如权利要求11所述的计算机可读存储介质,其特征在干,进ー步包括当执行时使所述至少一个处理器执行下列操作的计算机可执行指令 创建所述数据结构,其中第一树包括相对内容而第ニ树包括消费者专用内容。
14.如权利要求12所述的计算机可读存储介质,其特征在干,进ー步包括当执行时使所述至少一个处理器执行下列操作的计算机可执行指令 通过为第一树中位于至所请求的节点的路径上的每ー节点在第二树中生成节点而按需生成第二树,其中该所生成的节点与第一树中位于至所请求的节点的路径上的下ー节点相对应,第二树中该所生成节点包括指向第一树的对应节点的指针。
15.如权利要求11所述的计算机可读存储介质,其特征在干,进ー步包括当执行时使所述至少一个处理器执行下列操作的计算机可执行指令 响应于接收来自所述消费者对访问第二树中节点的请求,创建第三树,该第三树包括第二树的只读、可重复使用版本,该第三树具有从第三树中父节点指向第三树中所述父节点的子节点的单向指针,并且该第三树创建控制所述消费者对该第三树的访问的第四树,其中该第四树包括所述消费者可访问的不可重复使用的树,该第四树具有双向指针,所述双向指针包括从该第四树中父节点指向该第四树中所述父节点的子节点的指针、以及从该第四树中子节点指向该第四树中孩子的父节点的指针、以及从第四树中各节点指向该第三树中对应节点的指针。
全文摘要
通过创建数据结构来启用在增量改变下带有父指针的高效不可变句法表示,该数据结构包括至少一个允许在树中进行向上和向下引用两者的树结构、以及不可变的(只读)且允许其自身的部分在其他数据结构中被重复使用的树结构。所描述的数据结构使得工具能够搜索并将特定的子树定位目标。该树的表示被定为目标的子树的片段在使用时被产生。树的其余部分不被产生。只读树保留相对信息,从而使其可被重新组装和共享。
文档编号G06F17/00GK102696026SQ201080060863
公开日2012年9月26日 申请日期2010年12月31日 优先权日2010年1月7日
发明者A·V·青高兹, A·Y·阿哈罗尼, D·N·舒艾奇, J·帕森斯, K·皮尔希-比森, M·J·沃伦, M·托格森, N·M·加夫特, P·戈尔德, R·帕凯, 刘凯玲 申请人:微软公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1