Page 30 - 《软件学报》2025年第4期
P. 30

1436                                                       软件学报  2025  年第  36  卷第  4  期


                 pairs of the flask and pandas libraries. Subsequently, an empirical study is conducted on the collected data, summarizing the symptoms and
                 causes  of  compatibility  issues.  Finally,  this  study  proposes  a  static  analysis-based  detection  method  for  incompatible  Python  APIs,
                 providing  syntactic-level  causes  of  incompatible  API  issues.  This  study  conducts  experimental  evaluations  on  12  version  pairs  of  4  popular
                 Python  third-party  libraries.  The  results  show  that  the  proposed  method  is  good  in  effectiveness,  generalization,  time  performance,  memory
                 performance, and usefulness.
                 Key words:  Python; static analysis; third-party libraries; API compatibility issues; version evolution

                    作为目前最受欢迎的编程语言之一, Python           以其丰富的第三方库开发生态, 受到了众多开发者的青睐. 第三方
                 库开发者通过对代码底层逻辑的封装, 使得上层应用开发者只需关心相应的                         API 调用, 从而可以实现快速开发, 大
                 大提升了开发效率       [1] . 然而, Python  的第三方库会因为缺陷修复、功能新增和代码重构等原因而频繁发生更新和
                 迭代. 更新版本的代码中存在对已有版本              API 的变更, 这些变更可能对        API 进行不兼容更改, 从而导致调用该
                 API 的上层应用项目在更新第三方库版本后出现异常终止或者产生不一致的结果                          [2] . 因此, 理解  Python  第三方库
                 API 兼容性问题, 实现相应的不兼容         API 检测方法, 可以有效避免因兼容性问题导致的错误, 保障软件正常可靠运
                 行. 当上层应用开发者调用        Python  第三方库的某一函数、某一类或某一类的成员函数时, 第三方库内部会形成一
                    在实证研究的基础上, 本文提出了一种基于静态分析技术的
                 个调用链, 调用链中涉及此第三方库多个文件中的函数、类以及类的成员函数. 为探求第三方库兼容性问题的细
                 粒度产生原因, 并实现对应的检测方法, 本文中的              API 包括第三方库源代码中的所有函数以及所有类的成员函数.
                    针对  Python  第三方库  API 兼容性问题, 目前相关的研究工作          [2−4] 存在一定的局限性. 在   Python  不兼容  API 的
                 数据收集方面, 现有研究通过分析第三方库的更新日志来获取存在兼容性问题的                           API. 然而, 这种方式严重依赖于
                 开发者记录更新日志的质量, 往往无法搜集得到所有存在兼容性问题的                        API. 在问题产生原因方面, 现有研究对
                 Python  第三方库  API 兼容性问题的认识还不够充分, 例如, Python         参数包含   5  种类别, 但暂未有工作系统对其中
                 的可变参数、命名关键字参数、关键字参数进行细粒度分析, 未有静态检测方法可以输出这些兼容性问题的细粒
                 度原因. 此外, 除了    Python  生态, 研究人员还对   Java、Android  等生态系统展开了研究      [5−15] . 然而, Python  作为动态
                 语言, 与  Java 等静态语言存在显著的区别        [16] . 例如  Python  语言的弱类型特性、方法参数可变的特性等, 导致对静
                 态语言第三方库      API 的兼容性问题检测方法无法直接应用到             Python  第三方库中.
                    为探求   Python  兼容性问题的细粒度产生原因并实现检测兼容性问题的静态方法, 本文首先采用收集版本更
                 新日志与运行回归测试相结合的方法来构建                Python  第三方库不兼容   API 的数据集, 从而弥补文献       [2,3] 因更新日
                 志记录不完整导致的不兼容          API 数据集不全的问题. 最终, 本文在        flask  库  [17] 和  pandas 库  [18] 的  6  个版本对共收集
                 到  108 个不兼容  API 对. 其中, 70 个  (64.8%) 不兼容  API 对通过运行回归测试收集, 其余      38 个  (35.2%) 不兼容  API
                 对通过阅读版本更新日志进行补充. 然后, 本文对               Python  第三方库  API 兼容性问题进行了实证研究, 通过分析
                 108  个不兼容  API 对, 总结了  API 兼容性问题的表现形式和产生原因. 表现形式是从第三方库调用者的角度进行
                 分析, 而产生原因是从第三方库开发者的角度进行分析. 为提升数据的可信度, 收集不兼容                           API 对以及根据表现形
                 式和产生原因分类不兼容         API 对均由本文第一作者和第二作者完成. 当出现分歧时, 由本文第三作者组织小组讨
                 论, 并决定最终结果. 与文献       [2,3] 不同的是, 本文增加了对     API 兼容性问题表现形式的分析, 同时在分析产生原因
                 时增加了与异常有关的兼容性问题, 并对             Python  的  5  种参数进行了逐一分析.
                                                                   Python  第三方库  API 兼容性问题检测方法. 方法
                 的输入为   Python  第三方库在更新前后两个版本的源代码, 通过语句级别的数据流、控制流切片分析, 最终输出为
                 句法层面的兼容性问题产生原因集合.
                    最后, 本文在    flask  库等  4  个常用  Python  第三方库的共计  12  个版本对上进行了实验评估. 评估结果证明本文
                 方法具有较好的有效性、泛化性、时间性能、空间性能以及易用性. 在有效性上, 方法的精准率和召回率分别达到
                 了  92.87%  和  93.79%. 在新构建的数据集上, 精准率和召回率分别为          88.65%  和  94.59%, 这表明方法具有良好的泛
                 化性. 在时间性能和空间性能上, 检测这           12  个版本对的   5 243  个变更  API 共耗时  30 858.09 s, 共占用内存  1 494.24
                 MB, 平均每个版本对的检测大约需要耗时             42.86 min、占用  124.52 MB  的内存. 此外, 本文邀请了    10  名有经验的
                 Python  开发者在不兼容   API 上进行人工实验, 结果表明本文方法有良好的易用性.
   25   26   27   28   29   30   31   32   33   34   35