Compiling Gradual Types with Evidence
University of Chile(智利大学)
本文提出GrEv编译器,基于证据实现高效渐进类型化,实验显示其性能优于基于转换的编译器。
2025-12-27 cs.PL
Corpse Reviver: Sound and Efficient Gradual Typing via Contract Verification
渐进类型化程序设计语言允许将静态类型增量添加到非类型化程序中。为了保持可靠性,语言在类型化和非类型化代码之间的边界处插入运行时检查。不幸的是,性能研究表明,这些检查的开销可能高得惊人,这让人们对声音渐进式输入的可行性产生了疑问。在本文中,我们表明,通过建立在现有的工作软合同验证,我们可以减少或消除这种开销。我们的关键见解是,虽然非类型化代码不能被渐进类型系统信任,但在优化渐进类型化程序时,没有必要只考虑最坏的情况。相反,我们静态分析的非类型化的部分逐渐类型化的程序,以证明几乎所有的动态检查暗示逐渐类型边界不能失败,并可以在编译时消除。我们的分析是模块化的,可以应用于程序的任何部分。我们评估了这种方法对现有的十几个渐进式程序以前表现出令人望而却步的性能开销--与$3.5\times$的中位数开销和高达$73.6\times$在最坏的情况下--和消除所有的开销在大多数情况下,在最坏的情况下,只有$1.6\times$开销的痛苦。
2020-10-09 cs.PL
Abstracting Gradual Typing Moving Forward: Precise and Space-Efficient (Technical Report)
抽象渐进类型化(AGT)是一种设计渐进类型语言的系统方法。使用AGT开发的语言自动满足Siek等人[2015]确定的渐进语言的形式语义标准。尽管如此,vanilla AGT语义仍然有重要的缺点。首先,渐进式语言的运行时检查应该保留底层静态和动态语言固有的空间效率保证。相反,AGT的默认操作语义会破坏正确的尾调用。其次,渐进式语言的运行时检查应该强制执行静态类型规程所期望的基本模块化的基于类型的不变量。相反,AGT的默认操作语义可能无法以令人惊讶的方式强制执行某些不变量。我们在Garcia等人[2016]的$\text{GTFL}_\lesssim$语言中证明了这一点。本文解决了这两个问题,一次通过精炼AGT的动态检查的理论基础。Garcia et al. [2016]观察到AGT涉及两个静态类型的抽象:一个用于静态语义,一个用于动态语义。我们将后者重新定义为子类型本身的抽象解释,而渐进类型仍然抽象静态类型。然后,我们展示了前向完整性[Giacobazzi和Quintarelli 2001]是支持空间高效执行和可靠运行时类型强制的关键。
2020-11-11 cs.PL
Gradual Typing for Extensibility by Rows
这项工作研究了行类型和行多态性的逐步类型化。这项工作中的关键要素是动态行类型,它表示行的静态未知部分,以及行类型的一致性,它允许将静态行类型注入动态行类型,反之,将动态行类型投影到任何静态行类型。虽然一致性静态地捕获动态行类型的行为,但当与标识行类型直到字段重新排序的行等价相结合时,它使逐渐类型化语言的语义不一致。为了解决这个问题,我们开发了一致等价,它的特点是一致性和行等价的组合。使用一致等价,我们提出了一个多态归咎演算行类型和行多态性。在我们的责备演算中,强制转换不仅执行动态行类型的运行时检查,而且还执行行类型中的字段重新排序。为了简化行多态性的技术开发,我们采用了作用域标签,这是Koka语言所采用的,也是在效果系统的上下文中出现的。利用这些技术发展给出了我们的责备演算的形式化定义,并证明了它的类型可靠性。我们还勾画了逐渐类型化的表面语言和类型保持翻译的表面语言的责任演算和讨论的保守性的表面语言的静态类型化的语言与行类型和行多态性。
2019-10-22 cs.PL
Call-by-name Gradual Type Theory
本文提出按名调用渐进类型理论,通过普遍性质定义动态类型、类型转换和类型错误,证明标准转换行为由渐进保证唯一确定,并构建了域理论模型。
2020-01-29 cs.PL
First-order Gradual Information Flow Types with Gradual Guarantees
信息流类型系统通过在编译时检测未授权的数据流来增强不干扰的安全属性。但是,它们需要精确的类型注释,这使得它们在实践中很难使用,因为大部分遗留基础结构都是用非类型化或动态类型化语言编写的。渐变类型无缝地集成了静态和动态类型,提供了两种方法的最佳效果,并已应用于信息流控制,其中信息流监视器来自渐变安全类型。先前关于渐进信息流类型的工作揭示了不干涉和动态渐进保证之间的紧张关系-程序中不太精确的安全类型注释不应该导致更多的运行时错误。本文重新审视了渐进式信息流类型和信息流监控器之间的联系,以确定渐进式保证和不干涉之间的紧张关系的根本原因。我们开发了一个简单的命令式语言的运行时语义与渐进的信息流类型,提供不干扰和渐进的保证。我们利用FlowML开发的证明技术,并将非干扰证明减少到保存证明。
2021-02-09 cs.PL
Sums of Uncertainty: Refinements Go Gradual
静态类型函数式语言的一个长期存在的缺点是类型检查不能排除模式匹配失败(运行时匹配异常)。细化类型区分不同的数据类型值;如果用细化注释的程序通过了类型检查,那么模式匹配失败就变得不可能了。不幸的是,细化是类型的单一属性,这加剧了向非平凡程序添加细化类型的难度。渐进式类型化探索了如何在静态类型化和动态类型化之间渐进地移动。我们开发了一个类型系统的逐步总和,结合细化与不精确。然后,我们开发了一个双向版本的类型系统,它排除了过度的不精确性,并给出了一个类型导向的翻译到一个目标语言显式转换。我们证明了静态子语言不能有匹配失败,一个良好类型的程序仍然是良好类型的,如果它的类型注释不太精确,并使注释不太精确的原因目标程序失败后。其中一些结果与Siek et al.(2015)给出的渐进分型标准相对应。
2020-09-19 cs.PL
Denotational Semantics of Gradual Typing using Synthetic Guarded Domain Theory (Extended Version)
本文提出一种基于受卫域论的渐近类型指称语义,结合步进索引逻辑关系的通用性与指称语义的模块化,在简单 lambda 演算上证明了 beta-eta 等式有效性与渐近性定理,并在 Guarded Cubical Agda 中完成核心定理机械化,为渐近类型程序语义提供可重用的数学基础。
2025-07-10 cs.PL
Efficient Selection of Type Annotations for Performance Improvement in Gradual Typing
The University of Tokyo(东京大学)
本文提出了一种通过类型推断选择类型注解子集的方法,以提高渐进类型程序的执行性能,实验表明其在Reticulated Python中有效。
2026-03-05 cs.PL
Gradual Certified Programming in Coq
表达性的静态类型规则是实现高质量软件的一种强有力的方法。然而,不应低估采用这些技术的成本。就像渐进式类型允许从动态类型到静态类型的程序的平滑过渡一样,支持渐进式路径到认证编程似乎是可取的。我们探索逐步认证的编程在Coq,提供了可能性,推迟选定的属性的证明,并检查“在运行时”是否属性实际上举行。强制转换可以与Coq的隐式强制机制集成,以支持隐式强制转换插入(渐进类型化)。此外,当将Coq函数提取到主流语言时,我们的强制转换编码支持将假定的属性提升到运行时检查中。令我们惊讶的是,没有必要以任何方式扩展Coq来支持渐进式认证编程。类型类和公理的简单混合使得以简单的方式将渐进认证编程引入Coq成为可能。
2015-08-22 cs.PL
Gradual Session Types
会话类型是一种基于线性类型的丰富类型规程,它将类型系统附带的安全声明提升到通信中。然而,基于Web的应用程序和微服务通常是用混合语言编写的,类型规则介于静态和动态类型之间。渐进式会话类型通过提供一个框架来解决这种混合设置,该框架允许在会话的静态类型处理和任何所需程度的动态类型处理之间进行无缝转换。我们提出渐进式GV作为功能会话类型系统GV的渐进式扩展。Gradual GV遵循渐进类型化的标准框架,由外部语言和内部语言组成,外部语言使用动态类型来放松GV的类型系统,内部语言使用强制转换,并给出了操作语义,以及从前者到后者的强制转换插入翻译。我们证明了类型和通信安全以及责备安全,从而扩展以前的结果,以功能语言与基于会话的通信。线性和动态类型的相互作用需要一种新的方法来指定语言的动态。
2019-09-16 cs.PL
Deriving a Simple Gradual Security Language
抽象渐进类型化(AGT)是一种系统地导出静态类型规则的渐进对应物的方法。该方法包括通过将渐变类型解释为静态类型集来定义渐变类型的语义,然后定义一个最佳抽象回到渐变类型。这些操作用于将静态规程提升到渐进设置。渐进式语言的运行时语义随后作为渐进式类型派生的约简而出现。为了证明AGT的灵活性,我们渐进的$λ_\text{SEC}$,原型安全类型化的语言,相对于只有安全标签,而不是整个类型,产生一个类型系统,范围逐渐从简单类型到复杂类型。我们使用Zdancewic的逻辑关系证明方法建立了渐进语言的无干扰性,称为$λ_{\widetilde{\text{SEC}}}$。而以前的工作提出了渐进的安全转换语言,这需要显式的安全转换,这项工作产生的第一个渐进的安全源语言,这需要没有显式的转换。
2015-11-20 cs.PL
Gradual System F
将渐进式类型的好处带到像System F这样具有参数多态性的语言中,同时保持关系参数性,已经证明是非常具有挑战性的:第一次尝试是在十年前制定的,最近提出了几种设计,具有不同的语法,行为和属性。从影响渐进参数化语言设计的挑战和紧张局势的详细审查开始,这项工作提出了GSF的语义和元理论的广泛帐户,一个渐进的对应系统F。在这样做的过程中,我们还报告在何种程度上的抽象逐步类型化的方法可以帮助我们得到这样的语言。在遵循System F语法的渐进参数化语言中,GSF实现了独特的属性组合。我们清楚地建立语言的优点和局限性,并讨论了几个扩展的GSF走向一个实用的程序设计语言。
2020-05-29 cs.PL
Space-Efficient Gradual Typing in Coercion-Passing Style
Herman等人指出,在渐进类型化程序中插入运行时检查可能会妨碍尾部调用优化,从而恶化程序的空间复杂度。为了解决这个问题,他们提出了一个空间有效的强制演算,随后由Siek等人改进。这些演算的语义涉及到由随机数表示的运行时检查的渴望组合,以防止术语的大小增长。然而,它还依赖于一个非标准的归约规则,这似乎不容易实现。事实上,没有渐进类型语言的编译器实现完全忠实地支持空间有效的语义。在本文中,我们研究了Herman等人已经提到过的子传递风格,作为一种简单的空间有效实现渐进类型语言的技术。一个程序在继承传递风格传递“其余的运行时检查”-就像延续传递风格(CPS),其中“其余的计算”被传递-和(不像CPS)组成继承急切。本文给出了Siek等人的$λ$ S到$λ$ S $_1$的形式化的传递函数转换,并证明了转换的正确性.我们还实现了我们的Grift编译器的Kuhlenschalet等人的实验结果表明,堆栈溢出可以适当地防止在大多数部分类型的实际程序的执行速度慢3倍的成本。
2020-11-10 cs.PL
Guard Analysis and Safe Erasure Gradual Typing: a Type System for Elixir
Université Paris Cité(巴黎西岱大学);CNRS(法国国家科学研究中心)
本文为 Elixir 语言形式化了一个结合渐进类型与语义子类型的新类型系统,通过运行时检查和守卫分析实现精确、可靠且实用的静态类型分析,并提出了“强函数”和守卫细粒度分析两项关键创新,在保持兼容性和性能的同时确保类型安全性。
2026-10-26 cs.LO cs.PL
Gradual Tensor Shape Checking
张量形状不匹配是深度学习程序中常见的错误来源。我们提出了一种新的基于类型的方法来检测张量形状不匹配。我们的方法的主要特点之一是尽最大努力的形状推理。由于张量形状推理问题一般是不可判定的,我们允许静态类型/形状推理只能以尽力而为的方式进行。如果静态推断不能保证不存在形状不一致,则将动态检查插入到程序中。另一个主要特性是渐进类型,用户可以通过向程序添加适当的类型注释来提高推理的精度。我们形式化了我们的方法,并证明它满足Siek等人在2015年提出的渐进分型标准。我们已经实现了一个原型形状检查工具,我们的方法的基础上,并评估其有效性,将其应用到一些深神经网络程序。
2023-03-25 cs.PL
Approximate Normalization and Eager Equality Checking for Gradual Inductive Families
利用依赖类型语言的能力可能很困难。程序员必须手动构造证明以生成良好类型的程序,这不是一件容易的事情。特别是,将代码迁移到这些语言是具有挑战性的。渐进式类型化通过以一种原则性的方式混合静态和动态检查,可以使依赖类型化语言更容易使用。使用渐变类型,程序员可以逐步将代码迁移到依赖类型的语言。然而,将渐进类型添加到依赖类型会带来新的挑战:在全功能语言中混合可判定类型检查和增量迁移是一种不稳定的平衡。程序员期望类型检查终止,但依赖类型检查器在编译时评估术语,这是有问题的,因为渐进类型可能会将非终止性引入到否则终止的语言中。为缓解这种不终止现象而采取的步骤不得危及动态和静态之间的平稳过渡。我们提出了一种渐进依赖类型语言,它支持归纳类型族,具有可判定的类型检查,并可证明支持静态和动态之间的平滑迁移,正如Siek等人(2015)提出的渐进类型化的细化标准所编码的那样。与Eremondi等人(2019)一样,我们使用近似归一化来终止编译时求值。与Eremondi等人不同,我们的规范化不需要变量的比较,允许我们用容纳归纳类型的语法模型来显示终止。此外,我们设计了一种新的技术跟踪类型索引的约束,使动态约束违反信号运行时的错误急切。为了方便这些检查,我们定义了一个代数概念的渐进精度,公理化的渐进条款的某些语义属性。
2021-07-10 cs.PL
Dynamic Type Inference for Gradual Hindley--Milner Typing
Garcia和Cimini研究了ITGL的类型推断问题,并为ITGL开发了一个可靠的完整的推断算法。可靠性和完整性意味着,如果算法成功,输入项可以通过强制转换插入转换为显式类型的责备演算的良好类型项,反之亦然。然而,一般来说,根据静态类型推断未确定的类型变量如何用具体的静态类型实例化,有许多可能的转换。更糟糕的是,翻译后的术语可能会表现得不同-有些评价价值观,但其他人则提出指责。在本文中,我们提出了一个新的责任演算$λ^{\textsf{DTI}}_{\textsf{B}}$,避免了这种分歧的ITGL的中间语言和形式化。一个主要的想法是允许一个术语包含类型变量(在静态类型推断期间没有被实例化),并将这些类型变量的实例化推迟到运行时间。我们将动态类型推断(DTI)引入到$λ^{\textsf{DTI}}_{\textsf{B}}$的语义中,使得类型变量沿着约简被实例化。基于DTI的语义不仅避免了上述分歧,而且在以下意义上相对于完全实例化的项的语义是合理和完整的:终止于值),则存在该术语的完全实例化版本,该完全实例化版本也在显式类型化的归咎演算中成功,反之亦然。最后,我们证明了ITGL的渐进保证,这是渐进类型语言的一个重要的正确性准则。
2018-11-09 cs.LO cs.PL
A Gradual Type System for Elixir
Elixir是一种具有动态类型的函数式程序设计语言。我们提出了一个渐进的类型系统,使它能够执行类型检查的语言的一个重要的片段。类型系统的一个重要特性是它不需要对Elixir进行任何语法更改。类型信息是通过函数签名提供的,这些签名是根据Elixir typespec指令声明的。建议的类型系统是基于子类型和向后兼容,因为它允许存在的非类型化的代码片段。我们已经在Elixir中实现了类型检查器的原型。
2021-04-16 cs.PL
Transient Typechecks are (Almost) Free
瞬态渐进类型强制执行运行时类型测试,这通常会导致程序性能的线性下降。这种性能影响不鼓励使用类型注释,因为向程序添加类型会使程序变慢。虚拟机可以采用标准的实时优化,将瞬时检查的开销降低到接近零。这些优化可以使渐进类型语言的性能与最先进的动态语言相当,因此程序员可以在不影响程序性能的情况下向代码中添加类型。
2019-02-18 cs.PL
Gradual Liquid Type Inference
液态类型提供了一种可判定的细化推理机制,它很方便,但有两个主要问题:(1)推理是全局的,需要顶级注释,这使得它不适合模块化代码组件的推理,并禁止其适用于库代码,以及(2)推理失败导致模糊的错误消息。这些困难严重阻碍了现有代码的迁移以使用改进。本文表明,逐步液体类型推断-液体推理和逐步细化类型的新组合-解决这两个问题。支持乐观解释的不精确谓词的渐进细化类型可以在参数位置中使用以约束流动推理,使得全局推理过程e有效地推断可用于库组件的模块化规范。双重地,当逐渐改进作为推理的结果出现时,它们表示静态改进的使用不一致。因为液体细化是从一个nite集合的谓词,在逐渐液体类型推断,我们可以枚举每个不精确的细化的安全具体化,即静态细化,证明为什么一个程序是逐渐良好的类型。此枚举对于静态液体类型错误的解释非常有用,因为安全具体化显示了导致静态类型错误的所有潜在不一致性。我们发展了渐进式液态类型推断理论,并在液态Haskell语言环境下对其语用进行了探讨。
2019-10-30 cs.PL
Gradual Program Analysis for Null Pointers
静态分析工具通常通过要求程序员显式地注释他们的代码来解决过多误报的问题。然而,当面对不完整的注释时,许多分析工具要么过于保守,产生误报,要么过于乐观,导致不合理的分析结果。为了灵活和健全地处理部分注释的程序,我们建议建立和适应逐步类型化的方法,以抽象解释为基础的程序分析。具体来说,我们专注于空指针分析,并证明了一个渐进的空指针分析击中了一个甜蜜点,优雅地应用静态分析在可能的情况下,并依赖于动态检查在必要的健全性。除了正式的核心命令式语言的逐步空指针分析,我们建立了一个原型使用推断静态分析框架,并提出初步证据表明,逐步空指针分析减少误报相比,现有的空指针检查推断。此外,我们讨论了渐进的方法,用于从其静态对应的逐步分析可以扩展到支持更多的域。因此,这项工作为未来的分析工具提供了基础,这些工具可以顺利地在人力和运行时开销之间进行权衡,以减少报告的误报数量。
2021-07-15 cs.PL
A Gradual Probabilistic Lambda Calculus
University of Chile(智利大学);Millennium Institute of Foundational Research on Data (IMFD)(数据基础研究千年研究所);National University of Singapore(新加坡国立大学)
本文提出并形式化了GPLC,一种渐进源概率λ演算,通过二元概率选择运算符实现静态与动态检查的渐进过渡,支持渐进引入/移除类型和概率注解,证明了其类型安全性和渐进保证。
2026-10-16 cs.PL
Gradual Soundness: Lessons from Static Python
上下文:渐进类型化语言允许类型化和非类型化代码互操作,但通常会带来明显的缺点。在某些语言中,类型是不可靠的;在另一些语言中,跨类型边界的通信可能非常昂贵;还有一些语言只允许有限形式的互操作性。研究界正在积极寻求一种声音,快速,和渐进式打字的表达方法。咨询电话:本文介绍了静态Python,这是一种由Instagram工程师开发的语言,已经证明了它在生产中的可靠性,快速性和合理的表达性。静态Python的渐进类型方法本质上是一种程序员可调的具体和瞬态方法的组合。具体类型提供完全可靠性和低性能开销,但会强加非局部约束。暂时类型在浅层意义上是合理的,并且更容易使用;它们有助于弥合非类型化代码和类型化具体代码之间的差距。方法:我们评估语言的当前状态,并开发一个模型,该模型捕捉了渐进类型方法的本质。我们利用个人沟通、错误报告和静态Python回归测试套件来开发此模型。知识:我们的主要发现是,混凝土和瞬态类型的混合所产生的逐渐健全性是降低混凝土方法的维护成本的有效方法。我们还发现,基于方法的JIT技术可以消除瞬态方法的成本。在更技术的层面上,本文描述了两个贡献:静态Python的模型和静态Python的性能评估。在形式化过程中发现了执行中的几个错误,包括致命错误。接地:我们的静态Python模型在PLT Redex中实现,并使用基于属性的可靠性测试和静态Python回归套件中的265个测试进行测…
2022-06-28 cs.PL
A Vision for Online Verification-Validation
今天的程序员面临着一个错误的选择,是创建可扩展的软件还是创建正确的软件。具体而言,动态语言允许软件具有丰富的可扩展性(通过动态代码加载、动态对象扩展和各种形式的反射),并且今天的程序员利用这种灵活性来“带来他们自己的语言特征”以丰富可扩展语言(例如,通过使用公共JavaScript库)。与此同时,这种基于库的语言扩展通常缺乏对其抽象的执行,导致难以避免和预测的编程错误。为了提供验证这个可扩展的世界,我们提出了在线验证验证(OVV),其中包括语言和VM设计,使一个“无阶段”的方法来程序分析,在对比标准的静态-动态阶段的区别。无阶段分析自由地将抽象解释与具体执行相结合,允许分析使用动态(具体)信息来证明关于未来执行的普遍(抽象)属性。在本文中,我们提出了一个概念概述OVV通过激励的例子程序,使用一个假设的数据库库。我们提出了一个通用的OVV语义,并扩展到这个语义,提供了一个简单的渐进的类型系统的数据库库原语。在OVV设置中实例化这个渐进类型系统的结果是一个检查器,它可以渐进地键入程序的连续延续,直到一个延续被完全验证。为了评估这个例子中OVV的建议愿景,我们实现了VM语义(在Rust中),并表明这种设计允许以这种方式进行渐进式类型化。
2016-08-21 cs.PL