CN111858322A - 一种Python语言特征自动识别系统和方法 - Google Patents

一种Python语言特征自动识别系统和方法 Download PDF

Info

Publication number
CN111858322A
CN111858322A CN202010663123.9A CN202010663123A CN111858322A CN 111858322 A CN111858322 A CN 111858322A CN 202010663123 A CN202010663123 A CN 202010663123A CN 111858322 A CN111858322 A CN 111858322A
Authority
CN
China
Prior art keywords
language
standard library
python
information
function
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.)
Granted
Application number
CN202010663123.9A
Other languages
English (en)
Other versions
CN111858322B (zh
Inventor
张昱
彭昀
胡明哲
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
University of Science and Technology of China USTC
Original Assignee
University of Science and Technology of China USTC
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by University of Science and Technology of China USTC filed Critical University of Science and Technology of China USTC
Priority to CN202010663123.9A priority Critical patent/CN111858322B/zh
Publication of CN111858322A publication Critical patent/CN111858322A/zh
Application granted granted Critical
Publication of CN111858322B publication Critical patent/CN111858322B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3604Software analysis for verifying properties of programs
    • G06F11/3608Software analysis for verifying properties of programs using formal methods, e.g. model checking, abstract interpretation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/31Programming languages or programming paradigms
    • G06F8/315Object-oriented languages
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • G06F8/75Structural analysis for program understanding
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06NCOMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
    • G06N5/00Computing arrangements using knowledge-based models
    • G06N5/04Inference or reasoning models
    • G06N5/041Abduction

Abstract

本发明提出一种Python语言特征自动识别系统及方法,所述系统包括:AST生成模块;AST访问模块;语言特征识别模块,用于将AST访问模块收集的信息进行计算,与语言特征识别模式进行比对,识别每一个语言特征并且统计语言特征出现的次数;标准库扫描模块,用于扫描使用标准库函数而产生的语言特征;类型推断工具接口模块;报告生成模块,用于在整个扫描以及识别完毕后,输出语言特征的使用报告。本发明分析Python语言规范,总结归类出6大类共22种影响广泛的语言特征;然后提出对这些特征自动识别的方法,进一步分析了各领域对Python语言特征使用的差异以及Python语言特征的总体使用情况,为构建Python编译模块或者基于Python子集的领域专用语言以及分析和优化提供语言特征参考。

Description

一种Python语言特征自动识别系统和方法
技术领域
本发明涉及编程语言和静态分析领域,尤其是一种Python软件中语言特征的自动识别方法。
背景技术
Python是目前非常流行的动态编程语言,它灵活多样的语言特征使得它被广泛用于各个计算机领域。目前已经有一些对不同编程语言的语言特征的研究,研究者们希望借此来发现语言特征在现有软件中的使用方式和缺陷,为进而研制提高编程语言性能和安全性的方法和工具奠定基础。2013年Dyer等人从大量的Java开源项目中研究了Java语言特征的使用情况,2018年Rodrigues等人从28个Ruby项目中分析了开发者对Ruby语言特征的使用方式,2019年Malloy等人研究了Python项目从Python2转向Python3的情况,2016年Lin等人研制工具PyCT对Python项目代码更新进行了细粒度的分析。
对于Python语言,研究者们对渐进定型、反射、元编程等语言特征进行了详细的分析:2012年Aseem Rastogi等人将Python类型推断与渐进定型这一特性结合起来,极大地减轻了开发者类型标注的负担;2019年John Toman等人针对反射、元编程等难以分析的特性构建了可应用于不同语言的Concerto分析框架以支持可靠的程序分析,并在Java子集上进行原型验证。这些工作都从Python语言特征的某些方面做了详细的研究,但不足的是缺乏对Python语言特征整体的系统研究,不能对各类特征自动扫描定位。
除了对Python语言特征的直接研究,目前也有一些针对Python代码执行效率等方面的优化,比如Python编译器Numba(2015年),将Python代码转换为LLVM IR并使用LLVM IR的优化工具链实施优化,以此来提高Python代码的执行效率。然而在将Python源代码转换成LLVM IR时需要进行类型推断,而Heterogenous List这类语言特征会给类型推断带来很大的困难,故Numba的编译仅支持Python子集。
发明内容
为了解决上述技术问题,本发明系统分析Python语言规范,总结归类出6大类共22种影响广泛的语言特征;然后提出对这些特征自动识别的方法并基于此设计和构建了一个Python程序的语言特征扫描系统和方法。本发明进一步使用所述系统分析了8个应用领域的17个Python项目,分析了各个领域对Python语言特征使用的差异以及Python语言特征的总体使用情况,为构建Python编译模块或者基于Python子集的领域专用语言以及分析和优化工具提供语言特征参考;
本发明的技术方案为:一种Python语言特征自动识别系统,包括:
AST生成模块,用于将Python源代码转换成抽象语法树AST;
AST访问模块,用于访问抽象语法树,为每一个AST节点定义访问函数以收集节点的信息;
语言特征识别模块,用于将AST访问模块收集的信息进行计算,与语言特征识别模式进行比对,识别每一个语言特征并且统计语言特征出现的次数;
标准库扫描模块,用于扫描使用标准库函数而产生的语言特征,提供标准库信息;
所述类型推断工具接口模块,用于与外部类型推断工具进行对接;
报告生成模块,用于在整个扫描以及识别完毕后,输出语言特征的使用报告。
进一步的,还包括:
识别模式构建模块,用于针对选定的语言特征,通过分析它们在Python语言规范中的定义,为每一种语言特征构建对应的识别模式,所述识别模式会被语言特征识别模块采用来识别各种语言特征的使用次数;
所述识别模式构建模块所构建的识别模式类型包括简单识别模式和复杂识别模式;
所述简单识别模式是指:对于只需要使用到某一部分的代码信息的语言特征,直接基于源代码来构建识别模式;
所述复杂识别模式包括:
对于需要使用到全局信息,基于计算后的信息构建识别模式,即需要在所有类都扫描完毕并构建继承关系链等信息之后才能明确;
对于需要类型信息进行识别的语言特征,构建基于第三方工具提供的类型信息的识别模式。
对于与Python标准库有关联部分语言特征,构建基于源代码与标准库的共同信息的识别模式。
进一步的,所述语言特征识别模块,基于抽象语法树AST对语言特征进行自动识别,对于每个语言特征,采用如下的四种扫描策略:
1)对于仅限于某个AST节点的语言特征,直接比较特征节点与语言特征的识别模式;
2)对于无法通过特征AST节点识别的语言特征,在遍历时使用继承关系链、函数定义栈和函数调用栈来存储获得的信息,并在遍历后计算收集的信息从而与语言特征识别模式进行比对;
3)对于需要类型推断的语言特征,引入第三方类型推断工具,使用其类型推断结果来与语言特征识别模式比对;
4)对于通过调用Python标准库函数来产生的语言特征,使用标准库扫描模块提前扫描整个Python标准库,总结里面各个函数可能带有的Python语言特征信息并保存成一个缓存文件,当遇到Python标准库函数时,系统会直接在缓存文件中查找。
进一步的,所述Python标准库扫描模块,通过扫描使用标准库函数而产生的语言特征提供标准库信息;标准库扫描模块对每个版本的标准库仅扫描一次,并收集下列三类信息:
1)每一个标准库函数的名字及其所属的类和库文件名;
2)每一个返回异构列表的标准库函数的名字及其所属的类和库文件名;
3)每一个具有参数多态特征的标准库函数的名字及其所属的类和库文件名;
上述三类信息会被存储成一个缓存文件,当系统扫描到标准库函数时,会在该缓存文件中查找对应标准库函数的语言特征使用信息。
根据本发明的另一方面,提出一种Python语言特征自动识别方法,包括如下步骤:
步骤1、标准库扫描,扫描使用标准库函数而产生的语言特征,提供标准库信息;
步骤2、外部类型推断工具对Python文件中的源代码进行类型推断,得到类型推断结果;
步骤3、AST生成,将Python源代码转换成抽象语法树AST;
步骤4、AST访问,通过访问抽象语法树,为每一个AST节点定义访问函数以收集节点的信息;
步骤5、语言特征识别,将AST访问模块收集的信息进行计算,基于标准库扫描得到的信息以及外部类型推断工具得到的类型推断结果,通过语言特征识别模式进行比对,识别每一个语言特征并且统计语言特征出现的次数;
步骤6、报告生成,在整个扫描以及识别完毕后,输出语言特征的使用报告。
进一步的,所述步骤5之前,还包括如下识别模式构建步骤,针对选定的语言特征,通过分析它们在Python语言规范中的定义,为每一种语言特征构建对应的识别模式,所述识别模式会被用来识别各种语言特征的使用次数;
所构建的识别模式类型包括简单识别模式和复杂识别模式,
所述简单识别模式是指:对于只需要使用到某一部分的代码信息的语言特征,直接基于源代码来构建识别模式;
所述复杂识别模式包括:
对于需要使用到全局信息,基于计算后的信息构建识别模式,即需要在所有类都扫描完毕并构建继承关系链之后才能明确;
对于需要类型信息进行识别的语言特征,构建基于第三方工具提供的类型信息的识别模式。
对于与Python标准库有关联部分语言特征,构建基于源代码与标准库的共同信息的识别模式。
进一步的,所述步骤5的语言特征识别具体包括:
基于抽象语法树AST对语言特征进行自动识别,对于每个语言特征,采用如下的四种扫描策略:
1)对于仅限于某个AST节点的语言特征,直接比较特征节点与语言特征的识别模式;
2)对于无法通过特征AST节点识别的语言特征,在遍历时使用继承关系链、函数定义栈和函数调用栈来存储获得的信息,并在遍历后计算收集的信息从而与语言特征识别模式进行比对;
3)对于需要类型推断的语言特征,引入第三方类型推断工具,使用其类型推断结果来与语言特征识别模式比对;
4)对于通过调用Python标准库函数来产生的语言特征,使用标准库扫描模块提前扫描整个Python标准库,总结里面各个函数可能带有的Python语言特征信息并保存成一个缓存文件,当遇到Python标准库函数时,系统会直接在缓存文件中查找。
进一步的,所述步骤1中,Python标准库扫描包括:通过扫描使用标准库函数而产生的语言特征提供标准库信息;标准库扫描对每个版本的标准库仅扫描一次,并收集下列三类信息:
1)每一个标准库函数的名字及其所属的类和库文件名;
2)每一个返回异构列表的标准库函数的名字及其所属的类和库文件名;
3)每一个具有参数多态特征的标准库函数的名字及其所属的类和库文件名;
上述三类信息会被存储成一个缓存文件,当系统扫描到标准库函数时,会在该缓存文件中查找对应标准库函数的语言特征使用信息
有益效果:
本发明输出Python项目中每一个Python源文件使用到的语言特征的情况。能够快速让开发者和研究人员了解其所在领域的Python项目的语言特征使用情况,为他们使用或修改这些语言特征提供了参考和依据;同时,为构建Python编译器或者基于Python子集的领域专用语言以及分析和优化工具提供了必要的帮助。
附图说明
图1Python总体语言特征使用情况;
图2分领域语言特征使用情况;
图3本发明的系统的结构图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整的描述,显然,所描述的实施例仅为本发明的一部分实施例,而不是全部的实施例,基于本发明中的实施例,本领域的普通技术人员在不付出创造性劳动的前提下所获得的所有其他实施例,都属于本发明的保护范围。
图1给出了系统对8大类17个主流Python项目扫描后得出的总体语言特征使用图,涵盖了数据科学、机器学习、自动驾驶、图像处理等热门领域的主流应用。从图中可以看出关键字参数(keyword argument)的使用占绝大多数。
图2进一步给出了每个计算机领域内的Python项目使用的语言特征的情况对比。可以看到,每个领域都使用了一些其他领域不常使用的语言特征,比如Home Assistant代表的智能家居领域对装饰模块(decorator)和保护变量(protected variables)的使用占比很高。
本发明能让Python开发者迅速地了解所处领域Python项目的语言特征使用情况,为他们的代码编写以及软件优化提供参考。同时本发明的系统能为Python编译器设计者提供直观的语言特征使用信息,为他们选取Python子集或者优化Python代码的执行提供必要帮助,可以作为编译器设计及程序分析的辅助工具。
如图3所示,加粗实线方框表示系统的组成部分:抽象语法树生成模块(ASTGenerator)、抽象语法树访问模块(AST Visitor)、标准库扫描模块(Standard LibraryScanner)、类型推断工具(Type Inference Tool)以及语言特征识别模块(LanguageFeature Recognizer)。
虚线方框表示数据中间结果,AST访问模块为语言特征识别模块提供源文件中的函数/类信息,标准库扫描模块为语言特征识别模块提供标准库的函数/类信息,类型推断工具为语言特征识别模块提供类型推断结果。
根据本发明的一个实施例,如图3所示,提出一种Python语言特征自动识别系统,包括:
AST生成模块,用于将Python源代码转换成抽象语法树AST;
AST访问模块,用于访问抽象语法树,为每一个AST节点定义访问函数以收集节点的信息;
语言特征识别模块用于将AST访问模块收集的信息进行计算,与语言特征识别模式进行比对,识别每一个语言特征并且统计语言特征出现的次数;
标准库扫描模块,用于扫描使用标准库函数而产生的语言特征,提供标准库信息;
类型推断工具接口模块,用于与外部类型推断工具进行对接;
报告生成模块,用于在整个扫描以及识别完毕后,输出语言特征的使用报告。
系统使用Python标准ast模块来将Python源代码转换成抽象语法树(AST),同时ast模块提供了AST访问模块astVisitor类,系统在此基类上为每一个AST节点定义访问函数以收集节点的信息,收集的信息将会被语言特征识别模块计算后,与语言特征识别模式进行比对,来扫描语言特征的使用情况。
本发明的系统给类型推断工具提供了接口,目前选定PySonar2作为默认的类型推断工具,因为它是目前较为精确快速的Python类型推断工具之一,PySonar2可以被替换成其他的类型推断工具。系统的语言特征识别模块按照上述识别模式来精准识别每一个语言特征并且统计语言特征出现的次数,当整个扫描以及识别完毕后,会输出语言特征的使用报告。根据文献调研以及Python官方文档分析,本发明设计的系统支持6大类共22个语言特征的扫描,包括:
1)函数调用及参数传递(Function Call&Parameter Passing):仅位置(position-only)/关键字(keyword)/仅关键字(keyword-only)参数,递归(recursion),嵌套定义的函数(nested function),异常(exception),打包和解包参数(packing andunpacking arguments),修饰器(decorator)
2)类型系统(Type System):一等函数(first class function),渐进定型(gradual typing)
3)循环和求值策略(Loop&Evaluation Strategy):生成器(generator),循环(loop)
4)面向对象编程(Object-oriented Programming):嵌套类(nested classes),继承(inheritance),多态(polymorphism),封装(encapsulation)
5)数据结构(Data Structure):列表解析(list comprehension),异质列表/元组(heterogeneous list/tuple)
6)元编程(Metaprogramming):内省(introspection),反射(reflection),元类(metaclass)
这些特征对Python软件或者项目会产生不同的影响。Heterogeneous List/Tuple会影响Python的类型推断,给一些需要使用类型推断来帮助优化代码的编译器研发等带来很大的困难,同时也可能造成类型错误从而降低程序安全性;递归recursion和循环loop则会显著地影响程序的性能;封装encapsulation,渐进定型gradual typing则可以增强Python软件的安全性;其他语言特征也从性能、可维护性、可修改性、可移植性、可靠性等方面影响Python软件。
所述的语言特征识别模式构建模块,针对上述选定的语言特征,通过分析它们在Python语言规范中的定义,为每一种语言特征构建对应的识别模式,这些识别模式会被系统中的语言特征识别模块采用来识别各种语言特征的使用次数。
大部分语言特征的识别只需要使用到某一部分的代码信息,对于这部分语言特征可以直接基于源代码来构建识别模式。但仍然存在一些语言特征需要使用更加复杂的识别模式:
1)有些语言特征的识别需要使用到全局信息,比如继承inheritance和递归recursion,inheritance指两个类之间的继承关系,需要在所有类都扫描完毕并构建继承关系链之后才能明确;recursion分为函数间递归和函数内递归,函数内递归可以通过分析一个函数体来发现,但是函数间递归则同样需要等到所有函数扫描完毕之后才能计算。这些特征的识别模式不基于源代码直接提供的信息,而是基于计算后的信息。
2)有少量语言特征需要类型信息,比如为了扫描heterogeneous list需要知道列表中每个元素的类型信息,由于Python使用动态类型检查,这类信息在源代码中无法直接获取,需要使用第三方工具来生成,故这类语言特征的识别模式构建基于第三方工具提供的类型信息。
3)部分语言特征的使用与Python标准库有关联,比如参数多态这类特征经常通过调用标准函数实现,故这类语言特征的识别模式构建基于源代码与标准库的共同信息。
下面列举一些复杂的语言特征的识别模式:
1)参数多态
实际中有两种参数多态的使用情况:Python程序直接从Python的标准库调用具有参数多态特性的函数,并且在源代码中不存在它们的定义;或者Python程序中定义了一些函数,对其的调用体现了参数多态特性。对于第一种情况,系统提前扫描Python的标准库(v3.8.2),查找具有参数多态特性的所有标准函数,并将这些信息预先以标准库摘要的形式存储为文件。当系统在源代码的函数调用中找不到被调用函数的定义时,它将转而搜索标准库摘要来确定这个函数是否是标准库函数。对于第二种情况,系统使用类型推断工具(如PySonar2)来帮助推断函数的类型。如果一个函数可以接受不止一种类型的参数,则类型推断工具会列出所有可能的参数类型。因此,系统会检查类型推断工具给出的参数类型,以找到具有参数多态特性的用户自定义函数。
系统提供类型检查(check_type)等函数作为与类型推断工具的接口,在扫描过程中,系统仅会调用这些函数而不是直接调用类型推断工具。用户在这些函数内部定义与第三方类型推断工具交互的代码,从而可以更换不同的类型推断工具而不影响系统的扫描。
2)嵌套函数
为了找到所有嵌套函数,系统维护一个函数定义栈。每当系统访问到函数定义节点时,都会将函数名压栈,并在退出该节点时将其弹出。如果没有嵌套函数,栈的深度会始终小于等于1。当系统访问到新的函数定义节点并且栈的深度为1或更大时,即可知道这个函数一定是在另一个函数中定义的。而每碰到一个这样的函数定义节点,系统都会增加嵌套函数的语言特性计数器。
3)递归
为了找到Python软件中所有的递归案例,系统在访问Python程序对应的抽象语法树(AST)时收集了函数的调用关系,其中包括每个函数及其定义中所调用的函数。每个函数调用在Python的AST中都表示为一个节点Call,系统会在每次访问该节点时记录调用关系(重复的调用关系会被删除以节省计算时间和内存使用)。在计算递归时,系统从一个函数开始实施深度优先搜索(DFS)以构建从该函数开始的所有调用链,即从函数A出发,寻找函数A调用的所有函数,再从这些函数出发,寻找这些函数调用的函数,以此类推。如果函数A再次出现在任何一个以A开始的调用链中,系统就能够确定这条调用链中出现了递归的情况并且增加递归的计数器。
所述的语言特征自动识别模块,基于抽象语法树(AST)对语言特征进行自动识别,对于每个语言特征,有如下的四种扫描策略:
1)对于仅限于某个AST节点的语言特征,直接比较特征节点与语言特征的识别模式:比如loop特性有关键字for,while等,关键字(keyword)/仅关键字(keyword-only)/仅位置(position-only)参数特性AST节点有特定域存储。
2)对于无法通过特征AST节点识别的语言特征,系统在遍历时使用继承关系链、函数定义栈和函数调用栈来存储获得的信息,并在遍历后计算收集的信息从而与语言特征识别模式进行比对。比如inheritance特征有5类:单继承(single inheritance)、多重继承(multiple inheritance)、层次继承(hierarchical inheritance)、多级继承(multilevelinheritance)、菱形继承(diamond inheritance),系统在遍历AST的同时构建类之间的继承关系链,在整个AST扫描完毕后通过深度优先遍历的方式使用继承关系链计算继承关系。
3)对于需要类型推断的语言特征,引入第三方类型推断工具,如PySonar2,使用它的类型推断结果来与语言特征识别模式比对:比如heterogeneous list,识别它需要判断一个list是否含有多种不同类型的元素,这时系统会借助类型推断工具来帮助推断元素的类型。对于一等函数first-class function,系统根据类型推断工具对函数参数、返回值以及赋值语句右值的类型是否为函数的推断来进行识别。
4)对于通过调用Python标准库函数来产生的语言特征,系统使用标准库扫描模块提前扫描整个Python标准库,总结里面各个函数可能带有的Python语言特征信息并保存成一个缓存文件,当遇到Python标准库函数时,系统会直接在缓存文件中查找。
所述的Python标准库扫描模块,作为系统的一个组成部分,为系统在扫描那些使用标准库函数而产生的语言特征提供标准库信息。系统并非在每次扫描Python项目时都调用Python标准库扫描模块,因为Python标准库相对来说比较稳定,短时间内不会发生较大的修改。所以系统的Python标准库扫描模块对每个版本的标准库仅扫描一次,并收集下列三类信息:
1)每一个标准库函数的名字及其所属的类和库文件名;
2)每一个返回异构列表的标准库函数的名字及其所属的类和库文件名;
3)每一个具有参数多态特征的标准库函数的名字及其所属的类和库文件名。
这三类信息会被存储成一个缓存文件,当系统扫描到标准库函数时,会在该缓存文件中查找对应标准库函数的语言特征使用信息。
实施方式1
本发明以一等函数这一语言特征的扫描为例说明具体的实施方法。系统扫描语言特征分为三个阶段:
1)阶段一:类型推断及类型结果分析
系统接受Python源文件作为输入。当给它一个Python源文件时,它首先使用类型推断工具如PySonar2生成该文件的类型推断结果,因为我们将需要这样的结果来帮助扫描某些与变量类型相关的语言特性。PySonar2的结果是HTML文件,其最初目标是在Web浏览模块中将结果可视化,以便开发人员轻松地检查推断结果。而系统首先分析这些HTML文件并提取数据以形成扫描过程中所需的信息(lineno,name,type)。该元组包括三个元素:该标识符在源代码中的行号、该标识符的名称、该标识符的类型。Python中的每个AST节点都有一个名为lineno的字段,该字段指示此节点在源代码中的位置,因此系统可以快速匹配AST节点中的行号和类型推断结果。
2)阶段二:AST遍历及源代码信息收集
得到并分析类型推断工具的类型推断结果之后,系统将Python源代码编译成AST。然后,系统遍历AST并收集语言特性模式匹配所需的信息。在此阶段中,系统扫描所有表示函数调用的AST节点,在类型推断工具提供的类型推断结果中根据行号查找每个函数调用中参数的类型、函数定义中返回值的类型以及赋值语句中右值的类型,并将其传递给语言特征识别模块。
3)阶段三:语言特性模式匹配及报告生成
语言特征识别模块得到了AST访问模块传递过来的类型信息后,逐个检查类型是否为函数类型。一等函数的识别模式是函数作为参数、返回值或者右值赋给变量。如果发现有函数类型,则将该项目中一等函数这一语言特征的计数器加1。
尽管上面对本发明说明性的具体实施方式进行了描述,以便于本技术领域的技术人员理解本发明,且应该清楚,本发明不限于具体实施方式的范围,对本技术领域的普通技术人员来讲,只要各种变化在所附的权利要求限定和确定的本发明的精神和范围内,这些变化是显而易见的,一切利用本发明构思的发明创造均在保护之列。

