领域特定语言论文汇报
摘要
现代软件系统正变得越来越复杂,依赖于大量的第三方库支持。因此,库行为是软件行为不可分割的一部分。分析它们和分析软件本身一样重要。然而,由于缺乏源代码、不同语言的实现以及复杂的优化,分析库具有很大的挑战性。 我们注意到,许多Java库函数都提供了出色的文档,这些文档简要地描述了函数的功能。我们开发了一种新的技术,可以通过分析文档来构建Java API函数的模型。与原始模型相比,这些模型在Java中的实现更简单,因此更易于分析。更重要的是,它们提供了与原始功能相同的功能。我们的技术成功地对14个广泛使用的Java类中的326个函数进行了建模。我们还将这些模型用于Android应用程序的静态污染分析和Java程序的动态切片,展示了我们模型的有效性和效率。
难点
- 库源代码的隐蔽性/多样性,导致难以对软件行为进行分析
- 源代码庞大,复杂,包含大量多层次的调用关系,导致分析困难
- 源代码包含大量优化和工程技巧,不利于对其行为分析(难以理解)
- 库具有跨平台支持
本文提出了一种在自然语言中从Javadoc生成模型的新方法。这些模型是代码片段,具有与原始实现相同的功能,但复杂性要简单得多。它们可以在软件分析过程中替换原始库函数。
就是在软件分析中,使用通过JavaDoc生成的方法代替库函数,来简化分析
一个很简单的ArrayList的add方法包括了三个函数调用,其中一个是使用JNI在本机代码中实现,无法直接访问。
总结
基于将自然语言处理技术和程序分析技术应用于模型库的思想,我们识别并克服了将NLP技术应用于真实代码生成的挑战,并构建了一个建模工具的原型,该工具可以从Javadocs中自动生成Java容器类库的简化代码。平均而言,生成的模型的大小只有原始代码库的三分之一。我们还应用我们的技术来帮助其他需要推理软件运行时环境的程序分析。结果表明,我们的模型可以帮助静态和动态分析。
设计
构件
- Pre-processor:预处理器接受Javadoc解析器提取的描述,并执行三种分析。
- 等价性分析:预处理器根据领域词典将单词分类到预定义的语义类中。减少IR的映射量。
- 冗余信息消除:删除描述中的同义句/解释句。如“换言之,即”后面的句子。
- 句子增强:为javadoc中的句子做增强或填充。如填充return/throw等关键词。
- 文本分析引擎:文本分析引擎通过自然语言处理为每个预处理的句子生成语法树结构。
- 添加POS词性限制组件,解决Stanford parser中的词性分类错误,强制它对一些编程特定的单词使用我们预定义的标签。
- 名词true/false/null
- 动词returns/sets/maps/copies
- 形容词reverse/next/more/empty
- 树状转换器:树转换器转换Standford parser生成的原始树结构,以生成不同的变体。每个变体对应句子的不同解释。这些多个变体最终会被模型验证器验证,来过滤掉不正确的模型。
- 不幸的是,即使k很大,解析器也无法保证为句子生成具有预期含义的树。为了避免这种情况(浪费大量的计算)提出了算法1,通过仅重新定位连接节点来转换来自斯坦福解析器的解析树,以产生一组变体。
- 算法1:lift up and push down产生不同的变体,直至没有新的变体产生。
- 中间表示生成器(IR generator):中间表示生成器根据编程领域知识,通过替换子树、识别参数和添加标签,操纵树转换器生成的树来构造IR。主要执行如下两个任务:
- 参数识别:识别定义在方法描述中的参数,算法2
- 结构识别:识别方法描述中指示的程序结构。
- 循环:添加
loop
标签 - 条件:if、when、otherwise
- 循环:添加
- 模型生成器(Model Generator):基于IRs生成模型。基元
- 模型验证器(Model Validator):由于自然语言的模糊性和当前NLP工具的限制,我们的方法可以生成多个候选模型。模型验证器用来过滤那些与原来库行为不一致的那些模型。使用
Randoop
方法生成测试。
评估
评估的方面:
- 模型生成技术的有效性。
- 在其他分析中使用生成的模型。
模型生成的有效性
#T
:原始JDK类的方法总数#M
:工具可以成功建模的数量%
:#T
/#M
#C
:每个类候选模型的数量GT
:生成类候选模型的总时间VT
:使用Randoop验证类模型所用的时间#CN
:使用Randoop生成测试用例的平均数量
- 代码行对比原始JDK减少1-13倍
静态污染分析
我们首先使用原始JDK源代码运行分析,然后用我们的模型替换JDK的一部分,然后比较报告的信息泄漏警告的数量和性能。
动态切片分析
局限性
效果很大程度取决于文档的质量。
依赖基元模式,但来源于javadoc,不具有普适性。
聚焦于容器类库
测试用例不够充分,使用更严格的验证技术(等价性检查)
文档质量的强依赖性
文中基于自然语言的技术在很大程度上直接依赖于文档的质量。如果文档不完整,使用奇怪的语法或表述,工具可能无法生成正确的模型。其本质原因是许多基于自然语言处理的技术的一个普遍限制。技术依赖于一组语法模式来识别参数和基本操作。这些模式主要来自于 Javedocs。它们可能并不通用。然而,论文提到的技术在原则上是通用的,并且对于自动化模型生成是一项有价值的步骤,而这在一般情况下是一个难题。设想文档的写作风格可能不会像库的实现那样经常变化。因此,该技术可以作为一个自动化方法,快速为大量的库函数生成模型,正如结果所证明的那样。
改进:文档规范化,强制执行固定的文档风格可能是一个有益的做法。
- 工作集中于容器库
此外,我们当前的研究主要集中在类似容器的库上,因为它们是使用最广泛的类别。对于一些特殊用途的库,比如数学库,精确地对其功能进行建模非常困难。然而,在许多应用中,对这些库提供精确的模型并不是必需的。例如,大多数数学库函数的输入输出依赖关系非常简单,尽管它们所执行的计算可能非常复杂。
改进:
- 更广泛的文档支持: 改进工具以支持更多类型的文档格式和语法,不仅限于特定格式或特定编程语言的注释格式。这样可以提高工具的适用性,并使其能够适应更多种类的文档和库。
- 多种语言的支持: 扩展工具的能力,使其能够处理多种编程语言的文档和库,而不仅仅是特定语言或库的文档。这样可以使工具更具通用性和适用性。
- 机器学习和自然语言处理技术的应用: 运用机器学习和自然语言处理技术,使工具能够更好地理解和解析文档,以提高模型生成的准确性和全面性。
- 更精确的模型: 改进模型生成算法,使其能够更精确地对库函数的功能和行为进行建模,尽可能减少误差和不完整性,提高模型的质量和可靠性。
- 测试用例不够充分
文中用于模型验证的测试用例不够充分,以至于可能会接受一些错误的模型。
改进:
增加测试用例的覆盖范围: 扩展现有测试套件,涵盖更多不同情况的测试用例,以更全面地验证模型的正确性。
引入更多验证技术: 使用更严格的验证技术,例如形式化验证或符号执行等方法,来验证生成的模型是否满足预期的行为和性质。
引入人工审查: 增加人工审查环节,专家审查生成的模型,提供反馈和修正。
持续改进方法: 不断改进和优化使用的NLP技术和模型生成算法,以提高模型的准确性和适用性。
个人研究方向:
低代码开发技术和相关平台以及代码生成在低代码平台中的应用
低代码开发技术是一种软件开发方法,旨在通过图形化界面和少量的编码来快速构建应用程序和软件解决方案。它允许开发人员使用可视化工具和拖放式界面来设计和配置应用程序的各个组件,从而减少了对传统编码的依赖。低代码平台提供了一个可视化的开发环境,使得开发人员能够更快速地构建应用程序,降低开发门槛,加快产品交付速度。
因此,代码生成在低代码平台中是不可或缺的一部分,它有助于将用户可视化的设计转换为实际的应用程序代码。这种代码生成可以基于用户的界面设计、业务逻辑和配置信息,自动生成底层的代码,从而加速应用程序的开发和部署过程。
结合自己方向的进一步工作
本篇论文提出了一种使用NLP技术来通过文档注释生成模型(代码)的方法来,来取代原始库中的方法或行为。该技术可运用在低代码平台中,如
自动生成文档和注释: 在低代码平台中,使用NLP 技术可用于自动生成代码文档和注释。通过分析代码结构、变量名和函数名等信息,NLP 可以生成清晰的文档和注释,帮助开发者更好地理解和使用代码。
自动化代码解析和转换: NLP 技术可以解析代码并转换为更易读或更高级的抽象表示形式。这种转换可以使代码更加模块化、简洁,也可以帮助低代码平台用户更轻松地编辑和维护代码。
智能建议和辅助功能: 基于 NLP 技术,低代码平台可以实现代码补全、自动修复和错误检测等智能功能。这些功能可以帮助用户更快速地完成代码编写,提高开发效率。
代码生成和模板应用: NLP 技术可以用于分析用户输入或需求描述,并自动生成相应的代码模板或程序框架。这有助于用户通过简单的描述或指导来快速生成所需的代码结构。
自然语言交互: 利用 NLP 技术,低代码平台可以实现自然语言交互功能,允许用户以自然语言形式与平台交互,描述其需求或功能,并自动生成相应的代码实现。
因此,将 NLP 技术应用到低代码平台中可以带来智能化、自动化的代码生成和辅助功能,使得用户可以更快速、高效地开发应用程序,降低编码门槛和提升开发体验。
然而,在如今大语言模型的时代,使用NLP技术生成代码的方法显得有些过时。基于LLM从自然语言描述生成代码通常具有以下的优势:
上下文感知性: 大语言模型具有对上下文的深入理解能力,能够根据用户提供的问题或描述性文本更准确地生成代码。这种上下文感知性使得生成的代码更贴近用户的实际需求。
多样化和灵活性: 大型语言模型可以生成多种可能的代码方案,提供更多样化、更灵活的选择。这样的灵活性使得生成的代码可以适应不同的场景和需求。
语言表达能力: 大语言模型拥有更强大的语言表达能力,能够更好地理解和解释自然语言输入,并将其转化为可执行的代码。这有助于解决传统代码生成方法中的歧义和理解问题。
自我训练和不断进化: 大型语言模型通常是通过大量的数据进行预训练,并具有自我学习和进化的能力。这意味着它们可以通过不断的训练和使用经验提升生成代码的质量和准确性。
广泛应用和适应性: 大语言模型可以用于多种编程语言和领域,不局限于特定的编程语言或任务。这使得它们在不同领域的代码生成和自然语言交互中都具有较强的适应性。
这些优势在一定程度上弥补了上述基于NLP生成代码的局限性,通常LLM代码生成更具有普适性而不局限于某个或某类库,并且由于其上下文感知性,克服了NLP方法的文档强依赖性。