动态类型语言的静态分析

时间:2016-04-30 20:23:19

标签: python static-analysis dynamic-typing

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

1 个答案:

答案 0 :(得分:2)

假设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)

返回float或int,float对。因此没有明确定义的返回值。静态分析应该如何处理不确定返回类型的函数?

这种考虑严格限制了静态分析器希望用动态类型语言实现的目标。 意味着对这些语言的所有静态分析都是不可能或毫无价值的。事实上,Python有静态分析工具,Pylint是最发达的。尽管如此,令人惊讶的是,Pylint errors and warnings中很少有人特别关注类型错误(例如尝试添加字符串和整数)。相反,几乎所有的错误和警告代码都更符合"assigning to function call which doesn't return"