从代码使用中创建所推断的符号的制作方法

文档序号:6351777阅读:166来源:国知局
专利名称:从代码使用中创建所推断的符号的制作方法
从代码使用中创建所推断的符号背景动态编程语言在运行时执行其他(动态编程)语言如果执行的话通常在编译期间执行的行为。在运行时由动态语言执行的行为包括通过在程序执行期间添加新代码、创建对象和定义、修改类型系统等等来对程序进行扩展。动态编程语言通常是动态地类型化的,这意味着,类型检查是在运行时执行的。在动态类型化时,类型与从程序的执行中得到的值相关联。动态类型化语言包括Clojure、Groovy> JavaScript、Lisp、Objective-C、PHP> Prolog、Python> Ruby、Smalltalk、VisualBasic中的后期绑定、IronPython和IronRuby。动态类型化没有静态类型化那么严格,但可以导致较大可能性的执行错误(例如由于变量的值具有不允许的类型而引起的出错结果)。动态类型化的语言系统通常使得对源代码的编译时检查较少。运行时检查可能是更复杂的,因为除了在编译期间存在过并且在运行时仍可用的信息之外,它们还可以使用动态(运 行时)信息。运行时检查断言条件在程序的特定执行中成立并且对程序的每次执行重复。绑定选择在源代码中时应用句法操作时使用哪个实际操作。绑定可以要么发生在编译时(在该情况下被称为“静态绑定”)、要么动态地发生在运行时(这被称为“动态绑定”)。动态绑定推迟对未定义的变量的解析直到程序运行。动态绑定与静态绑定是不同的,因为其结果——例如被分配给操作的含义——取决于其所操作的实际值的运行时类型,而不是源代码中的变量的编译时类型。通常,静态类型化的编程语言执行静态绑定,而动态类型化的编程语言执行动态绑定。然而,当静态语言包含动态绑定(比如具有动态语言特性的C#4. 0)或者相反时,可能具有二者的混合。测试驱动的开发是指一种迭代软件开发技术,其中开发者首先编写确认所期望的改进或新功能的测试情况,然后开发者产生致使测试通过的代码,然后是重构代码库以考虑到任何新的系统要求。例如,包括操纵对象的逻辑的代码可以在编写定义所述对象的代码以前编写。换言之消费(消费性)代码是在编写被消费对象以前编写的。概述动态编程技术和测试驱动的开发具有至少一个相互挑战。在两种情况下,由于底层被消费代码还未被创建,因此依靠可用底层代码的工具不能例如通过在用户将代码键入到源代码编辑器中时为了自动完成而显示可能的选择来辅助开发过程。根据在此公开的主题的各方面,基于符号在整个代码内的使用(或可能的使用)来创建诸如包括所推断的节点的句法树或语义树和/或包括所推断的符号的符号表之类的数据结构。所推断的节点和/或所推断的符号可以通过学习算法来生成。工具可以使用这样创建的句法树等等来提供关于还未被创建或还未被绑定的符号的信息以供用在动态编程和测试驱动的开发中。表示源代码的数据结构可以由后台编译器在交互式程序开发期间生成。可以基于输入到源代码编辑器中的源代码将一个或多个符号添加到数据结构,其中所述符号是在没有所述符号的在先定义的情况下基于所述符号的使用从源代码中推断出的。可以基于将一组规则应用到未定义的符号来创建所推断的符号。响应于从用户接收到这样做的指示,可以将所推断的符号转换成实符号。所推断的符号到实符号的转换可以由开发者的动作触发以基于所推断的符号自动生成源代码。自动添加的源代码将包括未定义的符号的定义。与所推断的符号相关联的信息可以响应于编程环境中的进入“建议模式”的选项的激活而显示在软件开发工具中。提供本概述以便以简化的形式介绍将在以下详细描述中进一步描述的一些概念。本概述并不旨在标识所要求保护的主题的关键特征或必要特征,也不旨在用于限制所要求保护的主题的范围。附图
简述在附图中图Ia示出了根据在此公开的主题的各方面的用于从代码使用中创建所推断的符号的系统100的不例;图Ib示出了现有技术中已知的树10的示例; 图Ic示出了根据此处所公开的主题的各方面的树12的示例;图2是根据此处所公开的主题的各方面的用于从代码使用中创建所推断的符号的方法200的示例的流程图;图3是示出了其中可以实现此处所公开的主题的各方面的计算环境的示例的框图;以及图4是根据此处所公开的主题的各方面的集成开发环境的示例的框图。详细描述概览测试驱动的开发实践的流行度日益增加。编程语言中的动态语言影响变得更加突出。因此,可能有利的是,当代码模型还不存在或者还未已知但是仍然被消费时,软件开发工具能够提供关于可能的代码的信息。在此所述的主题使得为首先消费(consume-first)编程风格创建在符号存在或符号被绑定以前提供相关信息的工具成为可能。在此公开的主题尤其是适用于编写具有首先消费或首先测试(test-first)开发风格的代码、以及编写动态(后期绑定)代码,但是能够理解,所公开的主题适用于任何风格的计算机程序开发。在编写代码时,可以创建表示源代码、基于源代码或者与源代码相关联的句法树、语义树或符号表。对于在全局符号表中还未绑定或定义的符号,可以创建可能的或“所推断的”节点或符号并可将其添加到由编译器创建的句法树、语义树或符号表。符号类型的多个候选对于所推断的符号而言可能都是可能的(例如该符号可以表示类或者可以表示结构体,该符号可以表示方法或者可以表示属性)。所有候选都可以在树/表中被表示成可能的符号,或者可替代地,可以提供服务或软件模块来检索候选组。随着用户继续编写代码,代码模型可以基于学习模型(例如使用现有技术中已知的机器学习技术)被更新以表示附加的信息。例如,如果关于特定的所推断的符号表示什么存在不清楚,则随着开发者继续编写代码,该不清楚可以解决或者在选择集合中的特定选择可以变为更加可能。在这种情况下,句法树、语义树或符号表中的所推断的符号可以被更新以表示当前的知识状态。所推断的符号可以由包括、但不限于下列各项的软件开发工具来使用完成列表、调用分层结构、引用列表(reference list)、对象浏览器、类视图、寻找引用、导航工具等等以为还未创建或还未绑定的符号提供开发者工具。根据所公开主题的一些方面,可以通过诸如颜色、突出显示之类的区别、通过伴随特定图标等等来在视觉上区分所推断的符号。所推断的符号可以通过激活特定的模式(例如通过激活“建议模式”选项)而被包括在传统集成开发环境内或者在该环境内变为可见。基于所推断的符号,由编译器发现的错误条件可以触发附加源代码的自动生成以校正该错误条件。所推断的符号可以例如通过激活“使其成真(make it real)”或“从使用生成(generate from usage)”选项被转换成实际符号。例如,所推断的节点可以通过激活这样的选项被转换成句法树或语义树中的具体节点。类似地,符号表中的所推断的符号可以通过为符号表激活这样的选项被转换成具体符号。从代码使用中创建所推断的符号图Ia示出了根据在此公开的主题的各方面的用于从代码使用中创建所推断的符号的系统100的示例。系统100的全部或某些部分可以驻留在诸如下面参考图3所描述的计算机之类的一台或多台计算机上。系统100的全部或某些部分可以驻留在诸如下面参考图4所描述的计算机之类的一台或多台软件开发计算机(例如,计算机102)上。系统100或其一些部分可以包括诸如下面参考图4所描述的和所示出的那些集成开发环境(例如,IDE 104)的一部分。替代地,系统100或其一些部分可以作为独立系统或作为插件或加入件来提供。系统100可以包括以下中的一个或多个处理器(比如处理器142)、诸如存储器144之类的存储器、以及用于从代码使用中创建所推断的符号的模块106。也可以包括本领域已知的其他组件,但此处未示出。能够理解,用于从代码使用中创建所推断的符号的模块可以被加载到存储器144中以致使诸如处理器142之类的一个或多个处理器执行以归因于用于从代码使用中创建所推断的符号的模块106的动作。由后台编译器基于所输入的源代码创建或生成的数据结构可以被用于从代码使用中创建所推断的符号的模块106修改为包括由用于从代码使用中创建所推断的符号的模块106创建的所推断的符号。所推断的符号可以表示被消费代码,其中当被消费代码未存在于源代码中时,消费代码存在于该源代码中。根据在此公开主题的各方面,用于从代码使用中创建所推断的符号的模块106可以基于输入到编辑器110中的消费代码创建一个或多个所推断的符号108。编辑器110可以表示与后台编译器116相关联的源代码编辑器,其中后台编译器116在用户输入源代码时生成实符号的句法树、语义树或符号表。根据在此公开主题的各方面,用于从代码使用中创建所推断的符号的模块106可以基于输入到编辑器110中的代码向由编译器116所创建的实符号的句法树、语义树或符号表添加或修改一个或多个所推断的符号108。此外,用于从代码使用中创建所推断的符号的模块106可以基于所推断的符号生成源代码,如将在下面予以更充分描述。对实符号114进行操作的工具112可以被设置为附加地或替代地对所推断的符号108进行操作。用于从代码使用中创建所推断的符号的模块106可以包括或并入下列各项中的一个或多个编译器,比如后台编译器、并行编译器或增量编译器;解析器,比如后台解析器、并行解析器或增量解析器;或者插件、预处理器、或附件;或者对IDE、解析器、编译器或预处理器的扩展。用于从代码使用中创建所推断的符号的模块106可以与下列各项分开或相关联编译器,比如后台编译器、并行编译器或增量编译器;解析器,比如后台解析器、并行解析器或增量解析器;或者插件、预处理器、或附件;或者对IDE、解析器、编译器或预处理器的扩展。用于从代码使用中创建所推断的符号的模块106可以与程序开发工具相关联、并入程序开发工具或者与程序开发工具分开,所述程序开发工具包括、但不限于完成列表、调用分层结构、引用列表、对象浏览器、类视图、寻找引用和/或导航工具。用于从代码使用中创建所推断的符号的模块106可以将一个或多个所推断的符号转换成符号表、句法树或语义树中的实符号。编辑器110可以是后台编译器所支持的源代码编辑器,其中后台编译器在开发者
或用户编写源代码时生成语义和/或句法树。例如,假定用户编写下列内容
权利要求
1.一种系统,包括 处理器和存储器,所述存储器包括被配置为致使所述处理器执行下列动作的模块 在程序开发期间创建数据结构,所述数据结构包括由所述模块生成的至少ー个所推断的符号,其中所述至少ー个所推断的符号是基于存在于输入到源代码编辑器中的源代码中的消费代码而创建的,所述至少ー个所推断的符号表示被所述消费代码消费的代码,其中被消费代码未存在于所述源代码中。
2.如权利要求I所述的系统,其特征在于,所述至少ー个所推断的符号是在测试驱动的开发环境中或者在动态编程环境中基于将ー组规则应用到未定义的符号而创建的。
3.如权利要求I所述的系统,其特征在于,所述至少ー个所推断的符号被转换成所述数据结构中的实际符号。
4.如权利要求I所述的系统,其特征在干,将所述至少ー个所推断的符号转换成实符号触发了自动的、编译器生成的对定义所述至少ー个所推断的符号的源代码的添加,其中定义所述至少ー个所推断的符号的源代码在所述源代码编辑器中被添加到所述源代码。
5.如权利要求I所述的系统,其特征在于,所述编程环境中的软件开发工具在程序开发期间响应于显示与所述至少ー个所推断的符号相关联的信息的选项的用户选择而显示与所述至少ー个所推断的符号相关联的开发者帮助信息。
6.ー种方法,包括 创建表示源代码的实符号的数据结构,所述数据结构由后台编译器在交互式程序开发期间生成,其中在软件开发计算机上执行的模块将至少ー个所推断的符号添加到所述数据结构,其中所述至少ー个所推断的符号基于输入到源代码编辑器中的源代码,其中所述至少ー个所推断的符号是基于未定义的符号在所述源代码中的使用从所述源代码中推断的。
7.如权利要求6所述的方法,其特征在于,所述数据结构是句法树、语义树或符号表。
8.如权利要求6所述的方法,其特征在于,还包括 响应于编程环境中的选项的激活,在所述编程环境中的软件开发工具中显示与所述至少ー个所推断的符号相关联的信息,其中所述编程环境包括测试驱动的开发环境或者动态编程开发环境。
9.如权利要求6所述的方法,其特征在干, 编译器生成的代码被添加到定义所述未定义的符号的源代码中。
10.如权利要求6所述的方法,其特征在于,还包括 响应于从用户接收到将所述至少ー个所推断的符号转换成实符号的指示,将所述至少ー个所推断的符号转换成实符号。
11.ー种包括当执行时使至少ー个处理器执行下列操作的计算机可执行指令的计算机可读存储介质 创建表示源代码的数据结构,所述数据结构由后台编译器生成,其中至少ー个所推断的符号基于输入到源代码编辑器中的源代码被添加到所述数据结构,其中所述至少ー个所推断的符号是在没有所述符号的在先定义的情况下基于符号的使用从所述源代码中推断的。
12.如权利要求11所述的计算机可读存储介质,其特征在干,进ー步包括当执行时使所述至少一个处理器执行下列操作的计算机可执行指令响应于从用户接收到将所述至少ー个所推断的符号转换成实符号的指示,将所述至少ー个所推断的符号转换成实符号。
13.如权利要求11所述的计算机可读存储介质,其特征在干,进ー步包括当执行时使所述至少一个处理器执行下列操作的计算机可执行指令 基于所述至少ー个所推断的符号将定义所述至少ー个所推断的符号的、编译器生成的代码自动添加到所述源代码。
14.如权利要求11所述的计算机可读存储介质,其特征在干,进ー步包括当执行时使所述至少一个处理器执行下列操作的计算机可执行指令 响应于编程环境中的选项的激活,在软件开发工具中显示与所述至少ー个所推断的符号相关联的信息。
15.如权利要求11所述的计算机可读存储介质,其特征在干,进ー步包括当执行时使所述至少一个处理器执行下列操作的计算机可执行指令 创建包括语义或句法树的数据结构,所述语义或句法树包括至少ー个所推断的节点;或者创建包括符号表的数据结构,所述符号表包括至少ー个所推断的符号。
全文摘要
在编写代码时,基于未定义的符号的使用创建包括所推断的符号的数据结构。随着用户继续编写代码,可以基于学习模型更新代码模型以表示经更新的信息。包括所推断的符号的数据结构可以被软件开发工具用于为还未创建或还未绑定的符号提供开发者帮助。可以视觉上区分所推断的符号,从而使所推断的符号信息的外观不同于实际符号信息。基于所推断的符号的信息的外观可以通过激活编程环境中的特定模式而包括在工具内。将所推断的符号转换成实符号可以触发后台编译器进行的附加源代码的自动编译器生成。所推断的符号可以通过激活使所推断的符号成为实符号的选项被转换成实际符号。
文档编号G06F9/30GK102696012SQ201080060704
公开日2012年9月26日 申请日期2010年12月31日 优先权日2010年1月6日
发明者K·皮尔希-比森, 刘凯玲 申请人:微软公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1