OpCodeBERT:一种利用BERT和操作码(Opcode)进行Python代码表示学习的方法

《IEEE Transactions on Software Engineering》:OpCodeBERT: A Method for Python Code Representation Learning by BERT With Opcode

【字体: 时间:2025年11月21日 来源:IEEE Transactions on Software Engineering 5.6

编辑推荐:

  编程语言预训练模型通过中间代码(如Python opcodes)实现代码表示学习,OpCodeBERT首次利用opcodes编码执行逻辑、注释和源代码,结合两阶段掩码语言模型和多模态对比学习进行预训练,实验验证其在代码搜索、克隆检测等任务中效果优异。

  

摘要:

近年来,编程语言预训练模型在代码表示学习方面取得了显著进展。尽管已经广泛采用了数据流和抽象语法树(AST)等多种方法来增强代码表示,但截至目前,尚未有研究专门探讨使用源代码的中间代码来进行代码表示。例如,Python的中间代码(即操作码)不仅包含了程序执行过程中的数据输入和输出栈操作,还描述了具体的执行顺序和控制流信息。这些特性在源代码、数据流、AST等结构中要么不存在,要么难以直接反映出来。在本文中,我们提出了OpCodeBERT(https://github.com/qcy321/OpCodeBERT)方法,这是首个利用Python操作码进行代码表示学习的方法,通过编码底层执行逻辑、注释和源代码来提升代码表示能力。为了支持操作码的训练,我们筛选了公共数据集以排除无法解析的数据,并创新性地提出了一种操作码到序列的映射方法,将其转换为适合模型输入的形式。此外,我们采用两阶段掩码语言建模(MLM)和多模态对比学习对OpCodeBERT进行了预训练。为了评估OpCodeBERT的有效性,我们通过多个下游任务进行了实验。实验结果表明,OpCodeBERT在这些任务上表现优异,验证了结合操作码的有效性,并进一步证明了该方法在代码表示学习中的可行性。

引言

像ELMo [1]、GPT [2]和BERT [3]这样的预训练模型在广泛的自然语言处理(NLP)任务中显著提升了性能。这些模型首先在庞大的未标记文本数据集上进行训练,以提取丰富的语义信息,然后在特定的下游任务上进行微调,从而实现了性能的大幅提升。它们在NLP领域的成功也推动了编程语言预训练模型的发展。例如,现有的预训练模型[4]、[5]、[6]、[7]、[8]、[9]大多将源代码建模为令牌序列。GraphCodeBERT [11]利用数据流来增强代码表示,而UniXcoder [10]则将AST扁平化为序列,以支持代码搜索、代码克隆检测、代码摘要等任务。然而,迄今为止,还没有研究专门探讨使用中间代码(如Python的操作码)来进行代码表示。

相关新闻
生物通微信公众号
微信
新浪微博
  • 搜索
  • 国际
  • 国内
  • 人物
  • 产业
  • 热点
  • 科普
  • 急聘职位
  • 高薪职位

知名企业招聘

热点排行

    今日动态 | 人才市场 | 新技术专栏 | 中国科学人 | 云展台 | BioHot | 云讲堂直播 | 会展中心 | 特价专栏 | 技术快讯 | 免费试用

    版权所有 生物通

    Copyright© eBiotrade.com, All Rights Reserved

    联系信箱:

    粤ICP备09063491号