【问题标题】:Static analysis on a dynamically typed language动态类型语言的静态分析
【发布时间】: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


    【解决方案1】:

    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"

    【讨论】:

    • 通过在它不知道的地方传递一个类型“any”,在它知道的地方传递更严格的类型界限。它可能无法推理特定的代码,但大多数程序员不会编写他们不理解的代码。应该能够为 Python 构建一个静态分析器。可能很多都不懂。如果它确实了解正在发生的事情,它可能会相当好。
    • @IraBaxter 我正在解释链接到论文声明背后的内容,大意是静态分析(在论文中定义为在运行时之前捕获所有违反类型约束的工具)是不切实际的在动态类型语言中。声明并不是说不可能进行任何静态分析,只是说对整个程序进行全面的静态分析是不切实际的,它在编译时确定每个表达式和变量的类型。不过,你提出了一个很好的观点。我将编辑以包括一个警告。谢谢。
    • How could any static analysis tell if x was a string or a list of integer 它可以轻松地为 x 分配一个联合类型的字符串和整数列表,并在其使用与这两个选项不兼容时给出有意义的错误。
    猜你喜欢
    • 2016-09-26
    • 2011-10-29
    • 2014-06-26
    • 1970-01-01
    • 2014-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多