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

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


                 内部代码, 本文提取了多种代码信息, 包括取语句匹配信息                  M、参数信息     P、返回值信息      R、异常流信息     E、切
                 片信息   S  以及条件分支信息     B. 未来可以考虑增加过程间分析, 通过          API 调用链分析充分利用       API 外部代码, 并对
                 语句语义进行细粒度分析, 从而充分利用             API 外部代码、内部代码的语义信息.
                    (2) 泛化性威胁. 对本文方法泛化性的威胁主要与              Python  第三方库及其版本对的选择有关. 在构建数据集时,
                 为确保   API 兼容性标注的准确性, 本文采用将回归测试和更新日志相结合的方法, 构建时间成本较高. 因此, 本文
                 只选择了   4  个常用  Python  第三方库的  12  个版本对进行实验评估. 为了减少第三方库及其版本选择造成的泛化性
                 威胁, 在第三方库的选择上, 本文选择了           4  个不同领域的常用第三方库, 分别是          Web  开发领域的   flask  库、数据分
                 析领域的   pandas 库、机器学习领域的       sklearn  库、科学计算领域的     numpy  库; 在版本对的选择上, 本文对每个第
                 三方库均选取最新的跨        major 版本对、跨    minor 版本对、跨   patch  版本对. 未来可以考虑在更多第三方库、更多
                 版本对上构建数据集, 并进行更深入的实验评估.

                 5.2   应用局限性分析
                    本文提出的方法虽然能够根据兼容性问题产生原因检测出不兼容                       API, 但需要被提供第三方库前后两个版本
                 的源代码才会进行兼容性问题的检测, 在实际应用中存在局限性. 未来可以考虑通过将本方法集成到持续集成/持
                 是否存在兼容性问题, 进一步提升方法的实时检测能力.
                 续部署   (CI/CD) 流程的工具中来提升方法的实时检测能力. 具体来说, 在构建时自动拉取第三方库                        commit 的源代
                 码, 并计算出变更     API 的列表. 当开发者需要某       API 的兼容性问题信息时, 工具立即检测此            API, 从而实现实时或
                 近实时的不兼容      API 检测.

                 6   总 结

                    Python  第三方库会频繁发生更新, 其中部分          API 发生了不兼容的更改, 导致上层应用运行出现异常终止或者
                 产生不一致的结果. 本文围绕         Python  第三方库  API 的兼容性问题展开研究. 首先, 本文采用更新日志与回归测试
                 结合的方法在     flask  库和  pandas 库的  6  个版本对上构建兼容性问题的数据集. 接着, 本文根据收集到的数据对
                 Python  第三方库  API 兼容性问题进行实证研究, 分析兼容性问题的表现形式和产生原因. 最后, 本文提出了一种
                 基于静态分析技术的        Python  第三方库  API 兼容性问题检测方法. 本文在        4  个常用  Python  第三方库的共计   12  个
                 版本对上进行了实验评估, 证明了该方法的具有良好的有效性、泛化性、时间性能、空间性能以及易用性. 本文
                 提出的检测方法能根据兼容性问题的产生原因检测出不兼容                     API, 但仍存在改进空间, 对方法的未来展望如下.
                    (1) 提升方法的有效性. 制约本文方法有效性的主要因素有两个: 一是方法主要分析                        API 内部代码, 没有充分
                 利用  API 外部代码, 比如未分析      API 内部所调用的其它       API 代码; 二是方法在语句级别进行匹配分析, 未充分利
                 用  API 内部的语义信息. 未来可以考虑增加过程间分析, 通过               API 调用链分析充分利用       API 外部代码, 并对语句
                 语义进行细粒度分析, 从而充分利用           API 外部代码、内部代码的语义信息.
                    (2) 提升方法的实用性. 本文方法是从第三方库的版本级别出发, 检测两个不同版本中存在兼容性问题的                               API.
                 未来可以考虑将本文方法的应用场景拓宽到代码提交级别, 将方法集成到持续集成/持续部署                              (CI/CD) 流程的工具
                 中. 具体来说, 在构建时自动拉取第三方库代码提交前后的源代码, 计算出变更                       API 的列表, 并检测这些变更       API


                    (3) 提升方法的通用性. 本文是在        Python  生态中研究了第三方库       API 的兼容性问题, 并提出了基于静态分析
                 的  Python  第三方库  API 兼容性问题的检测方法. 未来可以考虑在           JavaScript、Java 等其它语言生态中收集第三方
                 库的不兼容    API 对, 探究本文实证研究结果的通用性. 然后根据具体语言特性对本文方法进行扩展, 将方法推广到
                 其它语言生态中. 例如, Java 语言没有关键字参数, 所以不存在关键字参数的键增删                     (CI2) 导致的兼容性问题.

                 References:
                  [1]  Islam M, Jha AK, Nadi S, Akhmetov I. PyMigBench: A benchmark for python library migration. In: Proc. of the 20th Int’l Conf. on
                     Mining Software Repositories (MSR). Melbourne: IEEE, 2023. 511–515. [doi: 10.1109/MSR59073.2023.00075]
                  [2]  Zhang ZX, Zhu HC, Wen M, Tao YD, Liu YP, Xiong YF. How do python framework APIs evolve? An exploratory study. In: Proc. of the
   47   48   49   50   51   52   53   54   55   56   57