动态类型语言的静态分析

Static analysis on a dynamically typed language

我正在阅读 http://tratt.net/laurie/research/pubs/html/tratt__dynamically_typed_languages/#x1-50002.3,它解释说静态分析不是动态类型语言的实用方法,但原因不是很清楚。我的问题是为什么静态分析在动态类型语言上非常实用?

假设cond(y)是一个布尔值函数。假设你有行

x = "Hello World" if cond(y) else [1,2,3]

其中 y 是其他一些变量。静态分析如何判断 x 是字符串还是整数列表? y 在编译时未知。唯一的判断方法是 运行 程序——这违背了静态分析的目的

一个更现实的例子:

def squareRoot(x):
    if x > 0:
        return math.sqrt(x)
    else:
        return (0,math.sqrt(abs(x))) #representing complex a+bi as (a,b)

这个 return 是一个浮点数或一个 int,float 对。因此没有明确定义的 returned 值。静态分析应该如何处理不确定 return 类型的函数?

这种考虑对静态分析器希望使用动态类型语言完成的工作施加了严格的限制。这 并不 暗示对此类语言的所有静态分析都是不可能或毫无价值的。其实有针对Python的静态分析工具,跟Pylint being the most developed. Even there, though, it is surprising how few of Pylint's errors and warnings是专门针对类型错误的(比如想把一个字符串和一个整数相加)。相反,几乎所有的错误和警告代码都更符合 "assigning to function call which doesn't return".