ASTNN、GGNN、Code2vec

1.ASTNN

ASTNN(Abstract Syntax Tree Neural Network)是一种用于处理源代码的深度学习方法,它专注于抽象语法树(AST)的表示学习。AST是源代码的一种结构化表示形式,它反映了代码的语法结构和层次关系。

主要特点

  1. AST表示:ASTNN的核心思想是将源代码表示为AST,以便更好地捕获代码的结构信息。AST是一种树状结构,其中每个节点代表代码中的语法元素,如语句、表达式和标识符。

  2. 深度学习模型:ASTNN使用深度学习模型来处理AST。通常,它可以使用递归神经网络(RNN)或卷积神经网络(CNN)等模型来遍历AST并学习节点之间的关系。

  3. 语法分析和表示学习:ASTNN不仅用于语法分析,还用于代码表示学习。通过分析AST,它能够捕获代码的嵌套结构,这对于代码生成、代码分类和其他与代码结构有关的任务非常有用。

  4. 应用领域:ASTNN在许多与源代码分析有关的任务中发挥作用,包括代码推荐、自动化代码生成、缺陷检测和代码变更建议等

详细结构

模型介绍

首先,通过现有的语法分析工具,可以将源代码片段转换为大型ast。对于每个AST,我们按语句的粒度将其分割,并通过前置遍历提取语句树的序列。

形式上,给定一个AST T和一组语句AST节点S,T中的每个语句节点s∈S对应一个源代码语句。将MethodDeclaration视为一个特殊的语句节点,因此S=S∪{MethodDeclaration}。对于嵌套语句,我们定义了单独的节点集P={block,body}。block用于分割嵌套语句的头和主体,如Try语句和While语句,body用于方法声明。语句节点s∈S的所有后代都用D (s)表示。对于任何d∈D (s),如果存在一个从s到d到一个节点p∈P的路径,这意味着节点d包含在语句主体中的一个语句中。我们称s的节点为已做好的子语句节点。然后由语句节点∈s根的语句树(st树)是由节点s及其所有后代组成的树

粒度选择问题 

  1. 函数级别(Function-Level):

    对于许多代码分析任务,将代码分割为函数级别是一个合理的粒度。这使得每个函数成为一个单独的AST,ASTNN可以用于学习和表示函数的结构。这对于代码推荐、缺陷检测和代码变更建议等任务非常有用。
  2. 类/方法级别(Class/Method-Level):

    如果你处理面向对象编程的代码,尤其是Java或C#等语言,将代码分割为类和方法级别可能更合适。这样可以捕获类的结构和方法之间的关系。
  3. 文件级别(File-Level):

    对于某些任务,如代码搜索或代码克隆检测,将整个源代码文件视为一个AST可能更有意义,因为它可以保留文件级别的结构信息。然后,你可以在文件级别上使用ASTNN来表示和比较不同的文件。
  4. 自定义粒度:

    根据特定任务的需求,你还可以选择自定义粒度。你可以选择在代码中定义自己的分割粒度,例如按照模块、功能单元或其他逻辑单元划分。

2.Code2vec

Code2Vec是一种深度学习方法,旨在将源代码片段(如函数或方法)转化为连续向量表示,以便进行代码搜索、推荐、理解和相关任务。

(代码片段生成对应的语义标签)

设代码片段为C,对应的标签为L,则标签的分布可以由C中的语法路径(syntactic paths)来得到。设代码片段C对应的标签分布为P(L|C)。

模型在embedding的过程中还捕捉到了名字之间的语义信息,方法名字之间可以进行类比和推断。比如:vector (equals)+vector (toLowerCase)=vector (equalsIgnoreCase)

其次具有相似语法结构但由于微小的差别导致语义不同的代码片段可以很好的进行区分,并预测出具有不同含义的名字。

首先,对训练语料库中的每个查询方法进行解析,以构建抽象语法树(AST)。然后,遍历AST并提取AST叶子节点之间的句法路径,将路径上所有的结点的值构成的元组称为path-context。将每个path-context中的结点embedding后连接成一个vector来代表这个path-context。对于每个path-context按权重(attention)加权融合成总体的向量,这个总体的向量就是最终对应方法名字的向量。

至于哪一个path-context的attention值最大呢,以上图的最左边的例子来说,该代码片段中attention值最高的选取了4条路经,具体形式如下:(权重:红0.23,蓝0.14,绿0.09,黄0.07)(路径越长对应的权重越大)

总结

  1. 代码片段表示:Code2Vec 主要关注于将代码片段(通常是函数或方法)转化为向量表示,以捕捉其语义含义。这样的表示可以用于代码搜索引擎、代码推荐系统和代码理解工具。

  2. 上下文窗口:Code2Vec 使用一个上下文窗口,以一定长度的代码标识符序列来表示代码片段。这个窗口涵盖了代码片段内的标识符和操作符。

  3. 基于深度学习的模型:Code2Vec 使用深度学习模型,通常是循环神经网络(RNN)或 Transformer,来处理代码标识符序列并学习代码片段的嵌入表示。这个模型通过学习代码片段的上下文信息,将其映射为连续向量。

  4. 语义相似性:Code2Vec 的目标是使具有相似语义的代码片段在嵌入空间中彼此接近,以便更容易找到相似的代码片段或执行代码搜索和推荐任务。

  5. 应用领域:Code2Vec 可用于代码搜索、代码推荐、自动化代码理解、代码克隆检测等任务。它可以帮助开发人员更好地理解和导航大型代码库。

