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