Claims (8)

1.一种Python语言特征自动识别系统,其特征在于,包括:
AST生成模块,用于将Python源代码转换成抽象语法树AST;
AST访问模块,用于访问抽象语法树,为每一种AST节点定义访问函数以收集节点的信息;
语言特征识别模块,用于将AST访问模块收集的信息进行计算,与语言特征识别模式进行比对,识别每一个语言特征并且统计语言特征出现的次数;
标准库扫描模块,用于扫描使用标准库函数而产生的语言特征,提供标准库信息;
所述类型推断工具接口模块,用于与外部类型推断工具进行对接;
报告生成模块,用于在整个扫描以及识别完毕后,输出语言特征的使用报告。
2.根据权利要求1所述的一种Python语言特征自动识别系统,其特征在于,还包括:
识别模式构建模块,用于针对选定的语言特征,通过分析它们在Python语言规范中的定义,为每一种语言特征构建对应的识别模式,所述识别模式会被语言特征识别模块采用以识别各种语言特征的使用次数;
所述识别模式构建模块所构建的识别模式类型包括简单识别模式和复杂识别模式,
所述简单识别模式是指:对于只需要使用到某一部分的代码信息的语言特征,直接基于源代码来构建识别模式;
所述复杂识别模式包括:
对于需要使用到全局信息,基于计算后的信息构建识别模式,即需要在所有类都扫描完毕并构建继承关系链信息之后才能明确;
对于需要类型信息进行识别的语言特征,构建基于第三方工具提供的类型信息的识别模式。
对于与Python标准库有关联的语言特征,构建基于源代码与标准库的共同信息的识别模式。
3.根据权利要求1所述的一种Python语言特征自动识别系统,其特征在于,所述语言特征识别模块,基于抽象语法树AST对语言特征进行自动识别,对于每个语言特征,采用如下的四种扫描策略:
1)对于仅限于某个AST节点的语言特征,直接比较特征节点与语言特征的识别模式;
2)对于无法通过特征AST节点识别的语言特征,在遍历时使用继承关系链、函数定义栈和函数调用栈来存储获得的信息,并在遍历后计算收集的信息从而与语言特征识别模式进行比对;
3)对于需要类型推断的语言特征,引入第三方类型推断工具,使用其类型推断结果来与语言特征识别模式比对;
4)对于通过调用Python标准库函数来产生的语言特征,使用标准库扫描模块提前扫描整个Python标准库,总结里面各个函数可能带有的Python语言特征信息并保存成一个缓存文件,当遇到Python标准库函数时,系统会直接在缓存文件中查找。
4.根据权利要求1所述的一种Python语言特征自动识别系统,其特征在于,所述Python标准库扫描模块,通过扫描使用标准库函数而产生的语言特征提供标准库信息;标准库扫描模块对每个版本的标准库仅扫描一次,并收集下列三类信息:
1)每一个标准库函数的名字及其所属的类和库文件名;
2)每一个返回异构列表的标准库函数的名字及其所属的类和库文件名;
3)每一个具有参数多态特征的标准库函数的名字及其所属的类和库文件名;
上述三类信息会被存储成一个缓存文件,当系统扫描到标准库函数时,会在该缓存文件中查找对应标准库函数的语言特征使用信息。
5.一种Python语言特征自动识别方法,其特征在于,包括如下步骤:
步骤1、标准库扫描,扫描使用标准库函数而产生的语言特征,提供标准库信息;
步骤2、外部类型推断工具对Python文件中的源代码进行类型推断,得到类型推断结果;
步骤3、AST生成,将Python源代码转换成抽象语法树AST;
步骤4、AST访问,通过访问抽象语法树,为每一个AST节点定义访问函数以收集节点的信息;
步骤5、语言特征识别,将AST访问模块收集的信息进行计算,基于标准库扫描得到的信息以及外部类型推断工具得到的类型推断结果,通过语言特征识别模式进行比对,识别每一个语言特征并且统计语言特征出现的次数;
步骤6、报告生成,在整个扫描以及识别完毕后,输出语言特征的使用报告。
6.根据权利要求5所述的一种Python语言特征自动识别方法,其特征在于,所述步骤5之前,还包括如下识别模式构建步骤,针对选定的语言特征,通过分析它们在Python语言规范中的定义,为每一种语言特征构建对应的识别模式,所述识别模式会被用来识别各种语言特征的使用次数;
所构建的识别模式类型包括简单识别模式和复杂识别模式,
所述简单识别模式是指:对于只需要使用到某一部分的代码信息的语言特征,直接基于源代码来构建识别模式;
所述复杂识别模式包括:
对于需要使用到全局信息,基于计算后的信息构建识别模式,即需要在所有类都扫描完毕并构建继承关系链之后才能明确;
对于需要类型信息进行识别的语言特征,构建基于第三方工具提供的类型信息的识别模式。
对于与Python标准库有关联部分语言特征,构建基于源代码与标准库的共同信息的识别模式。
7.根据权利要求5所述的一种Python语言特征自动识别方法,其特征在于,所述步骤5的语言特征识别具体包括:
基于抽象语法树AST对语言特征进行自动识别,对于每个语言特征,采用如下的四种扫描策略:
1)对于仅限于某个AST节点的语言特征,直接比较特征节点与语言特征的识别模式;
2)对于无法通过特征AST节点识别的语言特征,在遍历时使用继承关系链、函数定义栈和函数调用栈来存储获得的信息,并在遍历后计算收集的信息从而与语言特征识别模式进行比对;
3)对于需要类型推断的语言特征,引入第三方类型推断工具,使用其类型推断结果来与语言特征识别模式比对;
4)对于通过调用Python标准库函数来产生的语言特征,使用标准库扫描模块提前扫描整个Python标准库,总结里面各个函数可能带有的Python语言特征信息并保存成一个缓存文件,当遇到Python标准库函数时,系统会直接在缓存文件中查找。
8.根据权利要求5所述的一种Python语言特征自动识别方法,其特征在于,所述步骤1中,Python标准库扫描包括:通过扫描使用标准库函数而产生的语言特征提供标准库信息;标准库扫描对每个版本的标准库仅扫描一次,并收集下列三类信息:
1)每一个标准库函数的名字及其所属的类和库文件名;
2)每一个返回异构列表的标准库函数的名字及其所属的类和库文件名;
3)每一个具有参数多态特征的标准库函数的名字及其所属的类和库文件名;
上述三类信息会被存储成一个缓存文件,当系统扫描到标准库函数时,会在该缓存文件中查找对应标准库函数的语言特征使用信息。
CN202010663123.9A 2020-07-10 2020-07-10 一种Python语言特征自动识别系统和方法 Active CN111858322B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202010663123.9A CN111858322B (zh) 2020-07-10 2020-07-10 一种Python语言特征自动识别系统和方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202010663123.9A CN111858322B (zh) 2020-07-10 2020-07-10 一种Python语言特征自动识别系统和方法

