CN115686467A - 动态语言中的类型推断 - Google Patents
动态语言中的类型推断 Download PDFInfo
- Publication number
- CN115686467A CN115686467A CN202210858709.XA CN202210858709A CN115686467A CN 115686467 A CN115686467 A CN 115686467A CN 202210858709 A CN202210858709 A CN 202210858709A CN 115686467 A CN115686467 A CN 115686467A
- Authority
- CN
- China
- Prior art keywords
- programming language
- dynamic programming
- methods
- type
- computer
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/31—Programming languages or programming paradigms
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/75—Structural analysis for program understanding
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/90—Details of database functions independent of the retrieved data types
- G06F16/901—Indexing; Data structures therefor; Storage structures
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/90—Details of database functions independent of the retrieved data types
- G06F16/903—Querying
- G06F16/90335—Query processing
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/43—Checking; Contextual analysis
- G06F8/436—Semantic checking
- G06F8/437—Type checking
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/73—Program documentation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/08—Learning methods
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N5/00—Computing arrangements using knowledge-based models
- G06N5/04—Inference or reasoning models
Abstract
本发明的一些实施例涉及动态语言中的类型推断。为了改进使用动态编程语言对计算机进行编程的技术过程,通过对动态编程语言中的文档库执行信息检索来生成将动态编程语言的类型映射到对应的函数和方法的训练数据的第一部分,和/或通过对以动态编程语言编写的多个预先存在的程序执行数据流分析来生成将程序变量映射到对应的函数和方法的训练数据的第二部分。在训练数据的第一部分和/或训练数据的第二部分上训练神经网络以推断动态编程语言中的未知类型。用经训练的神经网络进行推断以推断未知类型。基于经推断的未知类型来促进动态编程语言中的编程。可选地,执行所得程序。
Description
背景技术
本发明涉及电气、电子和计算机领域,并且更具体地涉及动态编程语言、机器学习等。
动态编程语言是一类在运行时执行许多常见编程行为的高级编程语言,静态编程语言在编译期间执行这些行为。这样的行为包括例如通过添加新代码、通过扩展对象和定义、或通过修改类型系统来对程序进行扩展。
许多动态编程语言不强制执行任何种类的类型。然而,类型推断对于防止错误、提供更好的程序理解、通过代码生成提供更好的自动化等是重要的。
发明内容
本发明的原理提供用于动态语言中的类型推断的技术。在一个方面,用于改进使用动态编程语言对计算机进行编程的技术过程的示例性方法包括:通过对动态编程语言的文档库执行信息检索,生成训练数据的第一部分,该训练数据的第一部分将动态编程语言的类型映射到动态编程语言的对应的函数和方法;在训练数据的第一部分上训练神经网络,以推断动态编程语言的未知类型;通过基于对应的函数和方法的存在来推断未知类型,用经训练的神经网络执行推断,以推断针对以动态编程语言编写的代码的样本中的程序变量的未知类型;以及基于经推断的未知类型来促进动态编程语言中的编程。
在另一方面,用于改进使用动态编程语言对计算机进行编程的技术过程的另一示例性方法包括:通过对以该动态编程语言编写的多个预先存在的程序进行数据流分析来生成训练数据,该训练数据将该动态编程语言中的类型映射到该动态编程语言中的相应的函数和方法;在至少训练数据上训练神经网络,以推断动态编程语言中的未知类型;基于程序变量映射减少在推断期间要搜索的类型的数目;用经训练的神经网络执行推断,以推断未知类型;以及基于经推断的未知类型来促进动态编程语言中的编程。
在另一方面,一个示例性计算机包括一个体现计算机可执行指令的存储器;以及至少一个处理器,该至少一个处理器被耦合到该存储器上并且由这些计算机可执行指令可操作以便执行一种方法,该方法用于改进使用动态编程语言对该计算机进行编程的技术过程。该方法包括:实例化神经网络和搜索引擎;使用至少搜索引擎,通过对动态编程语言中的文档库执行信息检索,生成训练数据的第一部分,该的训练数据的第一部分将动态编程语言中的类型映射到动态编程语言中的对应的函数和方法;在训练数据的第一部分上训练神经网络,以推断动态编程语言的未知类型;通过基于对应的函数和方法的存在来推断未知类型,用经训练的神经网络执行推断,以推断针对以动态编程语言编写的代码的样本中的程序变量的未知类型;以及基于经推断的未知类型来促进动态编程语言中的编程。
在另一方面,另一示例性计算机包括体现计算机可执行指令的存储器;以及至少一个处理器,该至少一个处理器被耦合到该存储器上并且由这些计算机可执行指令可操作以便执行一种用于改进使用动态编程语言对该计算机进行编程的技术过程的方法。该方法包括:示例化神经网络和静态软件分析工具;使用至少静态软件分析工具,通过对以动态编程语言编写的多个预先存在的程序执行数据流分析,生成训练数据,该训练数据将动态编程语言中的程序变量映射到动态编程语言中的对应的函数和方法;在至少训练数据上训练神经网络,以推断动态编程语言的未知类型;基于程序变量映射减少在推断期间要搜索的类型的数目;用经训练的神经网络执行推断,以推断未知类型;以及基于经推断的未知类型来促进动态编程语言中的编程。
如本文使用的,“促进”动作包括执行该动作、使该动作更容易、帮助执行该动作、或使得该动作被执行。因此,作为示例而非限制,在一个处理器上执行的指令可以通过发送适当的数据或命令来促使或帮助执行动作来促进由在远程处理器上执行的指令执行的动作。为了避免疑问,在动作方通过除了执行动作之外的动作来促进该动作的情况下,该动作仍然由一些实体或实体的组合执行。
本发明的一个或多个实施例或其元素可以用计算机程序产品的形式来实现,该计算机程序产品包括计算机可读存储介质,该计算机可读存储介质具有用于执行所指示的方法步骤的计算机可用程序代码。此外,本发明的一个或多个实施例或其元素能够以包括存储器和至少一个处理器的系统(或装置)的形式实现,并且至少一个处理器被耦合到存储器并且可操作以执行示例性方法步骤。更还地,在另一方面,本发明的一个或多个实施例或其元素能够以用于执行本文描述的方法步骤中的一个或多个的装置的形式来实现;该装置可以包括(i)(多个)硬件模块、(ii)存储在计算机可读存储介质(或多个这样的介质)中并在硬件处理器上实现的(多个)软件模块、或者(iii)(i)和(ii)的组合;任意(i)至(iii)实现本文中阐述的特定技术。
本发明的技术可以提供实质上有益的技术效果。一些实施例可能不具有这些潜在优点,并且这些潜在优点不一定是所有实施例所需要的。
例如,一个或多个实施例提供以下一项或多项:
通过大规模地为动态编程语言提供相当高质量的标记数据来改进动态编程语言中的编程的技术过程,具有比静态类型检验器更好的性能;
高质量的标记数据,实现更好的概率类型推断系统。
从以下结合附图阅读的对本发明的示例性说明性的实施例的详细描述中,本发明的这些和其他特征和优点将变得明显。
附图说明
图1示出了根据现有技术的类型预测;
图2呈现了使用本发明的一个方面分析的示例性代码和文档;
图3示出了别名化到不同类的类的示例,可以使用本发明的一个方面成功地分析这些示例;
图4描述了用于测试本发明的实施例的数据集的前25个模块中的类的分布;
图5呈现了根据本发明的一个方面的文档字符串提取算法;
图6示出了根据本发明的一个方面的针对图2中的第一脚本的数据流;
图7示出了根据本发明的一个方面的针对图2中的第一脚本的内部表示;
图8示出了共享与本发明的鸭式类型(duck typing)方面有关的少量方法的示例;
图9、图10、图11、图12、图13、图14、图15、和图16示出了使用本发明的示例性实施例实现的示例性测试结果;
图17是比较两种现有技术和本发明的示例性实施例的预测类型的百分比的柱状图;
图18是类似于图1的视图,但是示出了使用本发明的示例性实施例获得的类型预测;
图19示出了由在本发明的多个方面中使用的文档字符串和统计分析技术推断的类型的概述;
图20示出了根据本发明的一个方面的图19的两种方法推断类型的顶部模块的分布;
图21和图22示出了根据本发明的方面的示例性类型推断步骤;
图23描绘了根据本发明的实施例的云计算环境;
图24描绘了根据本发明的一个实施方式的抽象模型层;以及
图25描绘了一种计算机系统,该计算机系统可以用于实现本发明的一个或多个方面和/或元件,还表示根据本发明的一个实施例的云计算节点。
具体实施方式
近来,动态类型化的语言,诸如语言(美国俄勒冈州PYTHON软件基金会比弗顿的注册商标),已经获得了前所未有的流行。PYTHON语言对于本领域技术人员来说是众所周知的。虽然这些语言缓解了对强制性类型注释的需要,但是类型仍然在程序理解和防止运行时错误方面起到相关作用。有吸引力的选择是自动推断类型以获得静态保证而无需写入类型。现有的推断技术主要依赖于静态类型工具,例如PyType,用于直接类型推断。最近,已经提出了神经类型推断。然而,神经类型推断是数据匮乏的,并且取决于基于静态类型来收集经标记的数据。然而,这样的工具(即,诸如PyType的静态类型工具)在推断用户定义的类型方面是差的。此外,开发者在这些语言中的类型注释相当稀疏。一个或多个实施例方便地提供用于使用以下各项来生成高质量类型的新颖技术:1)在文档良好的库上工作以提取类型的信息检索技术,和/或2)通过分析大型程序储存库的使用模式。我们的实验结果显示,这些技术与现有技术相比更精确,解决了静态工具的弱点,和/或对于通过机器学习方法生成用于类型推断的大型的、标记的数据集可能是有用的。与处于0.06的静态类型工具相比,对于示例性实施例,F1得分(精度和召回的谐波平均值)是0.52-0.58,并且在我们的实验中,我们使用它们针对超过700个模块生成超过37000个类型。应注意,如本文所使用的,“文档良好的”库是存在自然语言描述如何在内部使用不同方法和类的库。该文档通常出现在代码本身内部,以定义函数/类的目标以及对应的输入/输出格式。
一个或多个实施例在例如动态类型化语言、类型推断、静态分析、PYTHON、大代码、挖掘软件储存库等中找到实际应用。
如所指出的,动态类型化语言(如PYTHON)已经变得非常流行。一个原因是由于人工智能(AI)的前瞻性增长以及为AI框架广泛采用PYTHON。类似于许多动态编程语言,PYTHON不静态地强制执行类型,而是仅在运行时发现错误,这是流行的,因为它允许程序员快速地构建原型。然而,类型对于程序理解、对于早期发现错误、以及对于提高程序正确性是有用的。PYTHON引入了可选类型声明,但是到目前为止很少采用。此外,迄今为止,传统类型推断被证明在很大程度上是无效的。如图1所示,其描述了针对408个储存库的数据集的PyType预测,当前的技术经常产生“任意”作为类型,其等同于无信息。此外,它们产生的类型中只有14%是用户定义的类型或库类型,这在用户代码中往往更加普遍。
在这种情况下,机器学习已经成为一种有希望的方法;最近的系统使用神经网络执行类型推断。然而,学习方法需要大量类型注释的代码用于训练,其当前不存在。事实上,神经系统当前依赖于诸如PyType和Mypy软件(可从Mypy项目获得)的工具或用户指定的注释作为其黄金标准。该标记数据的偏差会影响所构建模型的质量,并且在用作黄金标准时可能会提供对准确性的误导性估计。
一个或多个实施例提供了用于生成高质量类型的方法的技术,这些方法可以充当针对饥饿匮乏的机器学习方法的标记的数据。虽然机器学习技术对一般类型推断的问题有希望,但是现有技术的当前状态没有提供足够的机制来解决获得良好质量的标记的数据的问题。有利地,一个或多个实施例(a)从文档良好的框架代码中提取高质量类型以推断类型,和/或(b)从它们在可用于分析的代码中的使用中提取高质量类型。一个或多个实施例有利地产生更好的数据集以用于构建改进的概率类型推断系统。
一个或多个实施例开始于框架数据,因为它既是频繁使用的,也是文档良好的。为了从文档中推断类型,一个或多个实施例使用来自信息检索的技术来收集在文档中指定的可能类型,并将它们映射到使用本发明的方面进行索引的类集合。为了从使用中推断类型,一个或多个实施例从大量(例如,数百万)的程序中挖掘使用,并且基于程序分析探索鸭式类型。鸭式类型指的是这样的想法:如果类包含在给定对象上调用的所有方法,则它是针对该对象的类型的可能候选者。虽然鸭式类型的想法本身不是新的,但是一个或多个实施例以一种新颖的方式应用它。具体地,一个或多个实施例分析代码文件的大(例如,数百万)储存库,并且跨这些文件组合相同库的使用。当一个或多个实施例分析各个程序时,一个或多个实施例观察数据流如何跨所有程序从公共API(应用编程接口)调用到由该调用返回的对象。鸭式类型方法有利地允许推断用户定义的类型;现有技术的鸭式类型技术通常不能推断原语或内置类型,因为它们不对应于已知的类。在一个或多个实施例中,来自文档的类型推断有利地允许对内置函数和原语做得更好。我们已经发现,通过组合这些技术,可以推断出更多种类型,并且弥补每种技术中的弱点。
一个或多个实施例有利地解决了以下中的一项或多项:
使用这两种技术来产生足够精确的类型以提供高质量的标记数据;
使用这两种技术来产生解决工具的一些弱点的类型(诸如Pytype),这些工具当前是用于获得PYTHON中的标记类型推断数据的现有技术;
使用这两种技术来产生提供非重叠的类型集合的类型,从而使得这两种方法的联合增大了所标记的集合的大小。
我们的实验表明,在一个或多个示例性实施例中,这两种技术在756个PYTHON模块中产生超过37000种方法和函数函数的类型。在我们的实验中,我们将根据本发明的方面的类型推断技术的精度和召回与从动态技术推断的类型集合、以及针对超过200个函数的样本大小的手动注释进行比较。与PyType(0.06)相比,对于静态分析和文档推断,我们的F1评分为0.52和0.58。注意,最高水准的的神经预测系统(诸如TypeWriter)基于类型注释根据经训练的模型实现0.64。一个或多个实施例是完全无监督的,并且有利地产生将有助于建立用于类型推断的更好的神经模型的经标记的数据。
示例
图2以用于read_csv的代码和文档示例的形式示出了用于API调用的标记类型的大规模生成背后的相关想法。在该示例中,脚本1(标记为101)调用函数,以从pandas库中读取pandas.DataFrame对象,然后将返回值传递到函数中,其中对象被用作针对drop和drop_na调用的接收器。该示例中的脚本2(标记为103)在返回的对象上的read_csv调用与to_csv调用之间具有更直接的关系。从跨多个脚本鸭式类型的视角可见,从read_csv调用返回的对象的类型应该支持drop、drop_na、head、和to_csv。从API的类的类型定义中,pandas.DataFrame是一个候选类。图2在105示出了与处的read_csv函数相关联的文档,并且可以看出该文档没有正式到足以清晰地表示所提及的类,因此额外的处理适合于推断可能的类型。类被非正式地提及,没有提及它们的完全限定的名称。它们被称为使用短语(诸如DataFrame或者文本解析器)的自然语言,因此应当提供一些机制以将这里提到的两个类别解析成它们的完全限定的名称(例如,pandas.core.frame.DataFrame)。一个或多个实施例使用来自信息检索的简单技术来从文档中找到潜在类型。
数据集
在我们的实验中,我们使用包括超过一百万公开可获得的PYTHON程序的数据集。为了收集相关类和方法,标识在这些PYTHON程序中导入的前500个模块。对于这些模块中的每个模块,尝试以编程方式创建虚拟环境,使用pip安装模块,然后使用PYTHON检查API来收集所加载的模块中的所有类,以及它们的方法和相关文档字符串。PYTHON自我测试API不仅提供来自加载的模块的类;它们从在加载的模块的依存树中的模块收集类。此外,PYTHON检查API的要求是,它基于模块的依赖性将别名化的许多类指定为相同类。图3的表格(别名为不同类的类的示例)示出了这样的示例——来自statsmodels的前两个DataFrame类实际上映射到完全不同的模块pandas中的类。此外,由于PYTHON封装,来自模块内的多个PYTHON类以不同的限定名称出现(如bokeh类所示)。
从500个模块的起始种子集,获得1017个模块、167872个类和164134个函数的结果集。为了净化数据集,由在虚拟环境中加载的检查API返回的167872个类中的每个类,使用由API返回的名称来加载该类,然后在打印该类的字符串表示时记录其实际名称。类到它们实际取别名的类的映射被派生,如图3的表所示,其在别名化之后产生92277个唯一类。采用类似方法来对函数名取别名;加载164134个函数名,这导致对91818个函数的别名化。
图4(针对前25个模块的类分布)描述了前25个模块中的类的分布。可见,模块覆盖了不同的功能集,包括从可视化库(例如,plotly)到云管理库(例如,kubernetes)到数据科学库(例如,sklearn和pandas)的库。总共存在具有文档字符串的26800个类方法和53441个函数。
利用文档字符串的类型推断
类型的提取:如图2所示,API库中的文档通常是结构良好的,并且倾向于使用丰富结构化文本来编写,以使得能够从包(诸如Sphinx)生成文档。一个相关的问题是如何利用信息检索技术来从这样的文档推断类型信息。在我们的实验中,我们专注于返回,以示出示例性方法,如在图5中的算法1(文档字符串提取算法)中所描述的。给定模块集合l,将在模块中声明的所有函数和方法收集到l f。对于每个f,将其类(如果其是方法)收集到集合C,并且获得对应的文档字符串r。在我们的实验中,我们使用PYTHON中的sphinx库来将文档字符串解析成重组文本。在我们的示例中,这从整个方法文档字符串中剥离‘返回’部分,因此获得图2中所示的文本。该结构化文本r以非正式的方式包含每个类和函数的返回值;例如,在图2中,规定返回值是DataFrame或TextParser。为了推断限定的类型,为每个函数或方法创建‘文档’d,设置函数的字段和内容,并且在搜索和分析引擎文本索引中索引d。在所有模块的检查结束时,已经将每种方法的返回类型添加到索引中。然后,循环通过C中的所有类别,并且在搜索和分析引擎索引中搜索具有在它们的返回文本中提及的该类的所有d文档。每个d具有经推断的类型集,其中,将完全限定的类名c添加到函数的返回类型中。如果d具有经推断的类型字段集,那么在提取过程结束时的索引中的每个d是基于文档字符串推断的类型的函数。
清理:因为具有这种机制的类型推断可能是相当有噪音的,所以在我们的实验中,我们采用后处理步骤来过滤出错误的注释。具体地,对于从以上步骤返回的方法及其经推断的类型列表,执行以下步骤:
使用类到它们被实际被别名化的类的映射(参见图3的表),每个返回用户定义的类型被映射到其正确的别名。例如,类pandas.DataFrame被映射到pandas.core.frame.DataFrame。注意,这两种形式在PYTHON中都是有效的,并且实际上,用户代码将频繁地包含大pandas的导入。DataFrame,但是在运行时解释器将返回大pandas.core.frame.DataFrame。
基于检查API提供的类,移除不能被解析为任何有效类型的任意类型,但是当尝试在运行时加载它们时失败,因为它们不存在。
当存在作为针对相同库内的类型的候选者的返回类型的类时,从不同库中移除用户定义的类型。该最后一种方法基于启发式法方法:如果具有相同名称的类存在于相同库中,则比来自另一库的具有相同名称的类更可能是返回的候选者。注意,用于类型推断的现有系统(如TypeWriter)忽略该类的完全限定名称,这是有问题的,因为我们在实验中将此视为问题。
如果内置或原语匹配,则移除所有其他类。此步骤适合于避免与具有与内置或原语(例如,Dict)相同的名称但显然不可能匹配的类的匹配。
利用分析的类型推断
用于推断类型的方法是在数百万个脚本上执行数据流,并且观察在由特定方法调用返回的对象上调用什么方法。一个或多个实施例提供了被引入到静态分析基础结构中的新的变化集合,以支持该类型的分析和/或以改进的方式执行鸭式类型的技术。
扩展分析方法:为了执行该数据流,在我们的实验中,分析的范围被局限于在我们的样本集中的每个PYTHON文件的等级。脚本中的每个方法以及脚本本身被用作起始点,以确保脚本中的代码的最大覆盖范围。示例性分析是过程间的,使得如图2中的101所示,数据流被跟随到过程message_data中以发现pandas.read_csv的返回值具有dropna和drop两者对其调用,接着是调用被条件护卫的headhead。
技术人员将认识到,PYTHON脚本通常不是自含式的,而是包括库的导入和API调用、或具有包含在其他文件中的代码的用户模块。为了在这样的环境下对大量文件执行分析,我们发现重要的是不假设将有可能为这样的调用创建大量存根,或者库代码将可服从分析。一个或多个实施例提供被称为‘龟标’的机制以处理对不是脚本的一部分的函数的这样的导入或调用。在这个示例性方面,来自API调用的所有返回被表示为单个“龟标”类型的示例(由库返回的对象的最小模型),并且对这样的对象的所有调用返回该类型的新实例。类似地,对那些对象的属性的访问返回对象本身。这可以在公共分析框架和形式中表达,其中定制了分析的三个方面。就应该针对任何分析框架定制的分析抽象而言,考虑这三个。
总体上,存在适合于分析框架以允许程序的基于龟标的分析的三个关键改变:
所需API的导入应当由龟标创建替代。表示导入调用的方式将在分析框架之间变化;在示例性实现中,导入调用被建模为对返回“龟标”类型的新分配的对象的合成函数的调用。使用调用点灵敏度(即,针对每个调用的单独分析)来分析此函数,从而使得每个API导入创建不同的龟标对象。在图2中,导入read_csv,所以由龟标表示在其上返回调用。
属性读取的语义应当被改变,从而使得龟标的任何属性读取返回容器对象本身。这可以通过对龟标类型的对象执行字段不敏感分析(即,通过用单个属性对那些对象的所有属性建模)来建模。当创建龟标对象时,将龟标对象分配给它的单个属性。
函数调用的语义应当被增强,使得对龟标类型的对象的任何调用是对返回新龟标对象的合成函数的调用。对于函数调用,每个函数可简单地用返回新龟标的相同合成函数来建模。在PYTHON中,诸如pd.read_csv的调用首先包括属性读取,然后包括调用。由于在龟标上读取的属性已经返回相同的对象,所以函数调用的合成模型对于方法调用也是足够的。
扩展分析框架执行标准组合调用图构造和指针分析,其针对每个调用点计算可以调用什么函数,并且针对每个值计算其可以保持什么对象。分析在根函数处开始,分析每个指令,将在调用点处发现的函数添加到工作队列中。为了使分析的工作更加具体,将IR(内部表示)用于图2的脚本101。代码被组织为诸如属性读取的操作的基本块(在图7中表示为BB0、BB1等)的序列,并且所有值均为静态单分配形式。当分析脚本时,通过逐步遍历分析所做的内容,来提供分析如何针对龟标工作的图示。图6示出了图2中的脚本1 101的数据流。在图6中,环1、2、3、4、5表示龟标,并且箭头表示它们之间的数据流。在环1处,“pandas”是未知的;逻辑流向下一个环。对于dropna、drop、和head,显示了pandasread_csv的结果。接收器0意味着每个环潜在地具有多个自变量,如函数调用。Dropna叫做2(pandas.read_csv),从而成为接收者。图7示出了图2中的脚本1 101的内部表示,在该内部表示上计算分析。“invokeFunction”表示龟标调用;“getfield”表示读取;“putfield”是写入;第2行中的“invokestatic”是用于表示导入的特殊类型的函数调用。“BB”是指基本块并且“gt”确定一个值是否大于另一个值。鉴于本文的教导,技术人员将基于她或他对编译器的理解来理解图7中的IR。
指令2是对应于图2的位置101的行1的导入。该指令将所导入的脚本分配给用龟标t1t1表示的v40。
指令3至5从第3至8行创建内部函数message_data。函数在分析中被表示为对象,因为它们可以是第一类。
指令6从v40中读取属性read_csv,该属性持有导入的pandas脚本,并且将其分配给v47。这也是t1。
指令7作为函数调用v47。由于v47持有t1,并且对龟标的函数调用的语义是创建新的龟标,将新的龟标t2分配给v46。
其余指令大部分类似,除了一个。
指令9调用v44,v44是message_data。这不是龟标,因此将针对该函数的代码添加到分析的工作队列。v46作为自变量传递,对应于传递read_csv的结果。
存在未通过该代码片段示出的分析的一个方面:在图2的位置101的第12行,将由read_csv和最终message_data返回的龟标传递内置len函数调用。由于分析没有做出关于龟标的含义的假设,因此对原语的调用被视为简单地返回用作自变量的任何龟标。
鸭式类型:如上所述,在一个或多个实施例中,分析既不是全面的也不是完全的。用于鸭式类型的传统方法要求针对从方法调用M返回的每个对象O,观察O(被称为F)上的方法调用集合。F应在给定的类别C中定义,以便推断C是返回类型M。因为在分析中可能存在不精确性,所以在F中可能存在不正确的方法。例如,在图2中,对head的调用在if之下,所以它可能不被调用。即使小表返回不支持head的类型,该代码也将起作用。为了处理这种情形,通过计算F∪D的大小进行近似鸭式类型,其中D是针对C定义的所有方法的集合。类型推断是正确的可能性受两个因素支配:(a)F∪D的大小,以及(b)对于给定方法返回值而言是可能的类型的类的数目。随着(a)增加,类型推断的置信度增加。然而,(b)中的少量类与(a)中的少量共享方法组合有时仍可暗示有效推断。这种情况的示例在图8的表中示出(共享少量方法的示例),其中,例如,发现pandas.array正确地返回pandas.core.arrays.base.ExtensionArray,并且实际上pandas.core.arrays.sparse.array.SparseArray是pandas.core.arrays.base.ExtensionArray的子类。
分析净化:我们已经发现大量假类型经常由代码的初始鸭类型引起,并且在一个或多个实施例中,我们在一系列步骤中过滤它们:
由于在一个或多个实施例中鸭式类型不是完全精确的,在一个或多个示例中的第一步骤是将候选类型过滤为与在代码中所调用的最大数目的方法相匹配的那些候选类型。
经常存在许多具体类型,这些类型共享也存在于该类型集合中的公共超类型。在这种情况下,移除子类型,因为它们被超类型覆盖。
有时集合中的大部分类型共享本身不在该集合中的超类型S。在这种情况下,移除不是S的子类型的类型,因为它们经常归因于分析不精确性。
使用函数和类的列表来移除事实上是模块但是由于导入可以是任何东西的事实而显得模糊的项目。
消除如之前那样无效的类和函数,并且使用它们的别名。
实验评价
标记类型的精度──针对动态类型的评估:为了开发用于评估的黄金标准,在我们的实验中,我们通过观察它们的运行时类型来收集类型集合。实验针对来自408个储存库集合的5个储存库,这些储存库(a)将pytest用于单元测试,以及(b)似乎相对容易地建立而没有对数据库、服务器等的附加依赖性集合。对于在测试中通过pytest调用的每个函数,插入包装器函数,其将在返回之前记录其返回类型。在pytest和pytest固定装置中利用所谓的“猴子补丁”(即,本地扩展或修改支持系统软件(仅影响程序的运行实例))以插入包装器。技术人员将熟悉来自例如可从PyTest dot org获得的“Monkeypadding/Mockingmodules and environments”(“dot”替换“.”以避免包括浏览器可执行代码)、HolgerKrekel和pytest-dev团队(2015-2020)的猴子补丁。图9的表格示出了在每个包中通过或失败的测试的数目(通过和失败的测试的数目以及针对每个模块推断的方法的数目的总结)。通过猴子补丁收集的类型总是健全的,但不一定是完全的。收集了可用的类型的2284种不同方法。
每种方法经常用多种类型来注释。在可能的情况下,基于文档和运行代码,手动检查一些案例并增强动态类型集。在检测库时应采取适当的谨慎措施。
图10的表格(关于所发现的动态类型的统计)示出了运行以获得从动态类型中收集的2284种方法的测试的总数。对于每种类型推断技术,匹配的数目是相当低的,但是调查显示这是因为从运行时频繁地接收到丢弃类名(例如,使用dill获得的)的函数的方法名。在这三种方法中,从文档字符串提取检索大多数函数的类型。接着分析,接着是PyType。当与分析组合时,文档字符串产生针对203个方法的返回类型,这是可用于动态信息的方法的9%。
图11的表格(基于文档字符串和分析的类型推断对PyType的精度)示出了PyType的精度和召回的结果,并且单独地示出了基于文档字符串的类型推断和基于静态分析和鸭式类型的类型推断的结果。PyType的F1分值非常出人意料地低(.067),但是当类型是用户定义的类型时,这个结果与现有技术中报道的%准确度一致。相比之下,基于文档字符串的类型推断的F1分数是0.587,并且静态分析是0.517;相对于PyType的显著改进。
标记类型的精度──类构造器的评估:动态类型是分析类型推断的精度的一种方法。一个或多个实施例利用PYTHON语言的特征,作为对于基于静态分析的类型推断的精度的一种健全性测试。在PYTHON中,如在许多动态语言中,构造器仅仅是另一方法。该事实用于产生黄金标准的方法,对于该方法,返回类型是已知的。所有92277个类是从检查中收集的,并且被询问它们的构造函数是否被示例性实施例正确地推断以用于使用静态分析的类型推断。针对构造函数的召回是0.0459,表明在实践中仅使用了小比例的类。其中,基于静态分析的鸭式类型对于4236个类型产生了正确的类型,并且对于130个类型产生了不正确的值,精度为0.97。错误是由于收集类定义中的错误。例如,QtNetwork.QLocalSocket是我们在使用中看到的类,并且其具有在代码中调用它的方法waitForConnected。然而,在检查输出中,未发现方法waitForConnected,并且因此它与任何类无关。注意,通常,来自PYTHON的检查API具有若干不准确性,这向处理添加了噪声。然而,具有类构造器的测试建议分析和鸭式类型方法确实起作用。
标记类型的精度──手动注释:为了进一步评估两种技术的类型推断,为每个技术选择方法的随机样本,并且尝试手动评估返回类型是否正确。注意,在这种情况下,实际上不可能评估召回或F1,但是这种定性评估对于理解每种方法的弱点在哪里是有用的。为了分析,在我们的实验中,我们试图从网上的文档或我们从检查中收集的文件中找到尽可能多的信息,以做出关于返回的类型是否正确的决定。
静态分析样本:对于25/108方法,不能找到足够的文件来正确地推断返回类型。对于其余方法,经常返回多种类型。在所有那些返回的类型中,示例性实施例在71/163(43.56%)种情况下是正确的(其中,每种情况反映特定类型的推断),这低于在动态类型时所观察到的情况(该动态类型可能仅反映采样噪声)。该练习的一个观察结果是,经常发现类在概念上非常相似,但从类型的角度来看它们并不相关。例如,scpy.spatial.kdtree.KDTree被发现作为sklearn.neighbors.BallTree的返回类型。两者在概念上相关,两者都派生于BinaryTree,但是当然一个不能替代另一个。一般而言,这是鸭式类型方法的弱点。
文档字符串样本:从文档字符串类型注释中创建200种方法的另一个随机样本。在我们的实验中,我们不能手动验证67种方法的返回类型,这些方法大部分是库内部的设置函数,诸如plotly。对于其余的方法,对于103/133(77%)正确地预测返回类型。基于文档字符串的类型的一个常见问题是在文档不足以或不模糊时它的不精确性。例如,在numpy中,文档经常陈述返回值是数组,但是正在被返回的是numpy.ndarray。在这样的情况下,依赖于使用模式可以推断更好的类型。
PyType中的静态类型的弱点:所评估的下一个问题是用于类型推断的一个或多个示例性实施例是否解决了在引言中用静态类型工具(如PyType)提及的一些弱点。我们选择了与PyType进行比较,因为观察到PyType在类型推断中稍微好于MYPY。
图17(使用动态类型的预测类型的百分比、PyType、和示例性实施例)示出了针对动态类型的类型的分布,对比PyType和示例性实施例。再一次,如关于图1所讨论的,PyType倾向于产生更少的用户定义的类型,并且产生大比例的类型,这些类型被标记为不是非常精确的类型信息的任意类型。一个或多个实施例偏向于空白类型,除非从文档中推断那些空白类型。为了采集高质量的标记数据,正确地建模‘空白’是不太重要的。对于所有其他类别,示例性实施例看起来推断与由动态类型产生的类型一样多的类型。
为了检查每种类型方法的性质以及其针对动态类型的错误,为每个方法计算混淆矩阵。图12的表格(PyType对动态类型的混淆矩阵)显示了与图1中对PyType观察到的相同的行为。注意,用此系统中的任意来响应的趋势在所有类型上是正确的,但对于用户定义的类型更为严重,直以至于没有一个用户定义的类被正确推断出。事实上,PyType频繁地返回模块的名称(例如,对用户定义的类sympy,诸如sympy.core.power.Pow)。所采用的推断技术具有精确的相反偏差。图13的表格(针对静态分析的混淆矩阵──针对类的数字反映错误(正确答案在括号中))示出分析倾向于在提供用户定义类型方面出错。对于内置对象的混淆反映了流如何被建模的粗糙度──如果某个对象从元组或列表被检索并且随后在对象上调用方法,则直接数据流被错误地假设。图14的表格(文档字符串的混淆矩阵──类的数字反映错误(正确的回答在括号中))示出了针对文档字符串的混淆矩阵,其还示出了与分析类似的错误模式,频繁地混淆原语和具有用户定义类型的内置函数。文档字符串情况中的那些错误中的大部分来自以下事实:用于numpy方法的文档字符串频繁地返回用户定义的类numpy.bool_,但陈述其返回bool类型。类似地,对于内置函数,当返回元组但文档陈述在元组中返回的类型时,示例性实施例不正确地陈述返回类型是所提及的类型之一。
在我们的实验中,我们还检查了一个示例性实施例和PyType关于从静态分析返回的类型达成一致的程度,如图15的表中所示。即使当PyType返回看起来像类的类型时,该一致性也较小(22%),如图15的表所示(PyTypevs.的混淆矩阵)。静态分析──类的数目反映差异(在括号中的一致性))。这种一致性比利用文档字符串的类型推断和利用分析的类型推断之间的一致性差得多(61%)。在许多情况下,PyType不返回类的完全限定名称,因此,在我们的实验中,我们对47个情况的重叠的测量被调整以考虑当类名称匹配时的情况。在36个情况下,PyType返回模块作为返回类型,这意味着在36/209情况下(17%),PyType在推断类别时返回关于类型的不精确信息。
与基于文档字符串的类型推断的类似比较在图16的表中示出(PyType对文档字符串的混淆矩阵──类的数目反映差异(在括号中一致))。当PyType产生类时,其在47种情况下匹配基于文档字符串的类,具有约38%的一致性。基于文档字符串的推断似乎特别倾向于在内建对象上不同意PyType,最有可能是因为文档经常涉及数据结构和保存在其中的类型(例如,int列表)两者。再一次,PyType返回模块,而不是类34次,这是34/124(27%)。
推断类型数据集的特性:图19(通过两种方法推断的类型的概述)的表示出了类型推断的两种方法的一些概要统计。如表中所示,两种技术一起产生超过37000个标记的类型。二者之间的交叉程度小(410),因为各自的焦点是相当不同的。当它们针对相同方法产生类型时,它们在249/410情况下达成一致(61%)。图18(静态分析和每个类型类别的基于文档字符串的预测)示出了每个类别类型的预测的分布。与PyType(参见图1)相比,可以看出,一个或多个实施例通过产生更多用户定义的类型而不是从PyType产生空和任意类型来补充PyType。这和先前示出的准确度结果证明,一个或多个实施例确实可以产生可以进一步改进现有类型推断技术的更好质量的类型注释(将像任意类型和空类型的不确定类型转换成真实类型)。
图20示出了前25个模块的推断的分布,针对这些前25个模块,两种方法推断出类型。这些模块中的一些具有如图5所示的大多数类,但不是全部。这与以下事实保持一致:使用文档字符串的类型推断和使用分析的类型推断具有不同的强度,所以具有较大数目的类的模块不完全支配类型推断的有效性。
因此将理解的是,可以利用文档以及使用信息,以便大规模地为PYTHON和类似动态语言产生合理高质量的标记数据。一个或多个示例性实施例实现了比静态类型检验器显著更好的性能,并且还产生高质量标记的数据,从而实现更好的概率类型推断系统。
许多动态编程语言(如PYTHON)不强制执行任何种类的类型,即,在这些语言中不强制执行类型。类型推断对于防止错误、为了更好的程序理解、为了通过代码生成的更好的自动化、确定错误的位置等是重要的。在个别程序中嵌入可帮助类型返回对象的上下文;这是所谓的“鸭式类型”。想法是,如果类别包含对给定对象调用的所有方法,则它可能是类型的候选者。如果给定程序调用对象上的多个方法,则很有效,但是如果给定程序不调用,则效果不佳。一个或多个实施例采用跨大型代码储存库鸭式类型:(a)用显著数量的方法调用来推断给定程序上的类型,并外推到其他,和/或(b)使用跨程序的多个方法调用来推断类型,来推断具有相同API调用的跨程序集合的类型。在一个或多个实施例中,收集类中的所有方法,并观察函数的返回类型。再次参考对类型提取的以上讨论。在非限制性示例中,考虑PYTHON代码的随机片段和对象;在对象上调用lat方法和long方法。确定什么类型具有lat和long方法作为位置的一部分。可以假设未知项目必须是lat和long类型之一。如果对象上有六种方法被调用,则对象应当支持那六种方法。该信息可以用于过滤存在什么种类的对象。
参照图21和图22,一个或多个实施例提供了用于推断动态编程语言的类型的技术。例如,如在输入2201处看到的,在给定程序集合S和所有类的数据库D以及每一类的方法的情况下,在2202处,将静态分析应用于该程序集合S中的每个程序P,其中假设对给定程序P中的任何导入库L的任何调用(I)(此处,pd.read_csv对象)返回未知类型的新对象A。在该示例中,对未知类型的新对象A调用head和dropna。在2203处,使用P上的数据流分析来标识新对象A上的所有后续方法调用,并且确定在对象A上调用的所有方法M的联合。那些应该是拟合该对象的任何类必须具有的方法。在2204,对于导入库L中的每个调用I,令F是基于分析的函数L.I。在2205,跨程序集合S,创建方法M’的联合,其使跨所有P的所有M联合在完全相同的函数F上。在2206,查阅类和方法D的数据库以找到对于给定函数F在M’中包含所有方法的类C。在2207,添加F的函数签名(函数的返回类型)到C的映射。在2208,将F→C的映射应用于包含具有相应函数F的调用I的新程序,以推断I返回的类型。因此,已经执行机器学习过程,并且在步骤2208中,它可以用于推断新程序。一些实施例基于静态分析来实现类型推断。在一些示例中,还可以基于通信字符串来执行类型推断。例如,取得与特定API有关的文档,并基于所提及的(多个)类来推断返回类型和参数类型。存在类和方法的数据库。可以在数据库中搜索作为有效类的类。
值得注意的是,不同于专注于单个程序(例如,可变分配)的某些现有技术方法,一个或多个实施例有利地检查方法调用中的表达式的使用和/或分析大型程序储存库以建立调用到类映射的数据库。例如,一个或多个实施例对大的代码语料库执行静态分析以建立对类的方法调用的数据库,而不是使用例如声明性导入语句来分析单个程序的内容。在一个或多个实施例中,不需要反射机制,和/或不需要服务器源代码(例如,因为在一个或多个实施例中,龟标是代表在服务器代码中的外观设计模式)。有利地,一个或多个实施例不需要运行代码和经历动态分析的复杂性;相反,一个或多个实施例对大量(例如,数百万)代码文件执行静态分析以基于数据流分析收集大型调用数据库。该数据库然后用于基于被推断的对象所调用的方法来推断返回类型。实际上,代替单个源文件,一个或多个实施例对数百万个动态代码文件(例如,对于诸如PYTHON之类的动态类型化语言)执行静态分析,并因此基于数据分析建立调用和类之间的具体映射。执行大量(例如,数百万)程序的高效静态分析允许一个或多个实施例具有增强的跨任何特定对象类型上的程序收集更多调用的能力。由此,一个或多个实施例采用跨大型代码储存库的鸭式类型:(a)使用大量方法调用来推断给定程序上的类型,并外推到其他,和/或(b)使用跨程序的多个方法调用来推断类型,来推断具有相同API调用的程序集合上的类型。一个或多个实施例为诸如PYTHON之类的动态类型化语言提供类型推断。
一个或多个实施例因此提供用于使用计算设备来推断动态编程语言的类型的技术,包括:由计算设备接收所有类的程序集和数据库,每个类包括一个或多个方法;由计算装置将静态分析应用于程序集中的每个程序,其中假设对每个程序中的任何导入的库的调用的任何第一实例返回未知类型的新对象;由计算设备使用数据流分析来标识对未知类型的新对象的一个或多个后续方法调用,并映射结果;由计算设备应用映射来分析具有对导入的库的调用的新程序;以及由计算设备基于映射推断由调用返回的类型。
鉴于到目前为止的讨论,将认识到,一般而言,根据本发明的一个方面,提供了一种用于改进使用动态编程语言对计算机进行编程的技术过程的示例性方法。该方法包括通过对动态编程语言的文档库执行信息检索来生成将动态编程语言的类型映射到动态编程语言的对应的函数和方法的训练数据的第一部分。例如,可以使用以上关于利用文档字符串的类型推断讨论的技术以及图5中的算法1来执行该步骤。在一些示例中,可以采用合适的可商购的搜索和分析引擎,以及实现类型推断/算法1的高级代码,该高级代码被编译或解译成计算机可执行代码。
进一步的步骤包括在训练数据的第一部分上训练神经网络以推断动态编程语言的未知类型。本领域技术人员将熟悉训练计算机化神经网络本身,并且鉴于本文中的教导,将能够对所生成的数据训练计算机化神经网络。更进一步的步骤包括用经训练的神经网络执行推断,以通过基于对应的函数和方法的存在来推断以动态编程语言编写的代码样本中的程序变量的未知类型。本领域技术人员将熟悉使用计算机化神经网络本身的推断,并且鉴于本文的传授内容,将能够用基于所生成的数据训练的计算机化神经网络来执行推断。例如,参照图2,第10至13行。训练数据指示给定类型具有某些函数和方法。基于此进行推断,基本上确定变量可能具有什么类型。
再进一步的步骤包括促进基于经推断的未知类型用动态编程语言进行编程。各种各样的编程活动可以基于经推断的未知类型。例如,大多数动态语言(包括JavaScript和PYTHON)包括用于表达类型信息的可选语法。本发明的实施例可以生成现有程序的类型信息。由于附加注释,这有效地生成与原始程序不同的新程序。即,在这方面,编程包括基于现有程序创建新程序,其中,新程序包括推断类型的声明。另一示例性编程活动基于跨不同程序的抽象以理解程序员对给定数据集所做的共同事情。该活动例如在人工智能和机器学习领域中是有帮助的。例如,假设读取CSV文件并且从该文件中丢弃几列。假设对该CSV文件也做别的事情,而不丢弃列──另一程序可以读取CSV文件并且直接执行相同的操作而不丢弃任何列。当前,程序员不能理解两个程序都在做相同的事情,因为它们将不理解第二方法被调用的类型;当前技术将错误地推断两个程序正在做不同的事情。一个或多个实施例可用于获得代码正在做什么的抽象级别。另一示例性编程活动是使用根据本发明的实施例的类型以优化运行时系统或编译器中的代码。例如,可以由人类程序员使用程序编辑器来执行实际编程;可以通过使推断的类型在合适的文件或其他数据结构中可用于程序员来促进活动。
在一些实例中,进一步的步骤包括:生成训练数据的第二部分,第二部分通过对以动态编程语言编写的多个预先存在的程序执行数据流分析,来将动态编程语言中的程序变量映射到动态编程语言中的对应的函数和方法;以及对训练数据的第一部分和训练数据的第二部分执行联合操作以获得组合训练数据。例如,可以使用以上关于分析类型推断所讨论的技术和合适的静态分析软件工具来执行此步骤。在该方面,神经网络的训练包括对组合训练数据进行训练以推断动态编程语言中的未知类型。用于分析的T.J.Watson库(WALA)提供Java字节码和相关语言以及JavaScript的静态分析能力,可从国际商业机器公司获得,并且可在一些实例中使用。
进一步关于生成训练数据的第二部分,训练数据的第二部分经由数据流分析映射程序变量,此训练数据可以从多个预先存在的程序生成,并且允许在推断期间减少可行类型的数目。例如,通过程序,并且对于每个变量(例如,在图2中的行10开始的数据),看到调用了什么函数和方法,并且从其推断出其可以保持什么类型——仅可以保持那些方法和函数实际实施的类型。也就是说,数据必须是具有head方法的东西。考虑第13行中的data.head——变量数据可能具有的任何类型(可能分配给数据的任何对象)必须具有head方法,因为刚才调用它。这允许限制数据可能实际具有什么类型。由于只有一些类型实际上具有head方法,因此这有助于确定数据可能实际上是什么类型。
进一步的步骤包括基于程序变量映射在推断过程中减少要搜索的类型的数目。本质上,搜索空间是受限的并且对较小的类型集合执行分类。如果对变量调用方法,则该变量可仅具有实际实现该方法的类型。
因此,所有实施例不一定必须使用文档良好的库上的信息检索和多个预先存在的程序上的数据流分析两者,尽管在许多情况下一起使用这两个方面是有利的。然而,每个方面可以产生有用的类型。联合是训练数据的较大集合;组合两个方面通常改善个体表现。在集合理论中,集合的并集是该集合中所有元素的集合。技术人员将熟悉获得现代编程语言(诸如PYTHON)中的集合的联合。应当理解,图2涉及文档良好的库的信息检索(103部分read_csv文档)和多个预先存在的程序的数据流分析(101部分read_csv)。在一个或多个实施例中,使用知识图来创建类型的训练集;技术人员将熟悉知识图本身,并且鉴于本文的教导,将能够使用知识图来实现一个或多个实施例。
鉴于紧前面的讨论,将理解的是,在一些情况下,一种用于改进使用动态编程语言对计算机进行编程的技术过程的方法包括:通过对以动态编程语言编写的多个预先存在的程序进行数据流分析来生成训练数据,训练数据将动态编程语言中的程序变量映射到动态编程语言中的对应的函数和方法;在至少训练数据上训练神经网络以推断动态编程语言的未知类型;基于程序变量映射在推断期间减少要搜索的类型的数目;用经训练的神经网络执行推断以推断未知类型;以及基于经推断的未知类型促进以所述动态编程语言中的编程。在适当情况下,可以结合这个方面执行在本文中别处讨论的任何另外的步骤。此方面可以与使用信息检索的方法的结果或使用某种其他技术获得的类似结果一起工作。
一个或多个实施例还包括执行程序(例如,在测试过程中,通过开发者和/或通过终端用户一旦被释放)。
在一个或多个实施例中,执行信息检索包括对于文档库中的模块集合中的每个给定模块(参见算法1行至第13行),收集在给定模块中声明的那些函数和方法(参见第4行)。然后,对于每个收集的方法,收集相应的类并获得相应的文档字符串(见第5、6和7行),并将每个相应的文档字符串解析为包括类返回值的重组文本(见第8行)。此外,对于收集的函数和方法中的每一个:将对应的文档字符串中的每解析成还包括函数返回值的重组文本(见第8行),为函数和方法中的每一个创建文档(见第9行),以及在索引中对文档中的每个文档进行索引(见第10行)。更进一步,对于类中的所有给定类(见第15行),搜索对应于类中的给定类的所有文档的索引(见第16行),并且将文档中的每个文档分配给对应的函数或方法和类型,以获得动态编程语言中的类型到对应的函数和方法的映射(见第17至19行)。
技术人员将认识到,PYTHON中的函数是用于执行特定任务的代码块,将包含其自身的范围,并且通过名称被调用;所有函数可以包含零(没有)自变量或多于一个自变量。退出时,函数可返回或不返回一个或多个值。技术人员将理解,PYTHON中的方法在某种程度上类似于函数,除了它与对象/类相关联。因此,PYTHON中的方法与函数非常相似,除了两个主要差异:该方法隐式地用于调用它的对象,并且该方法可访问包含在该类内的数据。
此外,在PYTHON中,类型是指数据的类型,如文本、数字、布尔等──type()函数返回给定变量的类类型;类是用于创建对象的代码模板;并且对象是数据(变量)和作用于数据的方法/函数的集合。
合适的后处理(如清理)可以适当地进行(参见以上示例性讨论)。
在一个或多个实施例中,生成训练数据的第一部分和训练数据的第二部分是无监督的。
参考图21和22以及伴随的文本,在一个或多个实施例中,对以动态编程语言编写的多个预先存在的程序执行数据流分析包括:在2202,将静态分析应用于程序中的每个程序,假设对导入库的任何调用返回未知类型的新对象;在2203处,标识对该未知类型的新对象的后续方法调用,并且确定对该未知类型的新对象调用的所有方法的联合;在2204处,针对这些调用中的每个调用,标识对应的函数;在2205,创建跨对应的函数上的程序中的所有程序所有方法的联合;在2206,标识该类中包含针对对应的函数的所有方法的联合中的所有方法的那些类;以及在2207,将对应的函数映射到所标识的类。此外,如在2208,用经训练的神经网络执行推断以推断未知类型包括应用映射。
在另一方面,一种示例性计算机(参见例如图25)包括体现计算机可执行指令40的存储器28;以及至少一个处理器16,该至少一个处理器被耦合至该存储器,并且由这些计算机可执行指令操作用于执行本文关于任何本文所描述的方法所描述的方法步骤中的任何一个、一些或全部。例如,至少一个处理器可操作以根据是否对文档库执行信息检索和/或对多个预先存在的程序执行数据流分析来示例化神经网络以及搜索引擎和静态软件分析工具中的至少一个。
应当理解的是,尽管本公开包括关于云计算的详细描述,但本文所叙述的教导的实现不限于云计算环境。相反,本发明的实施例能够结合现在已知的或以后开发的任何其他类型的计算环境来实现。
云计算是服务递送的模型,用于使得能够方便地、按需地网络访问可配置计算资源(例如,网络、网络带宽、服务器、处理、存储器、存储、应用、虚拟机和服务)的共享池,可配置计算资源可以用最小的管理努力或与服务的提供方进行交互来快速配设和释放。该云模型可以包括至少五个特性、至少三个服务模型、和至少四个部署模型。
特征如下:
按需自助服务:云消费者可以根据需要自动地单方面地配设计算能力,如服务器时间和网络存储,而无需与服务的提供方进行人工交互。
广泛的网络接入:能力可通过网络获得并且通过促进异构瘦客户机平台或厚客户机平台(例如,移动电话、膝上计算机、和PDA)使用的标准机制访问。
资源池:提供方的计算资源被池化以使用多租户模型来服务多个消费者,其中根据需求动态地分配和重新分配不同的物理和虚拟资源。存在位置独立性的感知,因为消费者通常不具有对所提供的资源的确切位置的控制或了解,但可能能够以较高抽象级别(例如,国家、州或数据中心)指定位置。
快速弹性:可以快速和弹性地(在一些情况下,自动地)提供能力以快速缩小和快速释放以快速放大。对于消费者而言,可用于供应的能力通常显得不受限制并且可以在任何时间以任何数量购买。
测量服务:云系统通过在适合于服务类型(例如,存储、处理、带宽、和活动用户账户)的某个抽象级别处利用计量能力来自动控制和优化资源使用。可以监视、控制和报告资源使用,为所利用的服务的提供方和消费者提供透明度。
服务模型如下:
软件即服务(SaaS):提供给消费者的能力是使用在云基础设施上运行的提供方的应用。可通过诸如web浏览器(例如,基于web的电子邮件)之类的瘦客户端接口从不同客户端设备访问应用。消费者不管理或控制包括网络、服务器、操作系统、存储或甚至单独的应用能力的底层云基础设施,可能的例外是有限的用户特定应用配置设置。
平台即服务(PaaS):提供给消费者的能力是将消费者创建的或获取的使用由提供方支持的编程语言和工具创建的应用程序部署到云基础设施上。消费者不管理或控制包括网络、服务器、操作系统或存储的底层云基础设施,但是对所部署的应用和可能的应用托管环境配置具有控制。
基础设施即服务(IaaS):向消费者提供的能力是提供处理、存储、网络和消费者能够部署和运行任意软件的其他基本计算资源,该软件可以包括操作系统和应用程序。消费者不管理或控制底层云基础设施,而是具有对操作系统、存储、所部署的应用的控制以及对所选联网组件(例如,主机防火墙)的可能受限的控制。
部署模型如下:
私有云:云基础设施仅针对组织操作。它可以由组织或第三方管理,并且可以存在于场所内或场所外。
社区云:云基础设施由若干组织共享并且支持具有共享关注(例如,任务、安全要求、策略、和合规性考虑)的特定社区。它可以由组织或第三方管理,并且可以存在于场所内或场所外。
公共云:使云基础设施对一般公众或大型行业组可用并且由出售云服务的组织拥有。
混合云:云基础设施是两个或更多个云(私有、社区或公共)的组合,这些云保持唯一实体但通过使数据和应用能够移植的标准化或专有技术(例如,云突发以用于云之间的负载平衡)绑定在一起。
云计算环境是面向服务的,集中于无状态、低耦合、模块化和语义互操作性。云计算的核心是包括互连节点网络的基础设施。
现在参见图23,描绘了说明性云计算环境50。如图所示,云计算环境50包括云消费者使用的本地计算设备可以与其通信的一个或多个云计算节点10,本地计算设备诸如例如个人数字助理(PDA)或蜂窝电话54A、台式计算机54B、膝上型计算机54C和/或汽车计算机系统54N。节点10可彼此通信。它们可以物理地或虚拟地分组(未示出)在一个或多个网络中,诸如如上所述的私有云、社区云、公共云或混合云、或其组合。这允许云计算环境50提供基础设施、平台和/或软件作为云消费者不需要为其维护本地计算设备上的资源的服务。应当理解,图23中所示的计算装置54A至N的类型仅旨在是说明性的,并且计算节点10和云计算环境50可通过任何类型的网络和/或网络可寻址连接(例如,使用网络浏览器)与任何类型的计算机化装置通信。
现在参见图24,示出了由云计算环境50(图23)提供的功能抽象层集合。应提前理解,图24中所示的组件、层和功能旨在仅是说明性的,并且本发明的实施例不限于此。如所描述,提供以下层和对应功能:
硬件和软件层60包括硬件和软件组件。硬件组件的示例包括:大型机61;基于RISC(精简指令集计算机)架构的服务器62;服务器63;刀片服务器64;存储设备65;以及网络和联网组件66。在一些实施例中,软件组件包括网络应用服务器软件67和数据库软件68。
虚拟化层70提供抽象层,从该抽象层可以提供虚拟实体的以下示例:虚拟服务器71;虚拟存储器72;虚拟网络73,包括虚拟专用网络;虚拟应用和操作系统74;以及虚拟客户端75。
在一个示例中,管理层80可以提供以下所描述的功能。资源供应81提供用于在云计算环境内执行任务的计算资源和其他资源的动态采购。计量和定价82在云计算环境内利用资源时提供成本跟踪,并为这些资源的消费开账单或发票。在一个示例中,这些资源可以包括应用软件许可证。安全性为云消费者和任务提供身份验证,以及为数据和其他资源提供保护。用户门户83为消费者和系统管理员提供对云计算环境的访问。服务等级管理84提供云计算资源分配和管理,使得满足所需的服务等级。服务等级协议(SLA)规划和履行85提供根据SLA预期未来需求的云计算资源的预安排和采购。
工作负载层90提供可以利用云计算环境的函数的示例。可以从该层提供的工作负荷和函数的示例包括:地图和导航91;软件开发和生命周期管理92;虚拟课堂教育交付93;数据分析处理94;交易处理95;以及用于以动态语言进行类型推断的系统96的至少一部分。
本发明的一个或多个实施例或其元件可以按装置的形式来实现,所述装置包括存储器和至少一个处理器,至少一个处理器被耦合至存储器并且可操作用于执行示例性方法步骤。图25描述了可用于实现本发明的一个或多个方面和/或元素的计算机系统,也表示根据本发明的一个实施方式的云计算节点。现在参见图25,云计算节点10仅是合适的云计算节点的一个示例,并且不旨在对本文描述的本发明的实施例的使用或函数的范围提出任何限制。无论如何,云计算节点10能够被实现和/或执行上文阐述的任何函数。
在云计算节点10中,存在计算机系统/服务器12,其可与许多其他通用或专用计算系统环境或配置一起操作。可以适用于计算机系统/服务器12的公知的计算系统、环境和/或配置的示例包括但不限于个人计算机系统、服务器计算机系统、瘦客户机、厚客户机、手持式或膝上型设备、多处理器系统、基于微处理器的系统、机顶盒、可编程消费电子产品、网络PC、小型计算机系统、大型计算机系统和包括上述任何系统或设备的分布式云计算环境等。
计算机系统/服务器12可以在由计算机系统执行的计算机系统可执行指令(如程序模块)的一般背景下进行描述。一般而言,程序模块可包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、逻辑、数据结构等。计算机系统/服务器12可以在分布式云计算环境中实践,其中任务由通过通信网络链接的远程处理设备执行。在分布式云计算环境中,程序模块可以位于包括存储器存储设备的本地和远程计算机系统存储介质中。
如图25所示,云计算节点10中的计算机系统/服务器12以通用计算设备的形式示出。计算机系统/服务器12的组件可以包括但不限于一个或多个处理器或处理单元16、系统存储器28和将包括系统存储器28的不同系统组件耦合到处理器16的总线18。
总线18表示任何若干类型的总线结构中的一种或多种,包括存储器总线或存储器控制器、外围总线、加速图形端口、以及使用各种总线架构中的任一种的处理器或局部总线。作为示例而非限制,这样的体系结构包括工业标准体系结构(ISA)总线、微通道体系结构(MCA)总线、增强型ISA(EISA)总线、视频电子标准协会(VESA)局部总线和外围组件互连(PCI)总线。
计算机系统/服务器12通常包括多种计算机系统可读介质。这样的介质可以是可由计算机系统/服务器12访问的任何可用介质,并且其包括易失性和非易失性介质、可移动和不可移动介质。
系统存储器28可以包括易失性存储器形式的计算机系统可读介质,如随机存取存储器(RAM)30和/或高速缓存存储器32。计算机系统/服务器12可以还包括其他可移动/不可移动、易失性/非易失性计算机系统存储介质。仅通过示例的方式,存储系统34可以被提供用于从不可移动、非易失性磁介质(未示出,并且通常被称为“硬盘驱动器”)中读取和向其写入。尽管未示出,可以提供用于从可移动非易失性磁盘(例如,“软盘”)读取或向其写入的磁盘驱动器,以及用于从可移动非易失性光盘(如CD-ROM、DVD-ROM或其他光学介质)读取或向其写入的光盘驱动器。在这样的情况下,每一个可以通过一个或多个数据介质接口连接到总线18。如以下将还描绘和描述的,存储器28可以包括具有被配置为执行本发明的实施例的函数的一组(例如,至少一个)程序模块的至少一个程序产品。
具有一组(至少一个)程序模块42的程序/实用程序40可以存储在举例来说但不限于存储器28中,以及操作系统、一个或多个应用程序、其他程序模块和程序数据。操作系统、一个或多个应用程序、其他程序模块和程序数据中的每一个或它们的一些组合可以包括网络环境的实现方式。程序模块42通常执行如本文所描述的本发明的实施例的函数和/或方法。
计算机系统/服务器12也可以与一个或多个外部设备14(如键盘、定点设备、显示器24等)通信;一个或多个使得用户能够与计算机系统/服务器12交互的设备;和/或使得计算机系统/服务器12能够与一个或多个其他计算设备通信的任何设备(例如,网卡、调制解调器等)。这种通信可经由输入/输出(I/O)接口22进行。此外,计算机系统/服务器12可以通过网络适配器20与一个或多个网络通信,例如局域网(LAN)、通用广域网(WAN)和/或公共网络(例如互联网)。如图所示,网络适配器20通过总线18与计算机系统/服务器12的其他组件通信。应当理解,虽然未示出,但是其他硬件和/或软件组件可以与计算机系统/服务器12结合使用。示例包括但不限于:微代码、设备驱动器、冗余处理单元和外部磁盘驱动阵列、RAID系统、磁带驱动器和数据归档存储系统等。
因此,一个或多个实施例可以利用在通用计算机或工作站上运行的软件。参考图25,这种实现方式可以例如采用处理器16、存储器28和到显示器24和外部设备14(诸如键盘、定点设备等)的输入/输出接口22。如本文中使用的术语“处理器”旨在包括任何处理设备,例如,包括CPU(中央处理单元)和/或其他形式的处理电路的处理设备。此外,术语“处理器”可以指多于一个单独的处理器。术语“存储器”旨在包括与处理器或CPU相关联的存储器,例如,RAM(随机存取存储器)30、ROM(只读存储器)、固定存储设备(例如,硬盘驱动器34)、可移动存储设备(例如,磁盘)、闪存等。此外,如本文中使用的短语“输入/输出接口”旨在考虑例如用于将数据输入至处理单元的一个或多个机构(例如,鼠标)的接口,以及用于提供与处理单元相关联的结果的一个或多个机构(例如,打印机)的接口。处理器16、存储器28和输入/输出接口22可以例如经由作为数据处理单元12的一部分的总线18互连。合适的互连(例如经由总线18)也可以被提供给网络接口20(诸如网卡)和媒体接口(诸如软盘或CD-ROM驱动器),网络接口20可以被提供用于与计算机网络接口连接,媒体接口可以被提供用于与合适的媒体接口连接。
相应地,包括如本文所描述的用于执行本发明的方法的指令或代码的计算机软件可以存储在相关联的存储器装置(例如,ROM、固定或可移动存储器)中的一个或多个存储器装置中,并且当准备好被使用时,部分地或全部地加载(例如,加载到RAM中)并且由CPU实现。这样的软件可以包括但不限于固件、驻留软件、微代码等。
适于存储和/或执行程序代码的数据处理系统将包括至少一个处理器16,该至少一个处理器通过系统总线18直接或间接地耦合到存储器元件28上。存储器元件可以包括在程序代码的实际实现期间使用的本地存储器、大容量存储器、以及提供至少一些程序代码的临时存储以便减少在实现期间必须从大容量存储器取回代码的次数的高速缓冲存储器32。
输入/输出或I/O设备(包括但不限于键盘、显示器、定点设备等)可以直接地或通过中间的I/O控制器被耦合至系统。
网络适配器20还可以被耦合到该系统上,以便使得该数据处理系统能够通过介入的私有或公共网络变得耦合到其他数据处理系统或远程打印机或存储装置上。调制解调器、电缆调制解调器和以太网卡仅是一些当前可用类型的网络适配器。
如本文中使用的,包括权利要求,“服务器”包括运行服务器程序的物理数据处理系统(例如,如图25中所示的系统12)。将理解,这样的物理服务器可包括或可不包括显示器和键盘。
一个或多个实施例可以至少部分地在云或虚拟机环境的情境中实现,尽管这是示例性的且非限制性的。返回参考图23至图24和所附文本。
应注意的是,本文所描述的任何方法可以包括提供系统的附加步骤,该系统包括体现在计算机可读存储介质上的不同软件模块;这些模块可以包括例如框图中所描绘的和/或本文描述的任何或所有适当元件;通过举例而非限制的方式,所描述的任何一个、一些或全部模块/框和/或子模块/框。然后可以使用在诸如16的一个或多个硬件处理器上执行的如上所述的系统的不同软件模块和/或子模块来执行方法步骤。还,计算机程序产品可包括计算机可读存储介质,该计算机可读存储介质具有适于实现以执行本文描述的一个或多个方法步骤的代码,包括提供具有不同软件模块的系统。
可以在一些情况下采用的用户界面的示例是由服务器等提供给用户的计算设备的浏览器的超文本标记语言(HTML)代码。HTML由用户的计算设备上的浏览器解析以创建图形用户界面(GUI)。
示例性系统和制造物品细节
本发明可以是在任何可能的技术细节集成等级下的系统、方法、和/或计算机程序产品。计算机程序产品可包括其上具有用于使处理器执行本发明的各方面的计算机可读程序指令的计算机可读存储介质(或多个介质)。
计算机可读存储介质可以是可以保留和存储由指令执行设备使用的指令的有形设备。计算机可读存储介质可以是,例如但不限于,电子存储设备、磁存储设备、光存储设备、电磁存储设备、半导体存储设备、或者上述的任意合适的组合。计算机可读存储介质的更具体示例的非穷尽列表包括以下各项:便携式计算机盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、静态随机存取存储器(SRAM)、便携式紧凑盘只读存储器(CD-ROM)、数字通用盘(DVD)、记忆棒、软盘、诸如穿孔卡之类的机械编码设备或具有记录在其上的指令的槽中的凸出结构、以及上述各项的任何合适的组合。如本文所使用的计算机可读存储媒体不应被解释为暂时性信号本身,例如无线电波或其他自由传播的电磁波、通过波导或其他传输媒体传播的电磁波(例如,穿过光纤电缆的光脉冲)或通过电线发射的电信号。
本文所描述的计算机可读程序指令可以经由网络(例如,互联网、局域网、广域网和/或无线网络)从计算机可读存储介质下载至对应的计算/处理装置或者下载至外部计算机或外部存储装置。网络可以包括铜传输电缆、光传输纤维、无线传输、路由器、防火墙、交换机、网关计算机和/或边缘服务器。每个计算/处理设备中的网络适配器卡或网络接口接收来自网络的计算机可读程序指令,并转发计算机可读程序指令以存储在相应计算/处理设备内的计算机可读存储介质中。
用于执行本发明的操作的计算机可读程序指令可以是汇编指令、指令集架构(ISA)指令、机器指令、机器相关指令、微代码、固件指令、状态设置数据、集成电路的配置数据、或以一种或多种程序设计语言的任何组合编写的源代码或目标代码,这些程序设计语言包括面向对象的程序设计语言(诸如Smalltalk、C++等)和过程程序设计语言(诸如“C”程序设计语言或类似程序设计语言)。计算机可读程序指令可以完全地在用户计算机上执行、部分在用户计算机上执行、作为独立软件包执行、部分在用户计算机上部分在远程计算机上执行或者完全在远程计算机或服务器上执行。在后一种情况下,远程计算机可通过任何类型的网络(包括局域网(LAN)或广域网(WAN))连接至用户计算机,或者可连接至外部计算机(例如,使用互联网服务提供方通过互联网)。在一些实施例中,包括例如可编程逻辑电路、现场可编程门阵列(FPGA)或可编程逻辑阵列(PLA)的电子电路可以通过利用计算机可读程序指令的状态信息来使电子电路个性化来执行计算机可读程序指令,以便执行本发明的各方面。
本发明的各个方面在本文中是参照根据本发明实施例的方法、装置(系统)和计算机程序产品的流程图和/或框图来描述的。应当理解,流程图和/或框图的每个方框以及流程图和/或框图中各方框的组合,都可以由计算机可读程序指令实现。
这些计算机可读程序指令可以被提供给通用计算机、专用计算机、或其他可编程数据处理装置的处理器以产生机器,这样使得经由计算机或其他可编程数据处理装置的处理器执行的指令创建用于实现在流程图和/或框图的或多个框中指定的功能/动作的装置。也可以把这些计算机可读程序指令存储在计算机可读存储介质中,这些指令使得计算机、可编程数据处理装置、和/或其他设备以特定方式工作,从而,其中存储有指令的计算机可读存储介质包括包含实现流程图和/或框图中的或多个方框中规定的功能/动作的方面的指令的制造品。
这些计算机可读程序指令还可以被加载到计算机、其他可编程数据处理装置、或其他设备上,以便使得在该计算机、其他可编程装置或其他设备上执行一系列操作步骤以产生计算机实施的过程,这样使得在该计算机、其他可编程装置或其他设备上执行的这些指令实施在该流程图和/或框图的或多个框中指定的功能/动作。
附图中的流程图和框图展示了根据本发明的不同实施例的系统、方法和计算机程序产品的可能实现方式的架构、功能和操作。对此,流程图或框图中的每个框可表示指令的模块、段或部分,其包括用于实现指定的逻辑功能的一个或多个可执行指令。在一些备选实现中,框中标注的功能可以不按照图中标注的顺序发生。例如,取决于所涉及的功能,连续示出的两个块实际上可以基本上同时执行,或者这些块有时可以以相反的顺序执行。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作或执行专用硬件与计算机指令的组合的专用的基于硬件的系统来实现。
已经出于说明的目的呈现了本发明的各个实施例的描述,但并不旨在是详尽的或限于所公开的实施例。在不脱离所描述的实施例的范围和精神的情况下,许多修改和变型对本领域普通技术人员将是明显的。本文使用的术语被选择来最好地解释实施例的原理、实际应用或对在市场中找到的技术的技术改进,或者使得本领域普通技术人员能够理解本文公开的实施例。
Claims (15)
1.一种用于改进使用动态编程语言对计算机进行编程的技术过程的方法,包括:
通过对动态编程语言中的文档库执行信息检索,生成训练数据的第一部分,所述训练数据的第一部分将所述动态编程语言中的类型映射到所述动态编程语言中的对应的函数和方法;
在所述训练数据的第一部分上训练神经网络,以推断所述动态编程语言中的未知类型;
通过基于所述对应的函数和方法的存在来推断所述未知类型,用经训练的所述神经网络执行推断,以推断针对以所述动态编程语言编写的代码的样本中的程序变量的所述未知类型;以及
基于经推断的所述未知类型来促进所述动态编程语言中的编程。
2.根据权利要求1所述的方法,还包括:
通过对以所述动态编程语言编写的多个预先存在的程序执行数据流分析,生成训练数据的第二部分,所述训练数据的第二部分将所述动态编程语言中的所述程序变量映射到所述动态编程语言中的所述对应的函数和方法;以及
对所述训练数据的第一部分和所述训练数据的第二部分执行联合操作,以获得组合训练数据;
其中所述神经网络的所述训练包括在所述组合训练数据上进行训练以推断所述动态编程语言中的所述未知类型,还包括基于所述程序变量映射来减少在所述推断期间要搜索的所述类型的数目。
3.根据权利要求2所述的方法,还包括执行所述程序。
4.根据权利要求2所述的方法,其中执行所述信息检索包括:
对于所述文档库中的模块集合中的每个给定模块:
收集在所述给定模块中声明的那些所述功能和所述方法;
对于所收集的所述方法中的每个方法:
收集对应的类并且获取对应的文档字符串;
将所述对应的文档字符串中的每个文档字符串解析为包括类返回值的重组文本;
对于所收集所述的函数和所收集的所述方法中的每一个:
将所述对应的文档字符串中的每个文档字符串解析成还包括函数返回值的重组文本;
为所述函数和方法中的每一个创建文档;以及
在索引中对所述文档中的每个文档进行索引;
对于所述类中的所有给定类:
在所述索引中搜索对应于所述类中的给定类的所述文档中的所有文档;以及
将所述文档中的每个文档分配给对应的函数或方法和类型,以获得所述动态编程语言中的所述类型到所述对应的函数和方法的所述映射。
5.根据权利要求2所述的方法,其中:
对以所述动态编程语言编写的所述多个预先存在的程序执行所述数据流分析包括:
假定对导入库的任何调用返回未知类型的新对象,对所述程序中的每个程序应用静态分析;
标识对所述未知类型的新对象的后续方法调用;
确定对所述未知类型的新对象调用的所有方法的联合;
对于所述调用中的每个调用,标识对应的函数;
创建跨所述对应的函数上的所述程序中的所有程序的所有方法的联合;
标识包含针对所述对应的函数的所述所有方法的联合中的所有方法的那些所述类;以及
将所述对应的函数映射到所标识的所述类;以及
用经训练的所述神经网络执行所述推断,以推断所述未知类型包括应用所述映射。
6.根据权利要求2所述的方法,其中生成所述训练数据的第一部分和所述训练数据的所述第二部分是无监督的。
7.一种计算机程序产品,包括体现计算机可执行指令的一个或多个计算机可读存储介质,所述计算机可执行指令在由计算机执行时使所述计算机执行一种方法,所述方法改进使用动态编程语言对所述计算机进行编程的技术过程,所述方法包括权利要求1至6中的权利要求中的步骤。
8.一种计算机,包括:
存储器,体现计算机可执行指令;以及
至少一个处理器,被耦合到所述存储器,并且由所述计算机可执行指令可操作以便执行一种方法,所述方法用于改进使用动态编程语言对所述计算机进行编程的技术过程,所述方法包括:
实例化神经网络和搜索引擎;
使用至少所述搜索引擎,通过对所述动态编程语言中的文档库执行信息检索,生成训练数据的第一部分,所述训练数据的第一部分将所述动态编程语言中的类型映射到所述动态编程语言中的对应的函数和方法;
在所述训练数据的第一部分上训练所述神经网络,以推断所述动态编程语言中的未知类型;
通过基于所述对应的函数和方法的存在来推断所述未知类型,用经训练的所述神经网络执行推断,以推断针对以所述动态编程语言编写的代码的样本中的程序变量的所述未知类型;以及
基于经推断的所述未知类型来促进所述动态编程语言中的编程。
9.根据权利要求8所述的计算机,其中所述至少一个处理器还由所述计算机可执行指令可操作以:
实例化静态软件分析工具;
使用至少所述静态软件分析工具,通过对以所述动态编程语言编写的多个预先存在的程序执行数据流分析,生成训练数据的第二部分,所述训练数据的第二部分将所述动态编程语言中的所述程序变量映射到所述动态编程语言中的所述对应的函数和方法;以及
对所述训练数据的第一部分和所述训练数据的第二部分执行联合操作,以获得组合训练数据;
其中所述神经网络的所述训练包括在所述组合训练数据上进行训练以推断所述动态编程语言中的所述未知类型,还包括基于所述程序变量映射来减少在所述推断期间要搜索的所述类型的数目。
10.根据权利要求9所述的计算机,其中所述至少一个处理器还由所述计算机可执行指令可操作,以执行所述程序。
11.根据权利要求9所述的计算机,其中执行所述信息检索包括:
对于所述文档库中的模块集合中的每个给定模块:
收集在所述给定模块中声明的那些所述功能和所述方法;
对于所收集的所述方法中的每个方法:
收集对应的类并且获取对应的文档字符串;
将所述对应的文档字符串中的每个文档字符串解析为包括类返回值的重组文本;
对于所收集所述的函数和所收集的所述方法中的每一个:
将所述对应的文档字符串中的每个文档字符串解析成还包括函数返回值的重组文本;
为所述函数和方法中的每一个创建文档;以及
在索引中对所述文档中的每个文档进行索引;
对于所述类中的所有给定类:
在所述索引中搜索对应于所述类中的给定类的所述文档中的所有文档;以及
将所述文档中的每个文档分配给对应的函数或方法和类型,以获得所述动态编程语言中的所述类型到所述对应的函数和方法的所述映射。
12.根据权利要求9所述的计算机,其中:
对以所述动态编程语言编写的所述多个预先存在的程序执行所述数据流分析包括:
假定对导入库的任何调用返回未知类型的新对象,对所述程序中的每个程序应用静态软件分析工具;
标识对所述未知类型的新对象的后续方法调用;
确定对所述未知类型的新对象调用的所有方法的联合;
对于所述调用中的每个调用,标识对应的函数;
创建跨所述对应的函数上的所述程序中的所有程序的所有方法的联合;
标识包含针对所述对应的函数的所述所有方法的联合中的所有方法的那些所述类;以及
将所述对应的函数映射到所标识的所述类;以及
用经训练的所述神经网络执行所述推断,以推断所述未知类型包括应用所述映射。
13.根据权利要求9所述的计算机,其中生成所述训练数据的第一部分和所述训练数据的第二部分是无监督的。
14.一种用于改进使用动态编程语言对计算机进行编程的技术过程的方法,包括:
通过对以所述动态编程语言编写的多个预先存在的程序执行数据流分析,生成训练数据,所述训练数据将所述动态编程语言中的程序变量映射到所述动态编程语言中的对应的函数和方法;以及
在至少所述训练数据上训练神经网络,以推断所述动态编程语言中的未知类型;
基于所述程序变量映射减少在推断期间要搜索的类型的数目;
用经训练的所述神经网络执行所述推断,以推断所述未知类型;以及
基于经推断的所述未知类型来促进所述动态编程语言中的编程。
15.根据权利要求14所述的方法,其中:
对以所述动态编程语言编写的所述多个预先存在的程序执行所述数据流分析包括:
假定对导入库的任何调用返回未知类型的新对象,对所述程序中的每个程序应用静态分析;
标识对所述未知类型的新对象的后续方法调用;
确定对所述未知类型的新对象调用的所有方法的联合;
对于所述调用中的每个调用,标识对应的函数;
创建跨所述对应的函数上的所述程序中的所有程序的所有方法的联合;
标识包含针对所述对应的函数的所述所有方法的联合中的所有方法的那些所述类;以及
将所述对应的函数映射到所标识的所述类;以及
用经训练的所述神经网络执行所述推断,以推断所述未知类型包括应用所述映射。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US17/382,324 US11740875B2 (en) | 2021-07-21 | 2021-07-21 | Type inference in dynamic languages |
US17/382,324 | 2021-07-21 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN115686467A true CN115686467A (zh) | 2023-02-03 |
Family
ID=84976175
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210858709.XA Pending CN115686467A (zh) | 2021-07-21 | 2022-07-20 | 动态语言中的类型推断 |
Country Status (3)
Country | Link |
---|---|
US (1) | US11740875B2 (zh) |
JP (1) | JP2023016738A (zh) |
CN (1) | CN115686467A (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20240020096A1 (en) * | 2022-07-14 | 2024-01-18 | OpenAI Opco, LLC | Systems and methods for generating code using language models trained on computer code |
Family Cites Families (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20060048095A1 (en) | 2004-08-31 | 2006-03-02 | Microsoft Corporation | Local type alias inference system and method |
US7970730B2 (en) * | 2005-01-27 | 2011-06-28 | Microsoft Corporation | Efficient data access via runtime type inference |
US8407667B2 (en) | 2009-03-20 | 2013-03-26 | Microsoft Corporation | Inferring missing type information for reflection |
US8595213B2 (en) * | 2010-07-15 | 2013-11-26 | Semmle Limited | Type inference for datalog with complex type hierarchies |
US8555250B2 (en) * | 2011-05-31 | 2013-10-08 | Microsoft Corporation | Static semantic analysis of dynamic languages |
US9652207B2 (en) | 2013-03-13 | 2017-05-16 | Microsoft Technology Licensing, Llc. | Static type checking across module universes |
US9984141B2 (en) * | 2015-08-21 | 2018-05-29 | International Business Machines Corporation | Inferring application type based on input-output characteristics of application storage resources |
US11200143B2 (en) * | 2019-01-08 | 2021-12-14 | FinancialForce.com, Inc. | Software development framework for a cloud computing platform |
-
2021
- 2021-07-21 US US17/382,324 patent/US11740875B2/en active Active
-
2022
- 2022-07-20 JP JP2022115220A patent/JP2023016738A/ja active Pending
- 2022-07-20 CN CN202210858709.XA patent/CN115686467A/zh active Pending
Also Published As
Publication number | Publication date |
---|---|
JP2023016738A (ja) | 2023-02-02 |
US11740875B2 (en) | 2023-08-29 |
US20230029250A1 (en) | 2023-01-26 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
David et al. | Neural reverse engineering of stripped binaries using augmented control flow graphs | |
US8490050B2 (en) | Automatic generation of user interfaces | |
US8707263B2 (en) | Using a DSL for calling APIS to test software | |
US8156473B2 (en) | Model oriented debugging | |
US20200210158A1 (en) | Automated or machine-enhanced source code debugging | |
US10083029B2 (en) | Detect application defects by correlating contracts in application dependencies | |
Attard et al. | Better late than never or: verifying asynchronous components at runtime | |
Farahbod et al. | The CoreASM modeling framework | |
CN115686467A (zh) | 动态语言中的类型推断 | |
Han et al. | PROV-IO $^+ $: A Cross-Platform Provenance Framework for Scientific Data on HPC Systems | |
Mühlberg et al. | Learning assertions to verify linked-list programs | |
US20190317877A1 (en) | Application state monitoring | |
Romanov et al. | Representing programs with dependency and function call graphs for learning hierarchical embeddings | |
US10776255B1 (en) | Automatic verification of optimization of high level constructs using test vectors | |
Strecansky | Hands-On High Performance with Go: Boost and optimize the performance of your Golang applications at scale with resilience | |
Alshayeb et al. | SPMDL: software product metrics definition language | |
Mateos et al. | A stitch in time saves nine: Early improving code-first web services discoverability | |
Ukić et al. | The influence of cyclomatic complexity distribution on the understandability of xtUML models | |
US8612928B2 (en) | Generating exception-based component models from non-exception-based models | |
Ramgir et al. | Java 9 High Performance: Practical techniques and best practices for optimizing Java applications through concurrency, reactive programming, and more | |
Asseldonk | From a Monolith to Microservices: the Effect of Multi-view Clustering | |
Salah | An environment for comprehending the behavior of software systems | |
CN117075912B (zh) | 用于程序语言转换的方法、编译方法及相关设备 | |
US11972237B1 (en) | Member invocation declarative interception | |
Zhu et al. | RADF: Architecture decomposition for function as a service |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |