[论文解读] Structured Generative Models of Natural Source Code
本文通过扩展概率上下文无关文法(PCFGs)和神经概率语言模型,引入编译器启发式推理与分层结构建模,提出面向自然源代码(NSC)的结构化生成模型。所提出的对数线性树遍历(LTT)模型在保留代码的预测对数似然性方面显著优于基线模型,通过捕捉作用域规则、代码块结构和变量使用模式,生成更具现实性与语义一致性的代码样本。
We study the problem of building generative models of natural source code (NSC); that is, source code written and understood by humans. Our primary contribution is to describe a family of generative models for NSC that have three key properties: First, they incorporate both sequential and hierarchical structure. Second, we learn a distributed representation of source code elements. Finally, they integrate closely with a compiler, which allows leveraging compiler logic and abstractions when building structure into the model. We also develop an extension that includes more complex structure, refining how the model generates identifier tokens based on what variables are currently in scope. Our models can be learned efficiently, and we show empirically that including appropriate structure greatly improves the models, measured by the probability of generating test programs.
研究动机与目标
- 开发面向自然源代码(NSC)的生成模型,NSC具有人类编写、分层结构与语义结构特征。
- 通过学习统一的概率化源代码模型,提升代码补全、错误检测与代码摘要生成性能。
- 将类似编译器的推理机制融入神经网络与概率模型,以更好地捕捉语言特定约束与作用域规则。
- 证明结构化生成建模相比标准NLP或n-gram基线模型,能带来更优性能与更真实的代码样本。
- 探索生成模型作为程序归纳、API建议与代码表征学习等下游任务基础的潜力。
提出的方法
- 通过引入对数线性参数化,扩展概率上下文无关文法(PCFGs),以建模源代码中的分层树结构。
- 提出对数线性树遍历(LTT)模型,结合树结构生成与神经参数化,实现高效推理与训练。
- 通过建模局部与全局变量作用域,引入类似编译器的推理机制,确保生成代码在语法与语义上均有效。
- 采用分层序列模型(Hi&Seq)建模代码块与方法体,相比平坦序列基线,显著提升结构建模能力。
- 采用作用域感知模型,区分局部与全局标识符标记,降低生成成本并提升准确性。
- 利用公共代码仓库中的C#源代码语料进行高效训练,借助Roslyn编译器提供的丰富抽象语法树(AST)与符号信息。
实验结果
研究问题
- RQ1结合PCFG与神经参数化的结构化生成模型,是否能在建模自然源代码方面优于标准NLP与n-gram模型?
- RQ2引入类似编译器的推理机制(如作用域追踪与类型约束)对生成代码质量有何影响?
- RQ3分层与结构建模组件(如for循环、代码块、方法声明)在提升对数似然性与真实性方面贡献程度如何?
- RQ4模型是否能在无显式监督的情况下学习到细微的语法模式,如变量重用与作用域规则?
- RQ5不同架构组件(如作用域建模、代码块建模)对整体预测性能的贡献如何?
主要发现
- LTT-HiSeq-Scope模型在测试集上达到最优对数似然性-2.33,显著优于基线LBL n-gram模型的-4.23。
- 该模型在生成树结构方面付出更高代价,但通过显著降低标记生成代价实现补偿,表明其结构效率更优。
- 全局作用域的标识符标记对总对数概率贡献最大(30.1%),其次为局部作用域标识符(10.9%)与代码块(10.6%),凸显关键建模挑战。
- 定性分析显示,模型能生成具有正确作用域、变量重用与典型语法模式(如'int'变量出现在方括号内)的真实for循环。
- 模型能捕捉高层代码结构,如方法声明与代码块嵌套,并学习细微模式,如在嵌套循环中使用'Math.Max'。
- 作用域模型相比基线将标记生成成本降低1.68,证明结构化建模相比平坦序列生成更具优势。
更好的研究,从现在开始
从论文设计到论文写作,大幅缩短您的研究时间。
无需绑定信用卡
本解读由 AI 生成,并经人工编辑审核。