Publications (2)

Publication Number Publication Date
CN111858322A true CN111858322A (zh) 2020-10-30
CN111858322B CN111858322B (zh) 2022-01-11

Family

ID=73153759

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202010663123.9A Active CN111858322B (zh) 2020-07-10 2020-07-10 一种Python语言特征自动识别系统和方法

Country Status (1)

Country Link
CN (1) CN111858322B (zh)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113031931A (zh) * 2021-03-04 2021-06-25 嘉兴丰鸟科技有限公司 一种基于脚本交叉编译的Python安全扩展方法
CN116069669A (zh) * 2023-03-07 2023-05-05 中国科学技术大学 全自动分布式一致性的分析方法、系统、设备及存储介质

Citations (13)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6848085B2 (en) * 1997-09-16 2005-01-25 Synopsys, Inc. System for converting hardware designs in high-level programming languages to hardware implementations
CN101398758A (zh) * 2008-10-30 2009-04-01 北京航空航天大学 一种代码抄袭的检测方法
CN102419728A (zh) * 2011-11-01 2012-04-18 北京邮电大学 基于覆盖率量化指标确定软件测试过程充分性的方法
WO2014194237A2 (en) * 2013-05-30 2014-12-04 Veracode, Inc. Systems and methods for remote analysis of software applications
CN106020950A (zh) * 2016-05-12 2016-10-12 中国科学院软件研究所 基于复杂网络分析的函数调用图关键节点识别和标识方法
CN106940654A (zh) * 2017-02-15 2017-07-11 南京航空航天大学 源代码中内存错误的自动检测和定位方法
CN107239396A (zh) * 2017-05-11 2017-10-10 东南大学 一种基于代码圈复杂度度量的软件演化评估方法
CN107391368A (zh) * 2017-07-13 2017-11-24 中国航发控制系统研究所 一种航空机载软件中源代码与目标代码一致性的分析方法
CN107688742A (zh) * 2017-08-09 2018-02-13 中国地质大学(武汉) 大规模快速移动应用app检测和分析方法
CN107704382A (zh) * 2017-09-07 2018-02-16 北京信息科技大学 面向Python的函数调用路径生成方法和系统
CN109062792A (zh) * 2018-07-21 2018-12-21 东南大学 一种基于串匹配和特征匹配的开源代码检测方法
CN109857648A (zh) * 2019-01-14 2019-06-07 复旦大学 一种api误用的变更模式挖掘方法
CN110750297A (zh) * 2019-10-11 2020-02-04 南京大学 一种基于程序分析和文本分析的Python代码参考信息生成方法

