软件开发工具的制作方法

文档序号:6423702阅读:172来源:国知局
专利名称:软件开发工具的制作方法
技术领域
本申请涉及软件开发工具和方法。
背景技术
集成开发环境(IDE)是帮助程序员开发软件的一组工具。IDE可包括源代码编辑器、编译器和调试器。它可包括允许程序员查看类层次结构信息、关于类、方法或其他程序元素的信息的浏览器。IDE或其他编程环境可包括自动完成特征来在程序员输入文本时帮助程序员。使用自动完成特征,用户可键入已被定义成属于一特定类的对象的名称,后跟一句点。自动完成工具可识别对象的类并提供包括字段、属性和方法的类成员列表。用户可从该列表进行选择,而不是键入所希望的类成员的名称。该工具然后将所选的成员名称插入源代码。如果用户在作出选择之前键入了一个或多个字符,则自动完成工具可过滤该列表使其限于匹配文本。在键入了一个或多个字符之后,用户可从列表选择一项目。

发明内容
提供本发明内容以便以简化形式介绍将在以下的具体实施方式
中进一步描述的一些概念。本发明内容并不旨在标识出所要求保护的主题的关键特征或必要特征,也不旨在用于限定所要求保护的主题的范围。简而言之,一种系统、方法和各组件用于生成与还未被静态地声明具有类型的程序变量对应的完成列表。变量的类型可在目标程序的执行期间被解析。在一个实施方式中, 运行时监控程序在目标程序代码的执行期间跟踪事件,以确定程序变量的类型解析。对于每个运行时类型解析,可确定并聚集与该类型相关联的一组类成员以形成完成列表。在一个实施方式中,在编辑会话中时,列表调用事件使得列表生成器执行对目标程序的至少一些部分的控制流分析。可找到对所述变量的一个或多个赋值。每个表达式可被分析以确定变量的候选类型集。与每个候选类型相关联的、或可从该候选类型的对象获得的类成员被检索并插入到完成列表中。在一个实施方式中,对变量的使用可被分析来确定一个或多个候选类型。这可基于调用变量对象的成员的指令、将变量用作对其中相应参数具有声明的类型的方法的自变量、将变量对象用作表达式中的操作数、以及对变量的其他使用。在一个实施方式中,控制流分析可导致汇编件(assembly)。编译时汇编件可被分析来检索候选类型或相应成员。在编辑会话中时,运行时汇编件可被加载,并且指定的类型可被实例化。可使用反射(Reflection)来确定相应成员的列表。在一个实施方式中,完成列表的项目可基于运行时类型解析或静态分析来排序。 完成列表可被过滤以呈现具有配置的准则的完成列表,或呈现完成列表项目的各组。为了实现前述及相关目的,在这里结合以下描述及附图来描述该系统的某些说明性方面。然而,这些方面仅指示了可采用本发明的原理的各种方法中的少数几种,且本发明旨在包括所有这样的方面及其等效方面。通过结合附图考虑本发明的以下详细描述,本发明的其它优点以及新颖的特征将变得显而易见。


