【发布时间】:2016-04-30 20:23:19
【问题描述】:
我正在阅读http://tratt.net/laurie/research/pubs/html/tratt__dynamically_typed_languages/#x1-50002.3,它解释说静态分析不是动态类型语言的实用方法,但原因不是很清楚。我的问题是为什么静态分析在动态类型语言上非常实用?
【问题讨论】:
标签: python static-analysis dynamic-typing
我正在阅读http://tratt.net/laurie/research/pubs/html/tratt__dynamically_typed_languages/#x1-50002.3,它解释说静态分析不是动态类型语言的实用方法,但原因不是很清楚。我的问题是为什么静态分析在动态类型语言上非常实用?
【问题讨论】:
标签: python static-analysis dynamic-typing
说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)
这将返回一个浮点数或一个 int,float 对。因此没有明确定义的返回值。静态分析应该如何处理不确定返回类型的函数?
这种考虑严重限制了静态分析器希望使用动态类型语言完成的工作。这并不意味着对此类语言的所有静态分析都是不可能或毫无价值的。其实Python也有静态分析工具,Pylint是最发达的。尽管如此,令人惊讶的是,Pylint 的errors and warnings 很少专门针对类型错误(例如尝试添加字符串和整数)。相反,几乎所有的错误和警告代码都更像"assigning to function call which doesn't return"。
【讨论】:
How could any static analysis tell if x was a string or a list of integer 它可以轻松地为 x 分配一个联合类型的字符串和整数列表,并在其使用与这两个选项不兼容时给出有意义的错误。