Patent Citations (13)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6848085B2 (en) * 1997-09-16 2005-01-25 Synopsys, Inc. System for converting hardware designs in high-level programming languages to hardware implementations
CN101398758A (zh) * 2008-10-30 2009-04-01 北京航空航天大学 一种代码抄袭的检测方法
CN102419728A (zh) * 2011-11-01 2012-04-18 北京邮电大学 基于覆盖率量化指标确定软件测试过程充分性的方法
WO2014194237A2 (en) * 2013-05-30 2014-12-04 Veracode, Inc. Systems and methods for remote analysis of software applications
CN106020950A (zh) * 2016-05-12 2016-10-12 中国科学院软件研究所 基于复杂网络分析的函数调用图关键节点识别和标识方法
CN106940654A (zh) * 2017-02-15 2017-07-11 南京航空航天大学 源代码中内存错误的自动检测和定位方法
CN107239396A (zh) * 2017-05-11 2017-10-10 东南大学 一种基于代码圈复杂度度量的软件演化评估方法
CN107391368A (zh) * 2017-07-13 2017-11-24 中国航发控制系统研究所 一种航空机载软件中源代码与目标代码一致性的分析方法
CN107688742A (zh) * 2017-08-09 2018-02-13 中国地质大学(武汉) 大规模快速移动应用app检测和分析方法
CN107704382A (zh) * 2017-09-07 2018-02-16 北京信息科技大学 面向Python的函数调用路径生成方法和系统
CN109062792A (zh) * 2018-07-21 2018-12-21 东南大学 一种基于串匹配和特征匹配的开源代码检测方法
CN109857648A (zh) * 2019-01-14 2019-06-07 复旦大学 一种api误用的变更模式挖掘方法
CN110750297A (zh) * 2019-10-11 2020-02-04 南京大学 一种基于程序分析和文本分析的Python代码参考信息生成方法

