动态语言的即时静态类型检查
摘要
Ruby、Python 和 JavaScript 等动态语言具有许多显著优势,但缺乏静态类型意味着细微的错误可能在代码中长期潜伏。尽管许多研究人员开发了各种系统以将静态类型的部分优势引入动态语言,但先前的方法难以处理元编程(metaprogramming),即在程序执行时生成代码。在本文中,我们提出了 Hummingbird,这是一个新系统,它利用一种名为即时静态类型检查的新技术,即使在存在元编程的情况下也能对 Ruby 代码进行类型检查。在 Hummingbird 中,方法类型签名是在运行时随着方法的创建而动态收集的。当调用方法时,Hummingbird 会根据当前的类型签名对该方法体进行静态类型检查。因此,Hummingbird 提供了基于每个方法的彻底静态检查,同时允许任意复杂的元编程。为了性能优化,Hummingbird 对静态类型检查过程进行了记忆化(memoizes),仅在必要时使缓存的检查失效。我们使用一种核心的类 Ruby 语言形式化了 Hummingbird 并证明了其可靠性(soundness)。为了评估 Hummingbird,我们将其应用于六个应用程序,其中包括三个重度依赖元编程的强大框架 Ruby on Rails 构建的应用。我们发现所有应用程序都能成功通过 Hummingbird 的类型检查,且其性能开销在合理范围内。我们将 Hummingbird 应用于某个 Rails 应用的早期版本,发现了若干曾被引入随后又被修复的类型错误。最后,我们展示了在 Rails 开发模式下使用 Hummingbird,以便在应用实时更新时对其进行类型检查。
引用
@article{arxiv.1604.03641,
title = {Just-in-Time Static Type Checking for Dynamic Languages},
author = {Brianna M. Ren and Jeffrey S. Foster},
journal= {arXiv preprint arXiv:1604.03641},
year = {2016}
}
备注
19 pages, 6 figures, 2 tables, 1 appendix, This is a preprint of a paper to appear in Programming Language Design and Implementation (PLDI 2016)