使用普鲁弗序列进行代码表示学习
在软件工程领域,编程语言理解与表示(即代码表示学习)一直是一个备受关注和具有挑战性的任务,其旨在应用深度学习技术生成源代码特征的数值表示同时保持其语义,这些表示可用于促进后续与代码相关的任务。然而,AST(抽象语法树)作为一种基本的代码特征,在代码表示学习中广泛应用,但目前缺乏对 AST-based 代码表示如何促进后续代码相关任务的系统和定量评估。本文通过详细的实证研究首次探索了 AST-based 代码表示在促进后续代码相关任务方面的有效性,并比较了基于代码标记序列和基于 AST 的代码表示方法在三种常见类型的代码相关任务上的性能。令人惊讶的是,整体定量统计结果表明,与基于代码标记的代码表示方案相比,基于 AST 的代码表示方法在所有三个任务中的表现均较差。进一步的定量分析显示,基于 AST 的代码表示方法在所有三个任务的某些子样本中优于基于代码标记的代码表示方法。我们还进行了全面的实验,评估和揭示了 AST 解析 / 预处理 / 编码方法的选择对基于 AST 的代码表示和后续代码相关任务的影响。本研究为未来的研究人员提供了关于如何选择每个阶段的解决方案以充分利用 AST 的详细指导。
Dec, 2023
CODE2SEQ 是一种利用编程语言的语法结构更好地对源代码进行编码的方法,其利用组成路径的集合将代码片段表示为其抽象语法树(AST),使用注意力机制来选择相关路径来解码,该方法在两种编程语言和四个数据集上的两个任务中表现出卓越的性能,并超过了针对编程语言的先前模型以及最先进的 NMT 模型。
Aug, 2018
本文介绍了一种新的基于序列到序列(sequence-to-sequence)的编码表示学习预训练模型 SPT-Code,通过三种特定的预训练任务,可以解决现有预训练任务在自然语言编码中存在的问题,该模型可以有效地应用于五个编码相关的下游任务,并取得了最优秀的表现。
Jan, 2022
本论文介绍了一种名为 FuzzPretrain 的方法,利用程序的测试用例中的动态信息,将其嵌入代码的特征表示中,以改善代码搜索的效果,并提供了学习具有区分性的代码表示的实验证据。
Sep, 2023
通过同时学习源代码和抽象语法树的结构信息,本篇研究提出了一种只使用与语言无关的功能和直接从抽象语法树中计算得出的功能的新机器学习模型,该模型在单语言和多语言代码总结方面均取得了最新成果。
Mar, 2021
GraphCodeBERT 是一种基于 Transformer 的预训练模型,通过使用数据流而不是抽象语法树的句法级别结构,可以更有效地编码代码的语义结构,从而提高代码理解过程。其结构感知的预训练任务可以改善 GraphCodeBERT,并在代码搜索,克隆检测,代码翻译和代码优化等方面实现了最先进的性能。
Sep, 2020
本文介绍了一种基于 AST 的神经网络架构 xASTNN,用于源代码表示,以推广深度学习在工业实践中的应用。研究结果表明,xASTNN 在代码分类和克隆检测等任务上具有较大提升且速度更快。
Mar, 2023
通过预训练和微调编程结构,改进了面向代码任务的当前语言模型的方法,并且在使用有限训练样本时,结合程序结构与纯文本表示方式展现出显著的改进效果。
Jan, 2024
本篇论文通过构建 AST-Probe 探针方法,证明了预训练语言模型中存在一个语法子空间以及该子空间可以用来恢复一个输入代码片段的完整 AST,进而表明预训练语言模型仅使用一部分表示空间来编码编程语言的语法信息。
Jun, 2022
该研究报告介绍了一种新方法 —— 结构化语言建模(SLM),利用编程语言的严格语法将代码片段建模为树来实现任意代码完成,该方法可以生成任意编程语言的任意代码,在生成 Java 和 C# 代码方面,效果显著优于现有技术。
Sep, 2019