Page 184 - 《软件学报》2026年第2期
P. 184

张育博 等: 基于依赖感知分层神经网络的代码注释增强方法                                                     663


                 neural  model,  DHCS.  DHCS  is  designed  to  improve  code  summarization  by  explicitly  modeling  the  hierarchical  dependencies  between  the
                 target function and its subfunctions. The proposed approach employs a hierarchical encoder consisting of both a subfunction encoder and a
                 target  function  encoder,  allowing  the  model  to  capture  both  local  and  contextual  semantic  representations  effectively.  Meanwhile,  a  self-
                 supervised  task,  namely  the  masked  subfunction  prediction,  is  introduced  to  enhance  the  representation  learning  of  subfunctions.
                 Furthermore, the topic distribution of subfunctions is mined and incorporated into a summary decoder with a topic-aware copy mechanism.
                 Therefore,  it  enables  the  direct  extraction  of  key  information  from  subfunctions,  facilitating  more  effective  summary  generation  for  the
                 target  function.  Finally,  extensive  experiments  are  conducted  on  three  real-world  datasets  constructed  for  Python,  Java,  and  Go  languages,
                 which clearly validate the effectiveness of the proposed approach.
                 Key words:  code summarization generation; API document; hierarchical neural network; self-supervised task


                  1   引 言

                    代码注释是对源代码的一种简洁的自然语言描述, 旨在以易于理解的方式阐明代码背后的逻辑或目的. 通常,
                 代码注释仅包含一个简短的句子, 能够为程序员提供快速理解代码片段功能的途径. 例如, 在浏览一个                                Python  方
                 法时, 程序员可能会看到类似“在         a  和  b  中查找最长匹配块”的    Pydocs 描述. 这种简洁的注释避免了程序员深入阅
                 读代码, 从而提高效率和理解力. 虽然程序员可以从               Pydocs 和  JavaDocs 等软件文档工具中获得大量的帮助, 但手
                 动创建注释的过程却是一个费时费力的工作. 尤其是在处理代码遗留问题时, 源代码通常缺乏完善的文档, 使得这
                 一问题尤为突出. 因此, 软件工程领域的研究人员一直致力于自动生成代码注释, 以减轻程序员的负担.
                    近年来, 随着深度学习和自然语言处理的发展, 研究人员开始探索利用机器学习方法来实现自动生成代码注
                 释  [1−4] . 这些模型通常采用编码器-解码器的框架及其各种变体, 在这个框架中, 编码器接受代码片段作为输入并将
                 其转化为潜在表示, 这些表示作为解码器生成自然语言描述的基础, 从而阐明代码片段的功能和目的. 例如, 受到
                 神经机器翻译的启发        [5,6] , Hu  等人  [2] 和  Ahmad  等人  [1] 采用序列到序列架构进行代码注释生成. 在这种架构中,
                 LSTM/Transformer 编码器从序列化的抽象语法树         (AST) 中学习潜在的代码表示, LSTM/Transformer 解码器则利
                 用注意力机制来生成注释. 其他研究则设计了专门的编码器/解码器来处理特定形式的源代码输入, 如                                  AST  或
                 token  序列  [7−10] , 或者引入专门的学习目标来促进模型的训练        [3,4,11] . 这些创新方法旨在通过深度学习技术提升代码
                 注释的有效性和适应性. 此外, 随着          GPT  系列等超大语言模型的出现, 研究人员也在积极探索像                 Code LLaMA [12]
                 和  StarCoder [13] 这样的解码器模型来处理多任务.
                    然而, 上述方法普遍存在一个共同的局限性: 它们将输入的代码片段视为独立的函数, 从而将代码中的依赖关
                 系简化为单一字符串. 换句话说, 它们通常将整个函数或短代码片段作为输入, 供基于                         Transformer 或  RNN  的编码
                 器使用, 或者供解码器模型使用. 这种做法在许多常见代码注释数据集                      (如  CodeSearchNet、Nematus 和  Funcom)
                 中也有所应用. 问题在于, 这种设置忽略了在准确生成代码注释时至关重要的函数依赖关系的信息, 而忽视这些依
                 赖关系可能导致遗漏重要的语义信息. 如图              1  所示, 目标函数包含    5  个关键依赖关系     (子函数): iteration、collapse
                 function preconditions、collapse snapshots、collapse function postconditions 和  decorate the function. 依赖关系指的
                 是对项目中其他地方定义元素的调用 (例如              collapse_preconditions), 这些依赖关系对于程序的语义功能至关重要,
                 忽略它们可能导致对输入代码的理解偏差或理解错误.
                    本文通过引入一种依赖感知分层神经网络代码注释模型, 即                    DHCS, 来解决上述挑战. DHCS      的核心是利用从
                 被调用的依赖     (子函数) 中获得的信息, 以提高生成的代码注释的质量. 为此, 本文采取了多方面的策略. 首先, 构
                 建了一个分层的      Transformer 编码器, 该编码器由目标函数编码器和子函数编码器组成. 子函数编码器用于学习子
                 函数的语义特征, 而目标函数编码器则捕捉目标函数的上下文语义. 接着, 使用传统的                          Transformer 解码器生成注
                 释, 并基于层次化编码器编码的语义信息进行条件生成. 此外, 为了增强子函数的表示学习, 引入了一个自监督目
                 标——掩码子函数预测        (masked subfunction prediction, MSP), 该目标增强了本文分层模型的预训练效果. 此外, 假
                 设子函数的注释可以为描述目标函数提供关键线索. 基于此, 本文提出了一种主题感知复制机制, 能够有选择地从
                 被调用的依赖项中提取重要信息. 本研究通过对包含                  Python、Java 和  Go  这  3  种语言的新数据集进行全面评估,
                 经过一系列广泛实验, 最终证明利用被调用依赖项的信息可以显著提高代码注释的质量.
   179   180   181   182   183   184   185   186   187   188   189