基于机器学习的类型推理方法综述

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
对于动态 类 型 语 言,在 缺 乏 上 下 文 信 息 和 语 法规则的前 提 下,编 译 器 都 很 难 正 常 理 解 这 些 代 码片段,所以 采 用 传 统 的 类 型 推 理 方 式 则 很 难 解 决这些问题.例如 python语言,它的程序严重依赖 外部 APIs和动态语言的特性,而且 python变量类 型都是路径敏感的,对于不同的程序路径,变量可 能会有不同 的 类 型,对 象 的 类 型 和 属 性 集 可 以 动 态更改,大大增加了类型推断的难度,使得传统的 方法并不适用.另一方面,现有的传统特性往往无 法区分不同 语 义 的 代 码 区 域,具 有 不 同 语 义 的 程 序文件可能 具 有 相 同 值 的 传 统 特 性,要 能 够 区 分 这种语义差异的特性就需要能够建立更加精确的 预测模型.所以在这些情况下,能够采用基于机器 学习的方法对程序片段进行类型推理就显得尤为 重要了.
(武汉大学 计算机学院,湖北 武汉 430072)
摘 要:类型推理是一种轻量级的形式化方法,通过对程序变量和语句的类型这些关键信息进行推理,可以更 好地理解程序行为.传统的类型推理方法依赖于语法规则与类型推演规则,然而,随着软件技术的发展,在动态 语言等新的软件应用场景中,传统的类型推理方法在缺乏运行时信息的时候无法在静态对类型进行推理.针对 这些问题,近年来出现了很多基于机器学习的类型推理的方法.基于机器学习的方法,可以利用已有的动态类 型信息,对新程序的类型进行静态的类型推理.文章系统地总结了各种基于机器学习进行类型推理的方法,总 结其特点和存在的问题,并讨论了未来可能的研究方向. 关键词:类型推理;机器学习;程序分析 中图分类号:TP312 文献标志码:A
收稿日期:2019-05-21; 修回日期:2019-06-04 基金项目:国家自然科学基金资助项目(61872272,61640221) 作者简介:袁梦霆(1976—),男,副教授,博士.Email:ymt@whu.edu.cn
86
广州大学学报(自然科学版)
第 18卷
ห้องสมุดไป่ตู้
程 中 ,也 无 法 保 证 所 输 入 的 推 理 程 序 一 定 能 够 通 过语法检查,这种情况下,就无 法 继 续 进 行 类 型 推理.
第 18卷 第 3期
2019年 6月
广州大学学报(自然科学版)
JournalofGuangzhouUniversity(NaturalScienceEdition)
文章编号:16714229(2019)03008508
Vol.18 No.3 Jun. 2019
基于机器学习的类型推理方法综述
袁梦霆,谢 婧
传统的类型推理方法都是基于规则和语法结
构[1],传统的类 型 推 理 解 决 方 案 在 方 法 上 存 在 很 大的差异.它们可以使用静态分析、动态分析以及 它们的组合.如 Troshina等[2]采用了静态分析的 方法,Guo等[3]使 用 了 动 态 分 析 的 方 法,Lee等[4] 则采用了静态分析和动态分析的组合.另一方面, 它们可以选择从不同的类型信息来源出发,如 Ra man等[5]和 Srinivasan等[6]使用基于值的类型推 理方法,而 Chandra等[7]选择了基于流的类型推理 方法.不同的 类 型 推 理 方 法 还 可 以 采 用 不 同 的 数 据结构,如抽象语法树、路径图、函数调用图等.其 中,函数调用 图 是 利 用 程 序 中 函 数 之 间 的 调 用 关 系建立起的 模 型,抽 象 语 法 树 是 利 用 程 序 语 义 建 立起的模型.同时,对于所推理的类型也有很大的 差异,包括基本类(如整数、浮点和指针等)、聚合 数据类型(如数组),以及面向对象程序中的类.它 们也可以有不同的输入形式,如源码、二进制代码 和字节码等.但是,由于传统的类型推理方法基于 上下文与语法规 则,所 以 其 在 许 多 实 际 应 用 的 情 况下会具有局限性.在传统的 类 型 推 理 中,因 为 需 要 语 法 规 则 和 类 型 推 演 规 则 ,所 以 要 求 被 推 理 的 程 序 片 段 首 先 都 是 合 法 的 表 达 式 ,即 要 通 过 完 整的语法检查.然而随着软件 技 术 的 发 展,在 很 多 情 况 下 获 取 所 需 要 的 类 型 信 息 时 ,并 不 要 求 程 序 在 语 法 上 是 合 法 的 ,而 且 在 很 多 实 际 应 用 的 过
编辑代码 文 件 的 开 发 人 员 与 函 数 名、参 数 和 变量名等各 种 标 识 符 交 互,这 些 标 识 符 都 存 在 于 一个类型系 统 中,类 型 系 统 限 制 只 接 受 定 义 它 们 的操作数.在 编 译 时 进 行 类 型 推 理 了 解 类 型 可 以 提高代码的性能,并允许早期检测错误.较强的类 型系统对于 软 件 开 发 工 具 也 很 有 用,例 如 提 高 自 动完成的准 确 性 和 调 试 信 息.基 于 机 器 学 习 的 类 型推理可以 被 广 泛 应 用 于 程 序 错 误 检 测[8]、程 序 抽象、程序优化、代码补全、程序摘要、错误定位[9] 等多个软件领域.
1 类型推理介绍
类型推理 是 一 种 轻 量 级 的 形 式 化 方 法,是 编 程语言中的自动推理部分或全部表达式类型的能 力,通常在编译时完成.编译器能够推理变量的类 型或函数的 类 型 名,而 不 需 要 给 出 显 式 的 类 型 注 释.它包括分析一个程序,然后推理该程序中某些 或所有表达 式 的 不 同 类 型,这 样 程 序 员 就 不 需 要 每次在程序中使用变量时都显式地输入和定义数 据类型.类型 推 理 通 常 是 函 数 式 编 程 语 言 的 编 译 器特性,而不是面向对象编程语言的编译器特性. 编译器或解 释 器 只 需 要 最 少 的 信 息 和 上 下 文,就 可以确定变 量 或 表 达 式 的 数 据 类 型.推 理 算 法 尝 试确定参数 类 型 和 返 回 值 类 型,然 后 尝 试 找 到 与 所有参数一 起 工 作 的 最 特 定 的 数 据 类 型.类 型 推 理的输入可以是源代码、字节码或二进制代码,它 是在编译时 自 动 推 理 表 达 式 的 类 型,使 编 译 器 能 够在没有给出明确的类型注释的情况下推理出数 据和函数的类型.在许多情况下,如果类型推理系 统足够健壮,或者程序或语言足够简单,则可以完 全省略程序 中 的 类 型 注 释.在 程 序 编 写 和 编 译 执 行过程中,类型推理是一项很重要的功能.
相关文档
最新文档