参考以下附图来描述本发明的非限制性且非穷尽性实施方式。在各附图中,除非另外指明,否则在全部附图中相同的附图标记指代相同的部分。为了帮助理解本发明,将参考以下与附图相关联地阅读的具体实施方式
,附图中图1是其中可实现此处所描述的机制的计算机系统的框图;图2示出其中可采用此处所描述的某些机制的示例编辑会话的屏幕截图;图3示出其中可采用此处所描述的某些机制的另一示例编辑会话的屏幕截图;图4示出其中可采用此处所描述的某些机制的另一示例编辑会话的屏幕截图;图5A示出其中可采用此处所描述的某些机制的另一示例编辑会话的屏幕截图;图5B示出其中可采用此处所描述的某些机制的另一示例编辑会话的屏幕截图;图6示出其中可采用此处所描述的某些机制的另一示例编辑会话的屏幕截图;图7A-C示出其中可采用此处所描述的某些机制的示例编辑会话的附加屏幕截图;图8是示出向用户提供完成列表的过程的示例实施方式的流程图;图9是示出确定程序变量的一个或多个候选类型的过程的示例实施方式的流程图;图10是示出确定程序变量的候选类型的过程的示例实施方式的流程图;图11是示出基于动态分析确定程序变量的候选类型的过程的示例实施方式的流程图;图12示出了计算设备的一个实施方式,示出可用于执行此处所描述的功能的计算设备的所选组件。
具体实施例方式下文中将参考附图来更全面地描述本发明的各示例实施方式,附图构成实施方式的一部分且在其中作为示例示出了可在其中实践本发明的各特定示例实施方式。然而,本发明可被实现为许多不同的形式并且不应被解释为被限于此处描述的各实施方式;相反, 提供这些实施方式以使得本公开变得透彻和完整,并且将本发明的范围完全传达给本领域技术人员。特别地,本发明可被实现为方法或设备。因此,本发明可采用完全硬件实施方式、 完全软件实施方式或者结合软件和硬件方面实施方式的形式。因此,以下详细描述并非是局限性的。贯穿说明书和权利要求书,下列术语采用此处显式相关联的含义,除非该上下文在其他地方另有清楚指示。如此处所使用的,短语“在一个实施方式中”尽管它可以但不一定指前一实施方式。此外,如此处所使用的,短语“在另一个实施方式中”尽管它可以但不一定指一不同的实施方式。因此,可以容易地组合本发明的各实施方式而不背离本发明的范围或精神。类似地,如此处所使用的,短语“在一个实现中”尽管它可以但不一定指相同
5的实现,并且可以组合各种实现的技术。另外,如此处所使用的,术语“或”是包括性“或”运算符,并且等价于术语“和/ 或”,除非上下文清楚地另外指明。术语“基于”并非穷尽性的并且允许基于未描述的其他因素,除非上下文清楚地另外指明。另外,在本说明书全文中,“一”、“一种”和“所述”的含义包括复数引用。“在中”的含义包括“在中”和“在上”。如此处所使用的,当涉及计算机程序时,术语“赋值”指的是指定在程序的执行期间要被赋予或绑定于指定的变量的值的构造。这可采用单个赋值语句的形式,例如“X = new classX ()”,它指定了表达式“new classX () ”要被求值,结果被赋予变量χ。它也可采用方法参数声明和对应的方法调用的形式。例如,在以下程序代码中void methodA(classY foo);method A (bar);该构造指定了对methodA的调用将自变量bar所代表的对象赋予参数foo。如此处所使用的,术语“编辑会话”指的是这样一种环境,其中编辑器、查看器或浏览器正在向用户显示程序源代码的至少一部分。编辑会话可包括但并不一定要包括修改程序源代码的动作。尽管编辑会话可与目标程序的执行交织在一起,或可与目标程序的执行或运行时同时发生,但是编辑会话与程序运行时不同且可在对应于目标程序的可执行程序不存在时发生。对编辑会话中发生的动作的引用涉及不采用运行时数据结构的动作。此处所描述的组件可以从其上具有数据结构的各种计算机可读介质来执行。组件可通过本地或远程过程诸如按照具有一或多个数据分组(例如,来自一个通过信号与本地系统、分布式系统中的另一组件交互或跨诸如因特网的网络与其它系统交互的组件的数据)的信号来通信。例如,根据本发明的各实施方式,软件组件可被存储在非瞬态计算机可读存储介质上,包括但不限于专用集成电路(ASIC)、紧致盘(⑶)、数字多功能盘 (DVD)、随机存取存储器(RAM)、只读存储器(ROM)、软盘、硬盘、电可擦除可编程只读存储器 (EEPROM)、闪存或记忆棒。如此处所用的术语“计算机可读介质”既包括非瞬态存储介质又包括通信介质。通信介质通常以诸如载波或其它传输机制等“已调制数据信号”来体现计算机可读指令、数据结构、程序模块或其他数据,并包括任何信息传递介质。作为示例而非限制,通信介质包括有线介质,如有线网络或直接线连接,以及诸如声学、无线电、红外线及其他无线介质之类的无线介质。如此处所使用的,术语“应用,,指计算机程序或其一部分,并且可包括相关联的数据。应用可以是独立程序,或者应用可被设计成向另一应用提供一个或多个特征。“附加件” 和“插件”是与“宿主”应用交互并向其提供特征的应用的示例。应用由应用组件的任何组合构成,应用组件可包括程序指令、数据、文本、对象代码、图像或其他媒体、安全证书、脚本、或者可被安装在计算设备上以使该设备能够执行所需功能的其他软件组件。应用组件能够以文件、库、页、二进制块或数据流的形式存在。如此处所使用的,除非上下文另外指明,否则术语“功能”指执行特定任务的较大程序中的一部分代码,并且能够相对独立于该程序的其他部分执行。功能可以但不一定返回值。在各种计算机语言中,可使用不同的术语,诸如子例程、方法、过程或子程序。如此处所使用的,术语“功能”可以包括所有这些。
如此处所使用的,术语“静态类型化”(static typing)指的是这样一种编程构造, 其中变量类型在编译时可用。静态类型声明是在程序运行时之前对变量类型的显式声明。 "int foo; ”是静态类型声明的示例。术语“动态类型化”指的是这样一种编程构造,其中变量的类型在运行时被解析。在C#语言中,可通过使用关键字“dynamic (动态)”来指定动态类型化。例如,语句“dynamic dl指定了变量dl是被动态地指定类型的,且该类型将在运行时被解析。其他语言可使用其他构造来指定动态类型化。在某些语言中,动态类型化是默认的,或仅对变量类型化。如此处所使用的,术语“控制流分析”指的是对计算机程序代码的静态分析,以确定计算机程序或其一部分的控制流,计算机程序代码可以是源代码、中间代码或本机代码。 术语“动态分析”指的是通过执行计算机程序并观察程序行为(包括所采取的执行路径)来执行的分析。图1是其中可实现此处所描述的机制的计算机系统100的框图。图1只是合适的系统配置的一个示例,并且不旨在对本发明的使用范围或功能提出任何限制。因此,可采用各种系统配置而不背离本发明的范围或精神。如图所示,系统100包括程序源代码102,该程序源代码可以是计算机程序的高级语言表示。高级语言的示例包括C-Siarp (C#)、C++、Visual Basic, F-Sharp (F#)或各种其他高级语言。作为语言和库扩展的组合的LINQ是程序源代码102的另一示例。程序源代码102是可由系统100编辑和执行的目标程序的表示。程序可包括一个或多个功能。目标程序可以驻留在一个或多个文件或其他存储表示中。目标程序可包括一个或多个库,该一个或多个库能够以各种方式集成或分布。因此,程序源代码102可表示程序库或其一部分。如所示,系统100包括集成开发环境(IDE) 108。IDE 108可包括帮助程序员开发软件的各种工具。在所示实施方式中,IDE包括编辑器110、列表生成器114、分析器115以及数据库112。编辑器110可以是使得用户能够查看、编写或修改源代码的软件组件。编辑器110 可包括显示源代码102并接收来自用户的输入文本和命令的用户接口组件。编辑器110可包括提供与计算机程序或其一部分有关的信息、便于编辑功能等等的若干特征。在一些实施方式中,编辑器110可包括指示语法或语义错误、建议修正或便于输入正确的程序代码的特征。在各种配置中,编辑器110的功能可被分布在多个组件上或与系统100的其他组件组合,包括那些未示出的组件。在一个实施方式中,编辑器110在各种时间接收完成列表116并显示列表。编辑器110可使得用户能够查看该列表并从该列表选择项目。在一个实施方式中,响应于用户对完成列表的项目的选择以及用户命令,来自该项目的串或其一部分可被插入到所显示的程序源代码部分中。因此,完成列表116可充当在记住所希望的文本串以及将该串输入编辑器中时的辅助手段。在所示的实施方式中,列表生成器114可从编辑器110接收源代码102的一部分, 并确定完成列表116,完成列表116随后可被传递给编辑器110。列表生成器114可从数据库112接收数据并确定来自数据库112的项目的列表,以生成完成列表116。在一个配置中,列表生成器114可包括或采用分析器115来执行对源代码102的分析。在某些配置中, 分析器115也可由编辑器110或编译器120来使用。
数据库112可存储包括类定义、成员名称和数据类型、方法参数等信息。它还可存储来自源代码102的标识符、结构或其他信息。它还可包括来自文件头、汇编件、文档编制或其他源的信息。尽管数据库112被示为单个数据库,但是它可由多个数据库组成。每一部分可被存储为文件、保持在易失性存储器中或使用各种机制来存储。数据库112可以各种方式中的任何方式来实现,例如结构化数据库、平面文件、存储器中的一个或多个数据结构、标记语言、或它们的任何组合。数据库112可由编辑器110、列表生成器114或图1中未示出的其他组件更新。在一个实施方式中,数据库112可接收并存储来自编译时汇编件104 或运行时汇编件116的信息。汇编件是程序代码库,并可包含程序代码的类定义、功能定义或其他元素。编译时汇编件104包括作为当前程序项目、操作系统或软件框架的一部分的汇编件,且汇编件的内容在编辑会话期间是已知或可用的。例如,在.NET编程环境中,.NET 汇编件被认为是编译时汇编件。运行时汇编件106包括在不加载汇编件的情况下其内容是未知的汇编件。这些通常是当前项目、框架或系统外部的。在所示的实施方式中,系统100包括编译器120,编译器将程序源代码102转换成本机代码122。尽管编译器120被示为单个组件,但是在各实施方式中,它可包括一个或多个子组件,且可生成计算机程序的一个或多个中间表示。例如,在一个实施方式中,编译器 120可包括生成中间语言表示的前端,以及将中间语言表示转换成本机代码122的代码生成器。在一个配置中,系统可使用即时(JIT)编译。一般而言,JIT编译器采用这样一种机制,其中程序功能的中间语言表示响应于其第一次调用而被加载并被转换成本机语言表
7J\ O本机代码122可以是机器语言、虚拟机语言或可由物理或虚拟处理器执行的另一表示。处理器1 可接收本机代码122并执行程序指令以产生执行结果126。在一种配置中,处理器1 可包括一个或多个中央处理单元、一个或多个处理器核、ASIC、或其他硬件处理组件和相关程序逻辑。在一种配置中,处理器1 可包括模拟硬件处理单元的软件组件。处理器1 执行本机代码122中的指令。如此处所使用的,术语“运行时”指的是对目标程序指令或与目标程序交互的库、汇编件或可执行文件的执行。执行结果1 是执行本机代码122的结果的逻辑表示。结果可包括对计算机存储或计算机存储器的修改、与其他过程或计算设备的通信、音频或视频输出、对各种系统或外部组件的控制中的一个或多个。在一个实施方式中,IDE 108可包括在本机代码的运行时期间跟踪特定事件的运行时监控程序128。这些事件中的一些可指示出在一个或多个执行期间发生的实际控制流。 这些事件中的一些可指示出在运行时期间绑定到变量、对象或表达式的对象的类型。运行时监控程序1 可将该数据存储在运行时数据库130中。在一个实施方式中,完成列表生成器114使用该数据来确定目标变量或表达式的候选类型,并基于此将项目插入到完成列表116中。根据此处所描述的机制中的一些机制,系统100的一些部分可如下操作。开发者可在编辑器110中输入源代码102的一部分。事件可调用列表生成器114。列表生成器114 可使用来自数据库112的信息来分析源代码102的一部分,生成完成列表116。在一个实施方式中,完成列表116包括可被用于在编辑器110中的当前位置处插入文本的上下文敏感的选择。编辑器110可接收完成列表116并显示它或其一部分。用户可从完成列表中选择一项目,并指导编辑器在指定的位置处将该项目或 对应于该项目的串插入到源代码102 中。在一些实施方式中,调用列表生成器114的事件可以是若干事件中的任一个或多个。在编辑器110中插入字符或字符序列是一个这样的事件。例如,在对象标识符之后插入句点可表明对象类的一成员要跟在后面。因此,插入句点可导致编译器110调用列表生成器114。作为另一示例,在某一位置处放置光标可使得编译器110基于上下文而选择性地调用列表生成器114。例如,紧接着跟随对象标识符的句点之后放置光标可以是列表调用事件。作为另一示例,用户可显式地输入命令来调用列表生成器114。这可通过键入某一键或键组合、选择菜单项、点击按钮、删除文本、输入语音命令、或使用计算设备的输入机制输入命令的任何其他方式来执行。作为另一示例,在编辑器110中将鼠标指针定位在标识符或其他串上可使得编辑器110调用列表生成器114。列表调用事件可由编辑器110例如响应于编译错误来发起。术语“列表调用事件”在这里用于指代调用列表生成器114的事件,并可包括这些示例中的任何一个或多个,或其他事件。对该特征的使用的一个示例可以是程序员的使用,程序员输入源代码以指示出对与某一对象相关联的方法或变量的引用。在输入了对象标识符后跟一句点之后,列表生成器114可创建包含以下内容的列表可用于被调用给标识符的方法的名称、与标识符相关联的变量的名称,或它们的组合。如此处所述,在某些上下文中,列表生成器114可执行某些动作以确定对应于对象标识符的类或可能的类。系统100可以是开发系统的子系统。开发系统可包括由程序开发者或用户用作为程序开发、测试或文档编制过程的一部分的一个或多个计算设备。系统100的组件可以分布在一个或多个计算设备间,这些计算设备中的每一个通过采用诸如IP、TCP/IP、UDP、 HTTP、SSL、TLS, FTP、SMTP、WAP、蓝牙、WLAN等各种有线或无线通信协议中的一种或多种来彼此通信。计算设备可以是专用或通用计算设备。示例计算设备包括大型计算机、服务器、刀片服务器、个人计算机、便携式计算机、通信设备、消费电子产品等。图12示出了可被用于实现系统100的计算设备的示例实施方式。图2示出其中可采用此处所描述的某些机制的编辑会话的屏幕截图200。屏幕截图200包括可以是图1的程序源代码102的一部分的源代码片段202的视图。源代码片段可由编辑器110显示,但在某些配置中,可显示源代码片段的子集。某些部分可被保持在随机存取存储器中且不被显示,或者可被保持在一个或多个文件中。源代码片段202被编辑以示出感兴趣的特定行;尽管这里没有示出,但是可以包括源代码的各种其他行。如图2所示,源代码片段包括类BaseType的类定义,以及作为BaseType的子类的类DerivedType的类定义。BaseType包括成员变量si和s2,以及成员方法baseMethodl 禾口 baseMethod2。 DerivedType 包括成员方法 derivedMethodl 禾口 derivedMethod2。代码片段202包括变量dl、d2和d3的声明。变量dl在静态类型声明中被声明为是类型int。变量d2和d3被声明为dynamic。在C#变成语言中,声明为dynamic的变量绕过编译时的静态类型检查。相反,dynamic变量的类型基于被赋予它的对象的类型而在运行时被确定。例如,在该代码片段中,变量d2将收到int对象(10)的赋值;变量d3将通过方法调用收到DerivedType对象的赋值。变量d2和d3的类型被认为是在int对象或DerivedType对象被分别赋值到它们各自时在运行时被解析。在图2的示例中,光标203位于代码片段202内跟随串“d2. ”之后的位置;光标 204位于代码片段202内跟随串“d3. ”之后的位置。如此处所讨论的,放在接着标识符和句点之后的位置中的光标可以是列表调用事件,且可使得编辑器110调用完成列表生成器 114,完成列表生成器可接收源代码102或其一部分。列表生成器114可分析源代码的各部分,并执行控制流分析以确定表达式或变量在目标程序执行期间可接收到的类型或候选类型,但是目标程序在当时可能还未被执行。表达式在这里被称为“目标表达式”。变量是特定类型的表达式。当目标表达式是变量时,变量在这里被称为“目标变量”。在示例代码片段202中,响应于光标203的事件而执行的控制流分析可分析表达式,并基于对其的整数赋值确定目标变量d2将在执行期间接收类型int。响应于光标204的事件的控制流分析可分析表达式“new DerivedType ()”,并确定它将对类型DerivedType的对象求值。因此,目标变量d3将在执行期间解析类型DerivedType。在某些实现中,编译器可转换源代码以创建一个或多个临时变量供在运行时对表达式求值时使用。某些实现可在静态分析期间确定可由编译器创建的临时变量,并执行控制流分析来确定临时变量的候选对象类型,以及将此用作对应的目标表达式的分析的一部分。尽管在示例代码片段202中的变量d2和d3被声明为dynamic,但是在某些实施方式中,这里所描述的机制可应用于其声明不存在或未知的变量。例如,列表生成器114可不具有信息来指示变量是静态还是dynamic,并且可以类似于显式声明的dynamic变量的方式来应用此处所述的过程中的至少一些过程。这适用于其他示例以及这里对dynamic变量的讨论。示例屏幕截图200包括可由编辑器110响应于列表调用事件和完成列表生成而显示的完成列表208的视图。完成列表生成器114可生成完成列表208或与之对应的数据。 编辑器110可接收所生成的完成列表并显示它。在某些实施方式中,完成列表生成器114 可以第一表示生成完成列表,编辑器110可将此转换成第二表示供显示。在图2的所示出的示例中,完成列表生成器114可确定,在光标204的点处,目标变量d3在执行时将为类型DerivedType的变量。结果,完成列表生成器将 DerivedType类的成员插入到完成列表中。在所示出的示例中,这包括derivedMethodl和 derivedMethod2,它们每一个都是类DerivedType中定义的方法。在一个实施方式中,一旦确定对象的候选类型,完成列表生成器可插入除了对象的类所定义的那些成员之外的可用于对象的成员。例如,可包括可用于对象的父类或任何祖先类的成员。在所示出的示例中,类BaseClass的成员被插入完成列表中。这些是变量 si和s2,以及方法baseMethodl和l3aseMethod2。在一个实施方式中,完成列表的条目被排序,使得最特殊的类出现在父或祖先的成员的类之前,但是各种实施方式可以各种方式来排序它们。在某些实施方式中,可基于编辑器中已经输入的字符来过滤完成列表的条目。例如,如果在句点之后输入了字母‘b’,则除了以字母‘b’开头的成员之外的成员可被排除在所产生的完成列表之外。应注意,尽管示例代码片段202示出了对d2和d3的简单赋值,但是在各种程序
10中,赋值可以更复杂且可执行更复杂的控制流分析。例如,变量可以是具有中间变量的赋值链的一部分,如以下代码片段中那样。dynamic d3, d4, d5 ;d3 = new DerivedType ();d4 = d3 ;d5 = d4 ;d5.从而,完成列表生成器的控制流分析可确定在运行时d5将为类型DerivedType的对象,且相应地对其生成完成列表。在另一示例中,可将一个或多个级别的功能调用包括在导致对象类型被赋予动态变量的链中。分析可因此跟随一功能调用链,以确定对象类型。在另一示例中,变量可被有条件地赋予若干对象类型之一。图4示出了一个这样的示例。在一个实施方式中,用户可从完成列表208选择项目。框206表示一选择的项目, 它可以各种方式被突出显示或指出。一个实施方式可显示信息框210,具有对应于所选项目的信息。例如,信息框210可显示方法的声明,包括其参数的指定、方法的文本说明、或该方法可引起的异常列表。各种实现可显示其他类型的信息。图3示出其中可采用此处所描述的某些机制的示例编辑会话的屏幕截图300。在屏幕截图300中,源代码片段302包括对变量d的两个赋值,各自在备选条件子句中。在 “if”子句中,可在运行时将类型ClassA的对象赋给d。在“else”子句中,可在运行时将类型ClassB的对象赋给d。通过响应于在“if”子句中光标304跟随在“d. ”之后的列表调用事件执行控制流分析,完成列表生成器114可确定在运行时的这一点,d将是类型ClassA 的对象,且插入诸如完成列表308中所显示的类成员等对应的类成员。类似的,通过响应于在“else”子句中光标306跟随在“d. ”之后的事件执行控制流分析,完成列表生成器114 可确定在运行时的这一点,d将是类型ClassB的对象,且插入诸如完成列表310中所显示的类成员等对应的类成员。因此,在一个实施方式中,完成列表生成器包括识别对对象的类的确定可基于其在源代码中的位置、以及相应地生成完成列表的逻辑。许多其他代码配置可存在,其中完成列表生成器114可基于控制流分析和源代码内的当前位置来确定对象的类型。如此处所讨论的,在一个实施方式中,完成列表生成器114可包括从当前位置不可达的指令确定的候选类型;基于控制流分析,可基于相关联的指令是否可达来在完成列表中对成员排序。图4示出其中可采用此处所描述的某些机制的示例编辑会话的另一屏幕截图 400。在屏幕截图400中,源代码片段402包括将ClassA、ClassB和ClassC声明为从 BaseType派生的类。源代码片段402包括具有3个备选返回语句的条件控制流。前两个返回语句分别返回类型ClassA或ClassB的对象。第三个返回语句返回类型ClassC的对象,它可通过在调用AnotherMethodO之后分析AnotherMethod ()的代码并观察到这返回类型ClassC的对象来被确定。因此,方法SomeMethodO返回三种候选类型之一的对象。对 SomeMethod ()的调用以及对dynamic对象dl的赋值使得dl在运行时成为这三种类型之一的对象。响应于光标404跟在“dl. ”之后的列表调用事件,完成列表生成器114可执行对 SomeMethodO和AnotherMethod ()的控制流分析,确定对象dl的三种候选类型。对于这三种类型中的每一种,完成列表生成器114可插入对应的类成员,使得完成列表包括所有三种类的成员。完成列表408示出这种示例。尽管未示出,但完成列表408可包括ClassA、 ClassB和ClassC中的每一个的祖先类的成员。如图4所示,在跟随方法调用时,控制流分析可扩展许多级。调用可形成有向图。 在某些实施方式中,完成列表生成器114可被配置成对控制流分析期间被检验的图的深度进行限制。在一个实施方式中,完成列表生成器114可被配置成以另一种方式来限制其分析,例如通过插入的指定数目的候选类、执行时间量或另一因素。要注意,图3和图4的示例的不同在于,尽管每个代码片段为dynamic对象提供了不止一个候选类型,但是在光标304和306的每一个的位置处,仅一个候选类型被确定。如果列表调用事件发生在if-then-else语句外部,则多个类可能是可能的,且完成列表将反映此,如图4的示例那样。代码片段402还示出变量之间的候选类型集的转移。变量d2被声明为dynamic, 变量dl被赋给它。响应于光标410跟在“d2. ”之后的列表调用事件,完成列表生成器114 可确定变量d2可以是可被赋予变量dl的任何对象,且因此在控制流分析期间,变量dl的候选类型可被转移给变量d2。因此,在光标410的点处关于变量d2的控制流分析可在该点处执行变量dl的控制流分析,导致诸如完成列表408之类的具有将位于变量dl的完成列表上的成员的完成列表。图5A示出其中可采用此处所描述的某些机制的另一示例编辑会话的屏幕截图 500。在屏幕截图500中,源代码片段502包括具有dynamic参数ρ的method5的声明。该声明不指示出参数P的类型;P的类型将在其在运行时被调用时被解析,且可随每个调用而不同。然而,响应于光标504跟随在“p. ”之后的列表调用事件的控制流分析可被执行来找到method5的调用。在该示例中,存在两个这样的调用。在一个调用中,类型ClassA的对象作为对应于参数P的自变量被传递,且因此要被赋给P。在第二个调用中,类型ClassB的对象作为对应于参数P的自变量被传递。可推断参数P可成为类型ClassA或ClassB的变量。因此,完成列表生成器114可将ClassA和ClassB添加到变量ρ的候选类型集。源代码片段502示出了表达式到变量的赋值,但是它们是通过自变量的传递而不是通过赋值语句而完成的。如此处所讨论的,完成列表生成器114可检索候选类ClassA和ClassB的类成员名称。完成列表508示出具有ClassA方法ClassAMethodl、ClassAMethod2和 ClassABMethod以及ClassA变量ClassAvarl的示例完成列表。完成列表还包括ClassB方法 ClassBMethodl、ClassBMethod2 禾口 ClassABMethod 以及 ClassB 变量 ClassBvarl0该示例完成列表508包括具有公共名称的两个方法。在该示例中,ClassA包括名为ClassABMethod的方法;ClassB包括名为ClassABMethod的方法。该方法名称可以是可能想要选择对于ClassA和ClassB都公共的方法的程序员特别感兴趣的。在一个实施方式中,对于多个候选类公共的成员或与多个源代码指令相关联的成员可在完成列表中排序在其他成员之前。图5B示出其中可采用此处所描述的某些机制的另一示例编辑会话的屏幕截图 520。在屏幕截图520中,源代码片段522包括method6的两个声明,其中一个method6 (称为method6 (ClassA))具有类型ClassA的参数,并返回类型ClassA的对象,而一个
12method6(称为method6 (ClassB))具有类型ClassB的参数并返回类型ClassB的对象。因此,方法被重载,调用由传递给它的自变量来确定。methode的调用传递被声明为dynamic 的自变量。响应于光标5M跟随在methode的调用之后的列表调用事件,可执行控制流分析来确定要处于完成列表中的可用方法或成员。还要注意,在该示例中,目标表达式不是变量,但却是包括方法调用的表达式。在该示例中,控制流分析可确定dynamic变量d6被用于调用作为ClassA的方法的ClassAMethod。可推断在method6的调用中传递的自变量d6具有类型ClassA,且因此 method6 (ClassA)被调用,返回ClassA的对象。因此,ClassA可被添加到对应于目标表达式的完成列表的候选类型集。如此处所讨论的,在某些实施方式中,可做出methode (ClassB) 也可被调用的推断,且ClassB可被添加到候选类型集。在某些实施方式中,完成列表可被排序,使得基于methode的调用,与ClassA相关联的成员被列出在ClassB的成员之前。尽管在图5B中未示出,但是在某些配置中,对除了变量之外的目标表达式的完成列表的确定可采用此处所讨论的其他技术中的一个或多个。例如,对在目标表达式中使用时变量d6的可能类型的分析可采用此处所述的任何机制,包括应用于目标变量的静态分析或动态分析。例如,尽管在图5B中未示出,但是在某些实施方式中,可执行动态分析来确定图5B的目标表达式的完成列表。运行时监控程序可确定目标表达式中的methode的调用返回类型ClassA的对象一次或多次,并基于此观察而将该类添加到候选类型集。图6示出其中可采用此处所描述的某些机制的另一示例编辑会话的屏幕截图 600。在屏幕截图600中,源代码片段602包括dynamic变量dl的声明,以及跟在“dl. ”之后的光标604。响应于光标事件的控制流分析可定位包括在运行时使用变量dl的一个或多个语句。在该示例代码片段中,示出了三个这样的语句。dl. ClassAMethodl ();dl. Bvarl = 7 ;dl. CDvar = "hello";第一个语句调用绑定到变量dl的对象的方法(ClassAMethodl)。第二个语句引用变量dl的成员变量(Bvarl)。第三个语句引用变量dl的另一成员变量(CDvar)。例如,假设ClassAMethodl定义在类ClassA中的,Bvarl定义在类ClassB中,CDvar定义在两个类 ClassC 和 ClassD 中。在一个实施方式中,完成列表生成器114可从源代码检索这些成员名称中的每一个,并将它们添加到完成列表中,如完成列表606所示。完成列表生成器114可在诸如数据库112之类的数据库中查找每个成员,以检索附加信息用于在完成列表606或信息框中显示。在一个实施方式中,完成列表生成器114可从源代码检索这些成员名称中的每一个,并对于每个名称,确定定义这些名称的一个或多个类。在该示例中,可确定类ClassA、 ClassB、ClassC和ClassD定义了这三个成员名称。这些类中的每一个可被添加到候选类型集,且每个类的成员可被插入完成列表。完成列表608示出这种完成列表的示例,具有这四个类的聚集成员列表,包括源代码中未被引用的成员。尽管与完成列表606和完成列表608相关联的技术可与备选实施方式相关联,但是某些实施方式可组合这些技术或其部分。例如,在一个实施方式中,类成员可被分组成多个完成列表。在一个实施方式中,可基于每个类成员被确定的机制来排序类成员。这些实施方式在本文中进一步更详细地讨论。代码片段610示出对目标变量的其他使用。在该示例中,代码片段610包括 dynamic变量d2,它被赋予来自未知方法或返回类型未知的某一方法的对象。响应于光标 612跟随在文本“d2. ”之后的列表调用事件的控制流分析可定位其中使用变量d2的以下示例语句。d2. ClassAMethodl ();ClassB d3 = d2 ;method5(d2); dynamic d4 = d2 ;第一个语句引用ClassA的成员。如上所述,完成列表生成器114可基于该引用将 ClassA添加到候选类型集。第二个语句在表达式中使用变量d2,将绑定到d2的对象赋给变量d3,d3被静态地声明为具有类型ClassB。在一个实施方式中,完成列表生成器114可推断表达式可以是与它正被赋予的变量相同的类型,以及推断用作表达式的dynamic变量可以是相同类型。因此,ClassB可被添加到候选类型集。对method5的调用使用被赋给method5中的参数p2的变量d2作为自变量。这类似于对d3的赋值,但是这是通过方法调用而不是通过赋值语句的赋值。参数p2被声明为具有类型ClassC。因此,可推断变量d2可具有类型ClassC。因此,该类可被添加到候选类型集。在第四个示例性使用中,变量d2被用作赋给另一 dynamic变量d4的表达式。在确定变量d2的类型推断时,完成列表生成器114可递归地在赋值的位置处确定变量d4的候选类型。这可导致在语句d4. ClassEMethodl ()中对d4的使用。如此处所讨论的,这种对ClassE的方法的引用可允许推断ClassE是d4的候选类型。因此,ClassE成为变量d2 的候选类型。因此,此处所描述的机制可被链在一起,或递归地被应用,以确定目标表达式的候选类型。在所示示例中,完成列表生成器可因此将ClassA、ClassB、ClassC和ClassE的成员插入到完成列表中,如完成列表614中所示。图7A-C分别示出其中可采用此处所描述的某些机制的示例编辑会话的其他屏幕截图700、710和720。这些屏幕截图提供了各配置的示例,其中用于确定候选对象类型的提示驻留在除了源代码的主汇编件之外的汇编件中。在屏幕截图700中,源代码片段702包括赋值,其中Microsoft. Office. Interop. Excell.dll互操作汇编件(interop assembly)创建工作表对象。这被认为是编译时汇编件104。在一个配置中,从该COM API返回的对象可被当作dynamic来处理。响应于光标 704在所示位置的列表调用事件,完成列表生成器114可基于对该汇编件的调用来确定变量dl将成为指定的互操作汇编件中所定义的对象类型。可获得这些类型的列表,且可将这些类型的成员插入到完成列表中,如完成列表708所示的。在屏幕截图710中,源代码片段712包括赋值,其中使用要在运行时被加载的外部汇编件来初始化dynamic变量d2。响应于光标714位于所示位置的列表调用事件,完成列表生成器114可检索传递给LoadO调用的串(在该示例中是“System, dll”),在编辑会话
14中时加载该汇编件,以及基于该汇编件确定候选类型和成员。动作可进一步包括基于传递给GetTypeO调用的串(该示例中的“UnBuilder”)来确定候选类型。在一个实施方式中, 如此确定的候选类型的对象可在编辑会话中时被实例化。反射可被用于获得指定类型的成员的列表。以此方式获得的成员可被插入到完成列表中,如完成列表718所示的。在某些实施方式中,一旦加载如上所述的汇编件,则诸如在所加载的汇编件内执行控制流分析之类的此处所述的其他机制可被用于确定从该汇编件返回的对象的候选类型。因此,尽管汇编件被认为是运行时汇编件,但是这些机制在可在编辑会话期间加载汇编件。在屏幕截图720中,源代码片段722包括赋值,其中使用要在运行时被加载的动态语言的脚本文件来初始化dynamic变量d3。响应于光标7 在所示位置处的列表调用事件, 完成列表生成器114可在编辑会话期间加载此脚本文件,以及基于此来确定候选类型和成员。以此方式获得的成员可被插入到完成列表中,如完成列表7 所示的。在一个实现中,为了对图7A-C所示的每个机制限制完成列表中的类型数量或项目数量,完成列表生成器114可延迟插入来自指定的汇编件或脚本文件的项目,直到在列表调用事件之后输入了至少第一个字符。然后可对项目进行过滤以排除不以所输入的字符开始的那些项目。在一个实现中,可通过使用此处所述的其他技术来过滤来自指定的汇编件或脚本文件的项目,例如分析从源代码的其他语句中使用的变量dl、d2或d3引用的成员或使用变量的其他方式。此外,图7A-C所示的每个机制可用作此处所述的控制流分析的结果,当将项目插入到完成列表中时,可组合不同机制的结果。简单的示例可以是将对象赋给dynamic变量d 的一系列条件语句,其中任一条件语句可包括从编译时汇编件、运行时汇编件、脚本文件或被编辑的文件的源代码检索。因此,从这些条件语句中的每一条件语句检索的类型或成员可被组合以生成完成列表。图8是示出向用户提供完成列表的过程800的示例实施方式的流程图。在一个实施方式中,过程800的某些动作是由图1的计算机系统100的组件执行的。过程800的示出的部分可在框802启动,在框802可检测列表调用事件。在一个实施方式中,编辑器110可检测列表调用事件并调用列表生成器114。过程可流到框804,在框804接收程序源代码的至少一部分和当前编辑上下文。该上下文可包括编辑光标的位置、光标前的文本串、源代码文件中的位置、源代码文件名、或其他此类信息。对表示程序变量的标识符的指定可被包括作为上下文的一部分或可从上下文导出。对其生成对应的完成列表的变量此处被称为“当前”变量。尽管框804被示为单个框,但是这些动作可分布在过程800的动作中。例如,源代码的各部分可在过程期间在被请求时接收。过程800可流到框806,在框806可执行控制流分析。如此处所讨论的,这些动作可包括分析源代码的各部分、确定程序流或变量初始化的有向图、或程序分析的其他方面。过程可流到框808,在框808可确定当前变量的一个或多个候选类型。这可基于赋值、成员引用、使用、声明、或与当前变量或可直接或间接与当前变量相关的其他变量有关的其他程序组件。图9示出框808的进一步细节的示例动作。框808的动作可导致在当前上下文中当前变量的一组一个或多个候选变量或对象类型。该组被称为候选类型集。该过程可流到框810,在框810可检索与候选类型集相关联的成员的名称。例如,如果类型是类,则成员可包括为该类定义的且可用于由当前变量引用的变量或方法。框810 的动作可包括生成包括与候选类型集的类型相关联的成员的联合的完成列表。过程可流到框812,在框812可基于光标的位置处的前缀来过滤完成列表的成员。 可过滤成员以排除不匹配前缀的那些成员。例如,如果光标前的串是“d.na”,则完成列表可被过滤以排除不以子串“na”开头的成员名称。在某些实现中,过滤可与框810的动作集成。过程可流到框814,在框814成员可基于配置的准则被过滤,被形成为一个或多个组,或基于配置的准则被排序。在某些实施方式中,完成列表生成器可响应于调用而创建多个候选类型集或多个完成列表。多个列表可以按各种方式来分组。在一个实施方式中,列表可基于用于生成每个列表中的项目的技术来分组。例如,图6的完成列表606和608示出用于生成完成列表的两种技术。一个实施方式可生成这两个完成列表。用户界面可提供供用户选择和查看列表之一、同时查看两个列表或合并两个列表的机制。例如,用户界面可呈现一有选项卡的窗口,其中每个选项卡对应于不同的完成列表。在另一示例中,如此处所讨论的,一个完成列表可包括直接被推断为候选类型的类的成员。另一完成列表可包括属于对应于第一个完成列表的类中的每一个类的父类或祖先类的成员。在另一示例中,第一个完成列表可呈现和在当前汇编件中找到的候选类型相对应的成员,一个或多个其他完成列表可对应于其他汇编件中找到的候选类型。在一个实现中,完成列表的成员可被过滤以限制重复的标识符。这可例如在多个类定义具有公共名称的多个方法时发生。因此,在一个实现中,完成列表可包括完成列表中唯一的标识符。图5A的完成列表508示出包含了重复的成员名称(classABMethod)的实施方式。然而,在一个实施方式中,可滤除重复的成员名称,classABMethod.多个完成列表可以按各种方式来实现。例如,在一个实现中,可维护单个完成列表,且每次接收到对指定分组的请求时对该完成列表应用一过滤。在一个实现中,多个结构可维护多个列表,当接收到对完成列表的请求时,可组合该多个列表。在一个实施方式中,完成列表中的项目可基于一个或多个配置的因素来排序。字母顺序列表是一个此类示例。一些其他示例因素包括用于选择组的准则,如上所讨论的那样。因此,与当前汇编件相关联的项目可比与系统或外部汇编件相关联的项目的优先级高。 诸如完成列表606中所示的被显式引用的成员可具有比诸如完成列表608中所示的和被引用的成员相对应的类的成员的优先级高。在一个实施方式中,从与目标表达式的位置相同的控制流中可达的指令作出的对候选类型的推断可排序在从不可达的指令作出的推断之前。例如,在图3中,对应于光标306的完成列表310可包括ClassA的成员,即使ClassA 对象的赋值从光标306不可达。一个实施方式可对ClassB的成员划分优先级,并在处于该位置的完成列表中将这些成员排序在ClassA的成员之下。类成员或类可基于它与目标表达式的使用相关联的次数来划分优先级。在一个实施方式中,系统可跟踪描述用户选择列表项目的次数的数据,并基于该历史数据来对列表项目划分优先级。在一个或多个先前的运行时期间由监控程序维护的数据可被用来基于使用频率、运行时控制流或其他历史数据来排序类或类成员。该过程可流到框816,在框816成员可被插入到一个或多个完成列表中,如此处所讨论的。
16
过程可流到框818,在框818可显示一个或多个生成的完成列表或其一部分。图 2-7示出所显示的完成列表的表示。过程可流到完成框520,并退出或返回到作出调用的程序。在一个配置中,框802和818的动作可由编辑器110执行,框804-816的动作可由列表生成器114执行。然而,在各种实现中,过程800的动作可在编辑器110、列表生成器 114或系统100的其他组件(包括图1中可能没有示出的那些组件)之间不同地分布。尽管过程800的动作是以离散框呈现的,但是在各种实现中,它们可以各种顺序被组合或以各种方式被混合,包括一个或多个线程同时执行的动作。因此,图8提供了对示例实施方式的描述,但实现方式可变化。图9是示出确定程序表达式的一个或多个候选类型的过程900的示例实施方式的流程图。过程900可用于实现过程800的框808的至少一些动作。过程900可在循环902 处开始,循环902对于变量类型的可能的指示进行迭代。在所示出的实施方式中,循环902 包括框904-920,并终止于框928。在框904,使用控制流分析,可遵循目标程序流以找到当前变量的可能的初始化, 或变量类型的其他指示。这可包括以正向或反向遍历目标程序、遵循方法调用、遵循备选流分支,或流控制分析的其他技术。尽管示为单个框,但是框904的动作可与过程900的任何其他框的动作一起执行。该过程可确定控制流分析期间达到的配置。尽管图9示出了对应于可能的配置的若干判定框,但是各实现可关于过程如何基于源程序配置来确定要采取的动作而变化。在判决框906,作出关于是否找到当前变量的静态类型声明的判定。静态类型声明的示例是int vl = 5 ;该语句既将变量vl声明为整型,又将其初始化为值5。如果在判决框906判定是肯定的,则过程可流到框908,在框908可将来自该声明的指定的类型插入候选类型集。在一个实施方式中,父类和其他祖先类的类型可被插入到候选类型集中。过程可流到框928, 在框拟8终止循环902。基于源程序配置、当前上下文或过程实现,可循环回到循环902或退出循环。在某些实现中,在存在与确定类型有关且还未被过程900分析的程序部分时,循环902可继续。在某些实现中,一个或多个指定的限制可使得循环902退出。例如,对候选类型集中类型数量的限制、对被分析的代码量的限制、对对应于候选类型集的成员数量的限制、执行时间限制或另一指定的限制可使得循环902退出。在循环902的最后一次迭代之后,过程可返回到作出调用的程序,例如过程800。在一个实施方式中,关于变量不具有静态类型声明的判定意味着变量是dynamic 类型。因此,在该实施方式中,框910-920的动作被应用于dynamic类型。在一个实施方式中,框910-920的动作可应用于静态类型,例如用于确定所声明的类型的候选子类。在某些配置中,没有静态类型声明的变量可不具有dynamic类型的声明。例如,这可发生在源代码是不完整的环境中。在一个实施方式中,没有类型声明的变量以类似于被声明为dynamic 的变量的方式被处理。用于此类变量的过程可从判决框906流到判决框910。如果在判决框906判定是否定的,则过程可流到判决框910,在判决框910作出关于是否找到对当前变量的赋值的判定。如此处所讨论的,这可发生在赋值语句、被传递以赋值给功能参数的自变量或另一程序构造的上下文中。如果在判决框910判定找到对当前变量的赋值,则过程可流到框912,在框912过程可递归地分析表达式以确定要被赋予它的一个或多个类型,以及推断这些是候选类型。 取决于赋予了什么,这可包括附加的控制流,例如遵循方法调用,或确定另一变量的一个或多个候选类型。图2-5的代码片段202、302、402、502分别包括赋值和表达式的示例。过程随后可流到框拟8并如上所述地继续。如果在判决框910判定没有找到对当前变量的赋值,则过程可流到判决框914,在判决框914作出关于是否找到对当前变量的使用的判定。代码片段402提供了对变量d的四种示例使用。这些包括调用成员方法、引用成员变量、将变量赋给赋值语句中的另一变量、以及通过将变量作为自变量传递给方法将变量赋给参数。如果判决框914的判定是肯定的,则过程可流到框916,在框916可从变量的使用情况来推断一个或多个类型。将目标表达式赋给另一变量允许作出另一变量的类型是目标表达式的候选类型的推断。这可采用赋值语句、在功能调用中传递的自变量、或其他类型的赋值的形式。如图6的代码片段610 中的d2到d4的示例赋值所示,分析被赋给第二变量的目标表达式或变量可包括使用此处所讨论的机制递归地分析第二变量的候选类型。目标表达式的成员引用允许作出显式地或通过继承而暴露该成员的类型是目标表达式的候选类型的推断。在某些情况中,这可包括多个类型。过程随后可流到框9 并如上所述地继续。如果在判决框914判定是否定的,则过程可流到判决框920,在判决框920作出关于程序流是否导向多个备选控制流的判定。图5A的代码片段502提供了条件备选控制流的示例。如果在判决框920的判定是肯定的,则过程可流到框922,在框922,过程900或其一部分可对控制流的每个备选分支递归地执行。在示例代码片段502中,可发起三个递归过程。尽管这些动作在此是按照递归来描述的,但是要理解这是概念性的描述,且各种实现方式可使用除了递归之外的技术来对流的每个分支执行过程900或其一部分。作为递归地处理每个分支的结果,可将来自每个分支的零个、一个或更多个候选类型添加到候选类型集,且相关联的成员可被添加到完成列表。过程随后可流到框9 并如上所述地继续。如果在判决框920判定是否定的,则过程可流到判决框924,在判决框拟4作出关于程序流是否导向另一汇编件或脚本的判定。如果该判定是肯定的,则过程可流到框920, 在框920可分析附加的汇编件或程序脚本。图10的过程1000示出了这些动作的示例实施方式。过程可流到框9 并如此处所述地继续。如果在判决框拟4判定是否定的,则过程可流到框拟8并如此处所述地继续。图10是示出基于程序代码确定程序变量的一个或多个候选类型的过程1000的示例实施方式的流程图。过程1000可实现框926的动作或其一部分。过程1000的动作可以各种顺序和各种方式执行,当前的仅用于说明。过程1000可开始于判决框1006,在判决框1006作出关于程序流是否导向编译时汇编件中的程序代码的判定。如果此判定是肯定的,则过程可流到框1008,在框1008可从指定的汇编件检索候选类型。在一个实现中,这可包括检索汇编件的对于该汇编件外部的程序代码可用的类型的完整集合。在一个实现中,这可包括基于对汇编件中的方法的调用或对汇编件中类的引用来检索一个或多个候选类型。在一个实施方式中,框1008的动作可包括在汇编件内递归地执行过程900的至少一部分。该过程可从框1008流到框1028,并通过退出或返回到诸如过程900之类的作出调用的过程来继续。如果在判决框1006判定是否定的,则过程可流到判决框1012,在判决框1012作出关于程序流是否导向运行时汇编件中的程序代码的判定。在某些环境中,运行时汇编件可由指令指定以使用指定的文件名来加载汇编件。如图7B中所示,如此做的示例源代码语句是Type myType = Assembly. Load( "System, dll “ ) · GetType ( "UriBuilder");在一个实施方式中,框1014的动作可包括在编辑会话期间加载LoadO调用中指定的汇编件。因此没有必要等到目标程序运行时加载汇编件并检索候选类型。框1014的动作可包括创建汇编件中定义的一个或多个类中的每个类的实例,以及使用反射来确定可用成员。在上述示例中,可创建类型“toiBuilder”的对象。过程随后可流到框10 并如上所述地继续。如果在判决框1012判定是否定的,则过程可流到判决框1016,在判决框1016作出关于程序流是否导向动态语言脚本中的程序代码的判定。在某些环境中,程序指令可指定对动态语言脚本的加载,这可作为程序执行的一部分来执行。如果此判定是肯定的,则过程可流到框1018,在框1018加载指定的脚本。图7C示出了这样做的示例源代码指令。在一个实施方式中,框1018的动作可包括加载指令中指定的脚本以加载脚本,以及搜索指定的汇编件以及本发明方案的范围内的其他汇编件,以检索候选类型集和成员。 过程随后可流到框10 并如上所述地继续。如果在判决框1016判定是否定的,则过程可流到框10 并如上所述地继续。图11是示出基于目标计算机程序的动态分析确定程序变量的一个或多个候选类型的过程1100的示例实施方式的流程图。过程1100可由计算机系统100的组件执行。过程1100可开始于框1102,在框1102可改编目标程序以便于在运行时期间监控该程序。改编可包括在特定位置插入程序指令以引起诸如图1的运行时监控程序1 之类的程序监控程序监控的事件。在一个实施方式中,改编目标程序可基于dynamic程序变量的标识。一个这样的示例可以是在对dynamic程序变量的每个赋值之后引起事件。事件也可指示出在程序执行期间采取的分支或调用的功能。尽管目标程序的改编可用运行时监控的某些技术来实现,但是某些技术不使用改编。因此,1102的动作可在某些实现中被忽略, 或者可使用用于设置运行时监控的其他机制。过程可流到框1104,在框1104至少部分地执行运行时程序。在框1106,程序执行被监控以检测诸如赋值、所采用的执行路径、所调用的功能等之类的事件。监控程序执行可包括检测通过赋值语句、通过在功能调用中传递要被赋予功能参数的对象、或通过另一类型的赋值来赋予目标程序变量的对象。这些运行时类型解析向运行时监控程序提供了被绑定到程序变量的特定对象。在某些实施方式中,运行时监控程序可检查运行时栈的状态或内容。例如,运行时栈上的数据对象的类型或值可指示出对象或表达式的类。在某些配置中,运行时栈上的数据对象可以和表示在运行时被求值的表达式的临时变量相对应。运行时监控程序1 可标识被赋值的对象的类。在一个实施方式中,被改编的指令或从被改编的指令调用的帮助功能可执行动作来标识对象的类。在一个实施方式中,运行时监控程序1 可结合调试器一起操作,来标识对象和它们的类。例如,调试器可插入一个或多个跟踪点,并记录每个跟踪点处的信息。运行时监控程序1 可使用反射来确定对象的类或类成员。在一个实施方式中, 反射可被用于确定和从运行时汇编件接收的对象相对应的类信息。对象可实现使得运行时监控程序能够查询数据对象的接口。查询可提供对象的类型或便于确定对象的类型的其他信息。在一个实施方式中,可响应于检测到诸如调用或进入某一功能、退出某一功能、对程序变量赋值、对条件指令的执行、或达到断点等事件来使用反射。该过程可流到框1108。在框1108,在监控期间检索到的数据可被存储,例如存储在运行时数据库130中。框1104的动作可发生一次或多次。更具体的,目标程序可被执行多次。对于每个执行,可检测并存储一个或多个赋值或执行流。过程可流到框1110,在框1110可从运行时数据库130检索数据,可基于运行时赋值或执行流将一个或多个类型添加到候选类型列表。框1110的动作可由完成列表生成器 114执行,并可在目标程序执行之后在编辑会话期间发生。在一个实施方式中,过程可流向框1112,在框1112基于动态分析期间检索到的运行时数据来排序候选类型或类成员。如此处所讨论的,这可基于赋值的频率。与运行时绑定相关联的类可被排序在由诸如静态分析等其他机制确定的其他类之前。在某些实施方式中,从执行过程1110得出的成员可被分组在一起并与通过使用源代码分析确定的成员分开显示。在某些实施方式中,对成员的排序可基于目标程序的动态分析和控制流分析的组合。例如,动态分析所确定的成员可被给予更高的优先级,并排序在控制流分析确定的成员
> . 、r -d“过程可流向完成框1114并退出,或返回到作出调用的程序。过程1100或其部分可与这里所述的诸如过程800、900或1000之类的其他机制组合或集成。图12示出了计算设备1200的一个实施方式,示出可用于实现系统100或执行此处所描述的功能(包括过程800、900、1000或1100)的计算设备的所选组件。计算设备1200 可包括比所示多得多的组件,或可包括比所示全部组件要少的组件。计算设备1200可以是独立计算设备或诸如具有一个或多个刀片的机箱中的某一刀片之类的集成系统的一部分。如所示,计算设备1200包括一个或多个处理器1202,处理器执行动作以执行各种计算机程序的指令。在一个配置中,每个处理器1202可包括一个或多个中央处理单元、一个或多个处理器核、一个或多个ASIC、高速缓存存储器或其他硬件处理组件和相关程序逻辑。如所示,计算设备1200包括操作系统1204。操作系统1204可以是通用或专用操作系统。华盛顿州雷蒙德市的微软公司的Windows 系列操作系统是可在计算设备1200上执行的操作系统的示例。存储器和存储1206可包括各种类型的非瞬态计算机存储介质中的一个或多个, 包括易失性或非易失性存储器、RAM、ROM、固态存储器、盘驱动器、光学存储、或可用于存储数字信息的任何其他介质。存储器和存储1206可存储此处所述的一个或多个组件或其他组件。在一个实施方式中,存储器和存储1206存储系统100的软件组件或其一部分。所示的示例组件是编译时汇编件104、运行时汇编件106、程序源代码102、列表生成器114、运行时监控程序128以及完成列表116,但是更多或更少的组件可存储在存储器和存储1206中。这些组件中的任何一个或多个可通过操作系统1204或其他组件被移动到RAM、非易失性存储器中的不同位置,或在RAM和非易失性存储器之间移动。计算设备1200可包括便于将程序代码或其他信息显示给用户的视频显示适配器 1212。尽管在图12中未示出,但是计算设备1200可包括基本输入/输出系统(BIOS),以及相关联的组件。计算设备1200还可包括用于与网络通信的网络接口单元1210。系统100 的软件组件可经瞬态介质和网络接口单元1210被接收。计算设备1200的实施方式可包括显示监视器1214、键盘、定点设备、音频组件、话筒、语音识别组件、或其他输入/输出机制中的一个或多个。将理解图8-10的流程图的每个框以及流程图中的框的组合可由软件指令来实现。这些程序指令可被提供给处理器以生成机器,使得在处理器上执行的指令创建用于实现某一流程框或多个框中指定的动作的手段。这些软件指令可由处理器执行来提供用于实现某一流程框或多个框中指定的动作的步骤。此外,流程图中的一个或多个框或框的组合也可与其他框或框的组合同时执行,或甚至以与所示不同的顺序执行,而不背离本发明的范围和精神。以上说明、示例和数据提供了对本发明的组成部分的制造和使用的全面描述。因为可以在不背离本发明的精神和范围的情况下做出本发明的许多实施例,所以本发明落在所附权利要求的范围内。
权利要求
1.一种生成和目标程序中的目标表达式相对应的完成列表(116)的基于计算机的方法(1100),所述目标程序具有源代码表示(10 和可执行代码表示(122),所述方法包括a)执行(1104)所述目标程序的可执行代码表示;b)监控(1106)所述程序代码的执行以确定(1108)所述目标程序变量的一个或多个运行时类型解析;c)对于运行时类型解析,确定(810)与该类型相关联的一组类成员;以及d)聚集(816)—组或多组类成员。
2.如权利要求1所述的基于计算机的方法,其特征在于,所述目标表达式是程序变量, 监控所述程序代码的执行包括检测指示出对象到所述程序变量的运行时赋值的一个或多个事件。
3.如权利要求1所述的基于计算机的方法,其特征在于,监控所述程序代码的执行包括使用反射来确定所述目标表达式的所述一个或多个运行时类型解析。
4.如权利要求1所述的基于计算机的方法,其特征在于,还包括基于对应的一个或多个类型解析对所述一组或多组类成员进行排序。
5.如权利要求1所述的基于计算机的方法,其特征在于,还包括a)执行对所述源代码表示的静态控制流分析;b)基于所述静态控制流分析确定对应于所述目标表达式的一个或多个候选类型;以及c)聚集对应于所述一个或多个候选类型的类成员以及所述一组或多组类成员。
6.如权利要求1所述的基于计算机的方法,其特征在于,还包括a)执行对所述源代码表示的静态控制流分析;b)基于所述静态控制流分析确定对应于程序变量的一个或多个候选类型;以及c)聚集对应于所述一个或多个候选类型的类成员以及所述一组或多组类成员;d)基于运行时类型解析对完成列表排序。
7.如权利要求1所述的基于计算机的方法,其特征在于,还包括通过插入便于监控所述程序代码的执行的指令来改编所述目标程序。
8.如权利要求1所述的基于计算机的方法,其特征在于,监控所述程序代码的执行包括从运行时汇编件接收的至少一个对象,所述方法还包括确定至少一个对象的至少一个类型,以及将所述至少一个类型与所述目标表达式的运行时类型解析包含在一起。
9.如权利要求1所述的基于计算机的方法,其特征在于,所述目标表达式是程序变量, 所述源代码包括将所述程序变量声明为dynamic (动态)类型。
10.一种用于生成和具有对应的目标程序源代码(10 的目标程序O02)中的目标程序变量相对应的完成列表(116)的基于计算机的系统(100),所述系统包括a)分析器(115),被配置成执行对目标程序源代码执的语法分析;b)运行时监控程序(1 ),所述运行时监控程序检测事件,执行分析来确定(1108)对应于所述目标程序变量的至少一个运行时类型解析,基于所述至少一个运行时类型解析来确定(1110) —个或多个候选类型,以及存储(1110)所述一个或多个候选类型;以及c)完成列表生成器(114),所述完成列表生成器检索所述一个或多个候选类型,确定 (810)与所述一个或多个候选类型相关联的一个或多个类成员,以及将所述一个或多个类成员插入(816)完成列表。
11.如权利要求10所述的基于计算机的系统,其特征在于,所述完成列表生成器被配置成执行动作,所述动作包括对所述目标程序源代码执行静态分析以及基于所述静态分析确定至少一个附加候选类型。
12.如权利要求10所述的基于计算机的系统,其特征在于,所述目标程序变量是程序功能的程序功能参数,所述运行时监控程序被配置成通过确定传递给程序功能的对象的类型来确定所述目标程序变量的一个或多个候选类型。
13.如权利要求10所述的基于计算机的系统,其特征在于,所述运行时监控程序被配置成执行动作,所述动作包括使用反射来确定在运行时被绑定到目标程序变量的对象的类型。
14.如权利要求10所述的基于计算机的系统,其特征在于,所述完成列表生成器被配置成执行动作,所述动作包括对所述目标程序源代码执行静态分析,基于所述静态分析确定至少一个附加候选类型,确定与所述至少一个附加候选类型相关联的一个或多个附加类成员,以及基于每个项目是否由运行时监控程序确定来对完成列表排序。
15.如权利要求15所述的基于计算机的系统,其特征在于,所述目标程序变量是功能的参数,所述运行时监控程序检测对所述功能的调用,以及通过确定通过所述调用传递给所述参数的对象的类型来确定所述一个或多个候选类型。
全文摘要
提供了软件开发工具。一种用于提供与计算机程序源代码和动态表达式相关联的完成列表的系统和方法。执行动态分析以找到并聚集表达式的一个或多个候选类型。在目标程序的执行期间,运行时监控程序跟踪指示出程序变量的类型的事件。分析可包括若干静态分析技术中的一个或多个,包括分析被赋予程序变量的表达式、遵循方法调用、检验系统或其他指定的汇编件、加载运行时汇编件、或基于对变量的其他使用作出推断。完成列表可基于配置的准则被过滤或排序。
文档编号G06F9/44GK102236550SQ201110117310
公开日2011年11月9日 申请日期2011年4月29日 优先权日2010年4月30日
发明者D·J·帕克, H·常, T·扬 申请人:微软公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1