Non-Patent Citations (5)

* Cited by examiner, † Cited by third party
Title
HAN WAN等: "Token-based Approach for Real-time Plagiarism Detection in Digital Designs", 《2018 IEEE FRONTIERS IN EDUCATION CONFERENCE (FIE)》 *
MINGLEZHE HU等: ""The Python/C API:Evolution, Usage Statistics, and Bug Patterns"", 《2020 IEEE 27TH INTERNATIONAL CONFERENCE ON SOFTWARE ANALYSIS, EVOLUTION AND REENGINEERING (SANER)》 *
WEI LIN等: ""An Empirical Study on the Characteristics of Python Fine-Grained Source Code Change Types"", 《2016 IEEE INTERNATIONAL CONFERENCE ON SOFTWARE MAINTENANCE AND EVOLUTION (ICSME)》 *
单征等: "一种源码级的上下文敏感性检测算法", 《计算机应用研究》 *
陈俊浩等: ""一种静态的编译器重复缺陷报告识别方法"", 《中国科学:信息科学》 *

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113031931A (zh) * 2021-03-04 2021-06-25 嘉兴丰鸟科技有限公司 一种基于脚本交叉编译的Python安全扩展方法
CN116069669A (zh) * 2023-03-07 2023-05-05 中国科学技术大学 全自动分布式一致性的分析方法、系统、设备及存储介质