3.GGNN

GGNN(Graph-Based Global Neural Network)是一种用于处理图数据的深度学习方法,它主要用于代码分析和源代码的图形表示学习。

一个图 G = (V, E), 节点v ∈ V中存储D维向量,边e ∈ E中存储D × D维矩阵,节点v的向量(也称为节点表示或节点嵌入)用hv ∈ R^D表示图还可以包含每个节点v的节点标签lv ∈ {1,...,LV}以及每个边的边标签或边类型le ∈ {1,...,LE}。利用GGNN来多次迭代地学习节点v的embedding, 目的是构建网络GGNN。

gnn通过两个步骤将图映射到输出。首先,有一个传播步骤,计算每个节点的节点表示;第二,输出模型Ov=(hv,lv)从节点表示和对应的标签映射到每个v∈V。在g的符号中,我们留下对参数的依赖隐式,我们将继续这样做。该系统具有端到端不同的特点,因此所有参数都是通过基于梯度的优化来联合学习的。

传播模型

其中式(1), h_{v}^{1} 为节点v的初始隐向量,为D维的向量,当节点输入特征xt维度小于D时,后面采取补0的padding方式。

式(2)中, Av为图(c)的矩阵A中选出对应节点v的两列,A为D*2D维, Av为1*2D维,最终的 a_{v}^{t} 为1*2D维的向量,表示当前节点和相邻节点间通过edges的相互作用的结果。可以看到,计算时对A去了in和out两列,因此这里计算的结果考虑了双向的信息传递。

式(3)-(6)为类似GRU的计算过程。其中,  z_{v}^{t}控制遗忘信息, r_{v}^{t}控制新产生信息。式(6)中的前半部分选择遗忘过去的哪些信息,而后者选择记住新产生的哪些信息。 h_{v}^{t}则为最终更新的节点状态。

输出模型

有两种输出节点分别输出和图输出。

节点输出

o v = g ( h ( v T ) , x v )
图输出
其中,σ(i( h_{v}^{T}x_{v}))作为一种软注意机制,它决定哪些节点与当前的图级任务相关。i和j是将 h_{v}^{T}x_{v}的串联作为输入和输出实值向量的神经网络。

总结

  1. 图数据表示:GGNN用于表示和分析源代码的图形结构,其中代码元素被视为图的节点,而它们之间的关系(如依赖、控制流、数据流等)被表示为图的边。这种图表示更能捕获代码元素之间的复杂关系,而不仅仅是线性结构。

  2. 深度学习模型:GGNN使用深度神经网络来处理代码图。通常,它使用递归神经网络(RNN)或图神经网络(GNN)等模型,以学习节点之间的交互关系。

  3. 学习图结构:GGNN 的一个关键目标是学习代码的图形结构,包括控制流、数据流、依赖关系等。这使得 GGNN 在任务中能够更好地理解代码的复杂性和上下文信息。

  4. 应用领域:GGNN 在多个与源代码分析有关的任务中具有广泛的应用,包括代码推荐、缺陷检测、代码变更建议、代码克隆检测等。它特别适用于需要考虑代码元素之间复杂关系的任务。

三者区别

  1. ASTNN (Abstract Syntax Tree Neural Network):

    • 基础数据结构:ASTNN侧重于使用抽象语法树(AST)来表示代码。它将代码解析为语法树,然后利用AST的结构来学习代码的语法和结构信息。
    • 特点:ASTNN主要用于捕捉代码的语法和结构信息,使得模型可以理解代码的层次结构和语法特点。
    • 应用:ASTNN通常用于代码补全、代码缺陷检测、代码重构等任务。
  2. GGNN (Graph-based Neural Network):

    • 基础数据结构:GGNN使用图结构来表示代码,其中代码的元素(例如变量、函数、语句)被视为图的节点,它们之间的依赖关系被视为边。
    • 特点:GGNN通过图神经网络来学习代码中的依赖关系和上下文信息。这使得模型能够捕获代码的数据流和控制流等信息。
    • 应用:GGNN常用于代码推荐系统、变量命名、代码注释生成等任务,这些任务需要理解代码的依赖关系和上下文。
  3. Code2vec:

    • 基础数据结构:Code2vec使用代码的上下文窗口(通常是函数或方法)作为输入,将代码解析为词向量序列。
    • 特点:Code2vec旨在学习代码段的嵌入表示,使得不同的代码段可以被比较和分类。它关注于代码段的语义信息。
    • 应用:Code2vec常用于代码段分类、代码相似性分析、代码段检索等任务,这些任务侧重于理解代码的语义。
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值