《代码片段的泛化和/或特化.pdf》由会员分享,可在线阅读,更多相关《代码片段的泛化和/或特化.pdf(17页珍藏版)》请在专利查询网上搜索。
1、(10)申请公布号 (43)申请公布日 (21)申请号 201380036188.9(22)申请日 2013.07.0413/542,975 2012.07.06 USG06F 9/44(2006.01)G06F 17/27(2006.01)(71)申请人微软公司地址美国华盛顿州(72)发明人 LJ博德奥科斯 S古尔瓦尼Y哈马迪 Y魏(74)专利代理机构上海专利商标事务所有限公司 31100代理人陈小刚(54) 发明名称代码片段的泛化和/或特化(57) 摘要代码片段的泛化和/或特化被描述为例如软件开发者的工具的一部分。在一实施例中,开发者将表达编程任务的自然语言插入他或她正在集成开发环境中开发。
2、的代码;程序合成器获得该任务的相关的(可能非编译的)代码片段,将它们合并在一起以形成代码段,针对该代码的上下文特化该代码段并将经特化的代码段插入该代码。例如,一对代码片段从搜索引擎获得,并且通过丢弃并非对该对代码片段的每一个代码片段共同的语句而被合并。在各示例中,使用搜索引擎排名、用户输入或频率来选择各对代码片段。在各实施例中,占位符代替所合并的片段中的变量名。一示例取得被开发的代码的句法树,并且用该句法树来特化代码段。(30)优先权数据(85)PCT国际申请进入国家阶段日2015.01.06(86)PCT国际申请的申请数据PCT/US2013/049410 2013.07.04(87)PCT。
3、国际申请的公布数据WO2014/008450 EN 2014.01.09(51)Int.Cl.(19)中华人民共和国国家知识产权局(12)发明专利申请权利要求书2页 说明书8页 附图6页(10)申请公布号 CN 104428750 A(43)申请公布日 2015.03.18CN 104428750 A1/2页21.一种方法,包括:获得表达编程任务的自然语言;获得包括源代码细节的上下文,其中所述自然语言位于所述源代码中;在处理器处,使用所述自然语言来获得与所述编程任务相关的多个源代码片段;从泛化器接收代码段,所述代码段已经通过将至少一对源代码片段合并成单个代码段并且抽走经合并的源代码片段的一个或。
4、多个细节而形成;以及将所述上下文和所述代码段发送至特化器并且从所述特化器接收经特化的代码段,所述经特化的代码段是根据所述上下文特化的代码段。2.如权利要求1所述的方法,其特征在于,包括:通过访问所述自然语言位于其中的源代码的句法树、以及访问所述自然语言相对于所述句法树的位置,来获得所述上下文。3.如权利要求1所述的方法,其特征在于,包括:通过将所述自然语言作为查询发送至至少一个搜索引擎并获得搜索结果的列表以及那些搜索结果的排名,来使用所述自然语言来获得所述多个源代码片段。4.如权利要求3所述的方法,其特征在于,包括:基于以下各项中的任一个或多个来从所述多个源代码片段中选择至少一对源代码片段:用。
5、户输入、搜索结果排名、搜索结果列表中的出现频率;以及将所选择的至少一对源代码片段发送至所述泛化器。5.如权利要求1所述的方法,其特征在于,包括:所述代码段已经通过为变量名以及为文字常数的内容引入占位符而形成。6.如权利要求1所述的方法,其特征在于,包括:所述代码段已经通过确定所述至少一对代码片段中的常数、变量和表达式之间的映射而形成。7.如权利要求1所述的方法,其特征在于,包括:将多个代码段发送至所述特化器并且接收多个经特化的代码段,每一个经特化的代码段已经根据所述上下文被特化;在被用于创建所述源代码的集成开发环境处呈现所述经特化的代码段;接收选择所述经特化的代码段之一的用户输入以及根据所述自。
6、然语言的位置在所述集成开发环境中将所述经特化的代码段插入所述源代码。8.如权利要求1所述的方法,其特征在于,包括:所述经特化的代码段已经通过找出所述代码段的占位符和所述源代码中存在的变量之间的绑定而形成,其中所述自然语言位于所述源代码中。9.一种方法,包括:接收与编程任务相关的至少一对源代码片段;通过确定这两个片段中的常数、变量和表达式之间的映射并且丢弃并非对这两个片段共同的语句,来将所述一对源代码片段合并为单个代码段。10.一种程序合成器,包括:处理器,所述处理器被安排成获得表达编程任务的自然语言并且获得包括源代码细节的上下文,其中所述自然语言位于所述源代码中;所述处理器被安排成使用所述自然。
7、语言来获得与所述编程任务相关的多个源代码片段;泛化器,所述泛化器被安排成通过将至少一对源代码片段合并成单个代码段并且抽走所合并的源代码片段的一个或多个细节,来形成代码段;以及权 利 要 求 书CN 104428750 A2/2页3特化器,所述特化器被安排成根据所述上下文来特化所述代码段。权 利 要 求 书CN 104428750 A1/8页4代码片段的泛化和 / 或特化背景技术0001 面临编程任务的开发者通常想要重用现有的代码和/或找出与如何处理特定编程任务有关的提示或建议。例如,程序员可以使用教科书、手册、数据库或其他源来找出与编程任务有关的现有代码。然而,这通常是耗时的,而且程序员一般需。
8、要能以正式、数学的方式来表达编程任务。0002 许多编程任务要求开发者与复杂的软件框架交互。软件框架可展示用于各种各样的编程任务的一个或多个大型的类型及函数库,编程任务诸如拆分串、查询数据库及其他。开发者不能详细记住这些库的应用编程接口,并且经常需要在主动创建代码时从各个源访问与这些应用编程接口有关的信息。0003 一旦程序员已经标识可能被重用的现有代码,程序员要适配该代码以使其适用于所关注的特定编程任务通常是困难且耗时的。而且,在适配过程期间通常引入差错。0004 以下描述的实施例不限于解决已知的自动化编程工具中的任一缺点或全部缺点的实现方式。发明内容0005 以下呈现了本公开的简要概述以便。
9、向读者提供基本理解。这一概述不是本公开的详尽概览,并且它不标识关键/重要元素或者划定说明书的范围。其唯一目的在于以简化形式呈现此处公开的概念的选集,作为稍候呈现的更详细描述的引言。0006 描述了代码片段的泛化和/或特化,例如作为软件开发者的工具的一部分。在一实施例中,开发者将表达编程任务的自然语言插入他或她正在集成开发环境中开发的代码;程序合成器获得该任务的相关代码片段(可能不必要编译),将它们合并并且泛化以形成一个或多个代码段(snippet),针对代码的上下文来特化该代码段,以及将经特化的代码段插入代码。例如,一对代码片段从搜索引擎获得,并且通过丢弃对于该对代码片段的每一个代码片段并非共。
10、用的语句而被合并。在各示例中,使用搜索引擎排名、用户输入或出现频率来选择各对代码片段。在各实施例中,占位符在经合并的片段中代替变量名。一示例采用被开发的代码的句法树,并且用它来特化代码段。0007 通过结合附图参考以下详细描述,可更易于领会并更好地理解许多附带特征。附图说明0008 根据附图阅读以下具体实施方式,将更好地理解本发明,附图中:0009 图1是由使用集成开发环境来工作的程序员所使用的个人计算机处的程序合成器的示意图;0010 图2是经由通信网络与各个实体通信的程序合成器的示意图;0011 图3是程序合成器处的方法的流程图;0012 图4是泛化器处的方法的流程图;0013 图5是特化。
11、器处的方法的流程图;说 明 书CN 104428750 A2/8页50014 图6说明了其中可以实现程序合成器的各实施例的示例性的基于计算的设备。0015 在各个附图中使用相同的附图标记来指代相同的部件。具体实施方式0016 下面结合附图提供的详细描述旨在作为本发明示例的描述,并不旨在表示可以构建或使用本发明示例的唯一形式。本描述阐述了本发明示例的功能,以及用于构建和操作本发明示例的步骤的序列。然而,可以通过不同的示例来实现相同或等效功能和序列。0017 图1是个人计算机118处的计算机实现的程序合成器的示意图,其中个人计算机118由使用集成开发环境108或向计算机程序员提供设施以供软件开发的。
12、其他软件应用来工作的程序员所使用。集成开发环境108和程序合成器106可以在个人计算机或其他计算设备处提供,并且可以或可以不彼此整合在一起。在参照图2讨论的其他示例中,程序合成器可以远离个人计算机118或其他计算设备。0018 使用集成开发环境108来工作的程序员写下源代码110并且使用注释在该代码中包括以自然语言表达的编程任务。程序合成器112能够取得以自然语言表达的编程任务并且找出执行该编程任务的现有源代码。这可以通过查询至少一个搜索引擎104或以任何其他适当方式来实现,该搜索引擎104具有包括相关的源代码片段102的项的索引。程序合成器使用泛化器114来泛化相关的代码片段,从而使其不专用。
13、于在其中创建它们的上下文。在这样做时,泛化器产生代码段。代码段是用于完成编程任务的经泛化的代码片段。代码段通过合并(或组合)和泛化两个或更多个初始源代码片段并且在合并和泛化过程期间抽走初始片段的一个或多个细节来形成。每一个初始代码片段用于完成该编程任务。程序合成器使用特化器116来适配代码段,使它们适用于程序员的代码110的特定上下文中并且随后能在注释的位置处将一个或多个经特化的代码段插入代码110。注释是程序合成器已知为指示以自然语言表达的编程任务的任何类型的符号或标记。集成开发环境也至少已知注释指示并非程序代码的内容。注释在代码110中的位置指示程序员想要插入用于实现编程任务的经特化代码段。
14、的位置。0019 例如,程序员在集成开发环境108处将以自然语言表达的注释和编程任务插入代码110。程序员可以将光标置于具有该注释的行,并且点击用户界面元素以指示要运行程序合成器功能。这仅仅是一个示例;可以使用其他类型的用户输入来指示要针对所选的注释运行程序合成器功能。程序合成器可以使用与注释相关联的自然语言作为对搜索引擎104的查询,以获得与完成编程任务相关的代码片段102的经排名的列表。泛化器114使用代码片段的经排名的列表来产生一个或多个代码段。与注释相关联的上下文由程序合成器获得并且被发送至特化器,该特化器使用该上下文以及代码段中的一个或多个来产生一个或多个经特化的代码段。程序合成器可。
15、以发送经特化的代码段以在集成开发环境处显示,并且任选地根据用户输入,基于注释的位置将经特化的代码段中的一个或多个插入代码110。0020 通过以此方式使用程序合成器,程序员能够在不离开集成开发环境的情况下,快速且简单地检索代码片段、将代码片段合并为经泛化的代码段、并且还特化各代码段并将它们插入特定的编程上下文中。开发者不需要执行复杂交互,诸如退出集成开发环境、访问搜索引擎、向搜索引擎键入查询、遍历结果、加载结果页面、浏览所加载的页面、提取相关的代码片段以及将相关的代码片段复制和适配回集成开发环境。说 明 书CN 104428750 A3/8页60021 通过将两个或更多个代码片段合并为一个代码。
16、段,降低了噪声,且合并过程能够抽走细节以使该代码段更为抽象并且去除了不相关的细节。搜索引擎所找到的代码片段通常显示出噪声,噪声诸如用哑值填充一些数据结构的已插入行、用于演示目的的伪控制台输出以及其他噪声。通过以抽走细节的方式合并代码片段,代码片段中的噪声得以降低。同样,通过合并代码片段,增加了获得很好地实现编程任务的代码段的可能性。例如,一个代码片段极少能完美地完成指定编程任务的工作,即使该代码片段是搜索引擎所找到的排名最高的代码片段。例如,排名最高的搜索结果可以包括几个代码片段,而其中仅有一个是相关的。同样,搜索引擎所找到的代码片段可能倾向于是惯用的,因为它们被开发者常用且被视为很好地用于特。
17、定的框架或编程语言中。搜索引擎可被安排成根据它们所使用的排名算法和索引方法的结果来找出惯用代码片段。0022 在面临编程任务时,开发者通常试图找到要使用的类型以及使用那些类型的惯用方式。通过使用程序合成器,开发者能够快速且简单地做到这一点。0023 图2是经由通信网络100与各个实体通信的程序合成器的示意图。与图1相对,程序合成器112不位于开发者的个人计算机118或其他计算设备处。程序合成器以任何合适的方式经由通信网络与泛化器114和特化器116通信。即,泛化器114和特化器116可以彼此分开并且可远离程序合成器112。为清楚起见,在图2中仅示出一个集成开发环境108,但可存在更多且经由通信。
18、网络100与程序合成器112通信的集成开发环境。0024 程序合成器112能够向搜索引擎104发送查询,搜索引擎104生成按照与查询的相关性排序的经排名的代码片段200。泛化器114将经排名的代码片段200中的两个或更多个合并以产生一个或多个代码段202。特化器116从程序合成器112接收上下文204,并且相对于该上下文204来特化代码段202中的一个或多个,以便针对该上下文生成至少一个经特化的代码段206。图2为清楚起见示出了一个搜索引擎104,但可以存在更多的搜索引擎。每个搜索引擎能够访问来自可经由通信网络100或其他方式访问的一个或多个源的代码片段102。0025 作为替换或补充,此处描。
19、述的功能可以至少部分地由一个或多个硬件逻辑组件来执行。例如,程序合成器、泛化器和特化器中的任一个或多个可以至少部分地使用硬件逻辑组件来实现。例如、但非限制,可以使用的硬件逻辑组件的说明性类型包括:现场可编程门阵列(FPGA)、程序专用集成电路(ASIC)、程序专用标准产品(ASSP)、片上系统(SOC)、复杂可编程逻辑器件(CPLD)。0026 图3是程序合成器处的方法的流程图。程序合成器接收或访问以自然语言表达的编程任务。例如,用户在集成开发环境处选择代码中的注释。程序合成器提取与该注释相关联的自然语言并且用它来形成查询。在以下给出的示例代码中,注释是“/?”,且表达为自然语言的编程任务是“。
20、逐行读取source”。在该示例中,代码以C#语言编写,并且按该语言的惯例被理解。然而,这仅仅是一个示例;可以使用其他编程语言。0027 集成开发环境处初始代码的示例:0028 Public static int WordCount(Stream source)0029 0030 Int result0;0031 /?逐行读取source说 明 书CN 104428750 A4/8页70032 Return result;0033 0034 程序合成器将查询(诸如“逐行读取source”)发送300至搜索引擎,并且接收302按与该查询的相关性排序的代码片段的列表。程序合成器将一对或多对代码片段。
21、发送304至泛化器。例如,它可以发送由搜索引擎标识的全部代码片段,或者根据排名、根据结果列表中的出现频率、根据用户输入或以然后其他方式选择的一对或多对所标识的代码片段。在一些示例中,用户可能能够查看代码片段并且选择供泛化器使用的那些代码片段。0035 程序合成器从泛化器接收一个或多个代码段306,并且从集成开发环境获得308上下文。例如,程序合成器访问集成开发环境处代码的句法树,并且在句法树中找到注释的位置。句法树和位置可以被用作上下文以发送至特化器。句法树是以编程语言编写的源代码的句法结构的树表示。树的根节点可以表示语句序列,树的内部节点可以表示诸如条件或其他表达式之类的构造,且树叶可以表示。
22、变量名或常数值。0036 程序合成器选择310代码段中的一个或多个,并且将所选择代码段中的一个或多个连同上下文发送312至特化器。程序合成器接收314已经针对该上下文特化的一个或多个代码段。它任选地将经特化的代码段呈现316在集成开发环境中。例如,通过在显示代码的图形用户界面处,在注释上呈现弹出式显示。在对于给定注释有两个或更多个经特化的代码段可用的情况下,用户可能能切换弹出式显示的内容。接收318选择经特化的代码段的用户输入,并且程序合成器根据注释的位置将所选择的经特化的代码段插入代码。0037 图4是泛化器处的方法的流程图。泛化器接收400一对代码片段并将它们合并成单个代码段。合并过程包括。
23、:丢弃402并非对于两个片段共同的语句,以及确定404两个片段中的常数、变量和表达式之间的映射。泛化器还为变量名以及为文字常数的内容引入406占位符。泛化器输出和/或存储408所得到的具有占位符的抽象代码块。该具有占位符的抽象代码块被称为“代码段(snippet)”。0038 现在参照一示例给出关于图4的方法的更多细节,其中以自然语言表达的编程任务是“在C#中,如何逐行读取source?”。这仅仅是一个示例,可以使用其他编程任务。0039 泛化器在图4的步骤400接收的一对代码片段可以如下:0040 代码片段10041 说 明 书CN 104428750 A5/8页80042 代码片段2:00。
24、43 0044 合并过程包括丢弃402并非对两个片段共同的语句。在以上代码片段1和2的示例中,片段2丢弃称为“count”的整数变量,该变量在片段1中没有对应物因此被丢弃。0045 合并过程包括确定404两个片段中的常数、变量和表达式之间的映射。例如,以上片段1中的变量“line”被映射到以上片段2中的变量“L”,因为该方法要求这些变量是同构的自变量和目标。0046 占位符可被引入406。这允许通过引入被称为“占位符”的新的变量名来抽走变量名和文字常数的内容。在以上示例代码片段1和2中,可以引入称为“$2”的占位符来代替“line”和“L”。占位符名称被选择成不干扰集成开发环境处的代码中其他地。
25、方使用的变量名。0047 泛化器从代码片段1和2创建的示例代码段为:0048 从代码片段1和2产生的代码片段0049 说 明 书CN 104428750 A6/8页90050 可以看到,并非对片段1和2两者共同的语句已被丢弃,并且片段1中变量“line”已被映射到片段2中的变量“L”且由占位符“$2”代替。0051 现在将参照以上关于图4讨论的相同示例,给出图5的方法的更多细节。这仅仅是一个示例,可以使用其他编程任务。特化器接收500上下文以及以上给出的从代码片段1和2产生的代码段。上下文可以包括句法树以及在以上参照图3给出的集成开发环境处初始代码示例的句法树中注释“/?”的位置。泛化器502。
26、找出502代码段的占位符和初始代码的各变量之间的最可能绑定。在该示例中,代码段的$1被绑定至初始代码上下文的“source”。特化器还添加504保持未绑定的任何占位符的声明。例如,代码段中的占位符$2成为经特化的代码片段中的S2:0052 代码段到初始代码的特化的示例:0053 0054 图6示出示例性的基于计算的设备600的各组件,该基于计算的设备可被实现为任何形式的计算和/或电子设备并且其中可实现程序合成器、泛化器或特化器的各实施例。0055 基于计算的设备600包括一个或多个处理器602,这些处理器可以是微处理器、控制器或用于处理计算机可执行指令以控制设备的操作来泛化和/或特化代码片段的。
27、任何其他合适类型的处理器。在一些示例中,例如在使用片上系统架构的示例中,处理器602可以包括一个或多个固定功能块(亦称加速器),这些块以硬件(而非软件或固件)来实现图3、4和5中的任一个的方法的一部分。可以在基于计算的设备处提供包括操作系统604或说 明 书CN 104428750 A7/8页10任何其他合适的平台软件的平台软件以使得能够在该设备上执行应用软件。例如,基于计算的设备可包括集成开发环境608、安排成执行图3的方法的程序合成器606、安排成执行图4的方法的泛化器610、以及安排成执行图5的方法的特化器622。基于计算的设备还可包括用于储存代码段、搜索结果、搜索结果排名、用户偏好、经。
28、特化的代码段以及其他数据的数据存储624。0056 可以使用可由基于计算的设备600访问的任何计算机可读介质来提供计算机可执行指令。计算机可读介质可以包括例如诸如存储器600等计算机存储介质和通信介质。诸如存储器600等计算机存储介质包括以用于存储如计算机可读指令、数据结构、程序模块或其他数据等信息的任何方法或技术实现的易失性和非易失性、可移动和不可移动介质。计算机存储介质包括但不限于,RAM、ROM、EPROM、EEPROM、闪存或其他存储器技术、CD-ROM、数字多功能盘(DVD)或其他光存储、磁带盒、磁带、磁盘存储或其他磁存储设备,或者可用于存储信息以供计算设备访问的任何其他非传输介质。。
29、相反,通信介质可以以诸如载波或其他传输机制等已调制数据信号来体现计算机可读指令、数据结构、程序模块或者其他数据。如本文所定义的,计算机存储介质不包括通信介质。因此,计算机存储介质不应被解释为本质上是传播信号。传播信号可存在于计算机存储介质中,但是传播信号本身不是计算机存储介质的示例。虽然在基于计算的设备600中示出了计算机存储介质(存储器612),然而应当理解,该存储可以是分布式的或位于远处并经由网络或其他通信链路(例如,使用通信接口614)来访问。0057 基于计算的设备600还包括输入/输出控制器616,该输入/输出控制器被安排成向显示设备618输出显示信息,该显示设备可与基于计算的设备6。
30、00分开或集成。该显示信息可以提供图形用户界面。输入/输出控制器616还被安排成接收并处理来自一个或多个设备的输入,如用户输入设备620(例如,鼠标、键盘、相机、话筒、或其他传感器)。在一些示例中,用户输入设备620可以检测语音输入、用户姿势或其他用户动作,并且可以提供自然用户界面(NUI)。这一用户输入可被用来输入命令、表达为自然语言的编程任务,选择经特化的代码段,以及用于其他目的,包括控制程序合成器、泛化器和特化器中的任一个。在一实施例中,如果显示设备618是触敏显示设备,那么它还可担当用户输入设备620。输入/输出控制器616还可向除显示设备之外的设备输出数据,例如,本地连接的打印设备。。
31、0058 输入/输出控制器616、显示设备618以及可任选地用户输入设备620可包括使用户能够按自然的、免受诸如鼠标、键盘、遥控器等输入设备所施加的人工约束的方式与基于计算的设备交互的NUI技术。可以提供的NUI技术的示例包括但不限于依赖于语音和/或话音识别、触摸和/或指示笔识别(触敏显示器)、屏幕上和屏幕附近的姿势识别、空中姿势、头部和眼睛跟踪、语音和话音、视觉、触摸、姿势、以及机器智能的那些技术。可被使用NUI技术的其他示例包括意图和目的理解系统,使用深度相机(如立体相机系统、红外相机系统、rgb相机系统、以及这些的组合)的运动姿势检测系统,使用加速度计/陀螺仪的运动姿势检测,面部识别,3D显示,头部、眼睛和注视跟踪,沉浸式增强现实和虚拟现实系统,以及用于使用电场传感电极(EEG和相关方法)的感测大脑活动的技术。0059 此处所使用的术语“计算机”或“基于计算的设备”是指带有处理能力以便它可以执行指令的任何设备。本领域技术人员可以理解,这样的处理能力被结合到许多不同设备,并且因此术语每个“计算机”和“基于计算的设备”包括个人电脑、服务器、移动电话(包括说 明 书CN 104428750 A10。