静态/动态与强/弱

我发现这些术语在编程中遍布各处,我对它们的含义有一个模糊的概念。 搜索表明,事实上,这样的事情已经被问到遍及堆栈溢出。 据我所知静态/动态键入语言与强/弱键入有细微的差别,但是这种差异无法避免。 不同的来源似乎使用不同的含义,甚至交替使用这些术语。 我找不到能够谈论这两者的地方,并且实际上阐明了这些差异。 如果有人能够在这里为我和世界其他地方明确阐述这一点,那将是一件好事。


  • 静态/动态类型是指何时获取类型信息(无论是在编译时还是在运行时)

  • 强/弱类型是关于如何区分类型的严格性 (例如,该语言是否试图执行从字符串到数字的隐式转换)。

  • 有关更多详细信息,请参阅wiki页面。


    您已经发现业余爱好者谈论编程语言时使用的术语。 不要使用“强”和“弱”这两个词 ,因为他们没有普遍认同的技术含义。 相比之下, 静态类型意味着程序在执行之前会被检查 ,并且程序在启动之前可能会被拒绝。 动态类型意味着在执行期间检查值的类型,并且类型错误的操作可能会导致程序在运行时暂停或以其他方式发出错误信号 。 静态类型的主要原因是排除可能存在这种“动态类型错误”的程序。

    强类型通常意味着类型系统中没有漏洞 ,而弱类型意味着类型系统可以被破坏(使任何保证无效)。 这些术语经常被错误地用来表示静态和动态类型。 为了看清楚它们之间的区别,可以想象C:在编译时(静态类型)对语言进行了类型检查,但是有很多漏洞; 您几乎可以将任何类型的值转换为另一种相同大小的值 - 特别是,您可以自由地转换指针类型。 Pascal是一种打算强烈打字的语言,但着名的却有一个无法预料的漏洞:一个没有标签的变种记录。

    强类型语言的实现通常会随着时间的推移而产生漏洞,通常这样部分运行时系统可以用高级语言来实现。 例如,Objective Caml有一个名为Obj.magic的函数,它具有简单地返回其参数的运行时效果,但是在编译时它将任何类型的值转换为任何其他类型的值。 我最喜欢的例子是Modula-3,他们的设计师称他们的类型铸造构造LOOPHOLE

    话虽如此,你不能指望任何两个人以完全相同的方式使用“强”和“弱”两个词。 所以要避免它们。


    简单地说就是:在静态类型语言中 ,类型是静态的,意思是一旦你设置了一个变量类型,你就不能改变它。 这是因为打字与变量相关而不是它所指的值。

    例如在Java中:

    String str = "Hello";  //statically typed as string
    str = 5;               //would throw an error since java is statically typed
    

    而在动态类型语言中 ,类型是动态的,这意味着在将变量设置为某种类型后,可以对其进行更改。 这是因为打字与价值而不是变量相关联。

    例如在Python中:

    str = "Hello" # it is a string
    str = 5       # now it is an integer; perfectly OK
    

    另一方面,语言中的强/弱类型与隐式类型转换有关(部分来自@Dario的回答):

    例如在Python中:

    str = 5 + "hello" 
    # would throw an error since it does not want to cast one type to the other implicitly. 
    

    而在PHP中:

    $str = 5 + "hello"; // equals 5 because "hello" is implicitly casted to 0 
    // PHP is weakly typed, thus is a very forgiving language.
    

    静态类型允许在编译时检查类型的正确性。 通常编译静态类型语言,并解释动态类型语言。 因此,动态类型语言可以在运行时检查键入。

    链接地址: http://www.djcxy.com/p/72307.html

    上一篇: Static/Dynamic vs Strong/Weak

    下一篇: Why Is Dynamic Typing So Often Associated with Interpreted Languages?