Also Published As

Publication number Publication date
CN111858322B (zh) 2022-01-11

Similar Documents

Publication Publication Date Title
Christensen et al. Precise analysis of string expressions
Reps et al. The semantics of program slicing and program integration
EP2350867B1 (en) Tree-based directed graph programming structures for a declarative programming language
Clifton et al. MultiJava: Design rationale, compiler implementation, and applications
US8762942B2 (en) Bidirectional type checking for declarative data scripting language
Gargantini et al. A metamodel-based language and a simulation engine for abstract state machines.
US20130263099A1 (en) Common intermediate representation for data scripting language
US20100088672A1 (en) Compact syntax for data scripting language
Peng et al. An empirical study for common language features used in python projects
WO2010042372A2 (en) Programming language with extensible syntax
CN111858322B (zh) 一种Python语言特征自动识别系统和方法
US9292586B2 (en) System and method for synchronizing a repository with a declarative defintion
Di Cosmo et al. Strong normalization of explicit substitutions via cut elimination in proof nets
Zanoni Data mining techniques for design pattern detection.
Zhao et al. Pattern-based design evolution using graph transformation
Palsberg et al. Efficient and flexible matching of recursive types
Barzdins et al. Model transformation languages and their implementation by bootstrapping method
CN115357251A (zh) 一种移动端iOS开发数据转模型的方法
CN115310095A (zh) 一种区块链智能合约混合形式化验证方法及系统
Gammaitoni et al. Agile validation of higher order transformations using F-Alloy
Lange dACL: the deep constraint and action language for static and dynamic semantic definition in Melanee
Waite Beyond LEX and YACC: How to generate the whole compiler
Maschotta et al. An OCL Implementation for Model-Driven Engineering of C++
Gil et al. Ties between Parametrically Polymorphic Type Systems and Finite Control Automata
CN117472776A (zh) 一种基于ast的框架自适应c++单元测试用例自动化生成方法及系统

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
GR01 Patent grant
GR01 Patent grant