PyPy在编译时是否进行静态类型检查以在编译时捕获类型错误?如果没有,那么HM类型推断会在编译时捕获这些错误吗?
答案 0 :(得分:4)
否。 (我假设通过PyPy,你的意思是带有JIT编译器和其他功能的Python解释器。)它不会随时对Python代码进行静态类型检查,因为它实现了Python语言,而不是静态类型的Python类语言。事实是,你不能静态地检测Python程序中的所有类型错误(对于大多数“类型错误”的定义)。您可以尝试找到一些,但即使 if 您可以证明在运行时会发生类型错误,您也无法拒绝执行该程序,因为它完全有效(有时是有用的)运行来自其他地方的代码并捕获异常。
顺便说一下,类型系统Damas-Hindley-Milner推断的类型甚至不足以表达Python程序中“类型”的有用子集(并不是最流行的静态类型系统更好) 。例如,尝试键入zip
(提示:Haskell没有它,它有几个专门用于2,3,4个参数的函数)。或者,如果你想要更难的事,getattr
。然后就是整个名义和结构上的子类型。
有人试图推断Python和类似语言中的类型,但这些方法必然与函数式编程世界在该领域所做的完全不同(见上文)。此外,这些项目从未在 Python 程序中找到所有类型错误(尽管有些已经涵盖了大大简化的子集,或者在Python程序中检测到了一些错误) 。做一些研究(Lambda the Ultimate有很多链接)。
现在,名称“PyPy”在历史上也用于RPython translation toolchain,它确实在许多其他方面推断了RPython程序的静态类型。但RPython不是Python(它有很多很多限制,以至于它实际上是一种不同的语言),类型系统和类型推断与DHM完全不同(整个程序,基于抽象解释,完全不同)不同类型的系统)。