当一种语言不需要声明变量类型的质量属于弱类型还是动态类型?

4

当一种编程语言不需要声明变量类型时(例如PHP和Perl),它的质量是否被称为弱类型或动态类型?我很难理解这两个术语。

我的理解是,动态/静态类型与类型转换有关,而弱/强类型与变量的声明有关。


2
不,这两件事情并没有必然联系。C#并不总是需要你声明类型,因为它具有“类型推断”功能;也就是说,它可以通过上下文判断类型。但它仍然是一种强类型语言。 - Robert Harvey
3个回答

3
根据:http://en.wikipedia.org/wiki/Type_system#Static_and_dynamic_type_checking_in_practice 弱类型意味着在使用时语言会隐式地转换(或强制类型转换)类型。
相反,当类型检查在编译时而不是运行时执行时,编程语言被称为使用静态类型。因此,强/弱和静态/动态是两个不同的维度。一种语言将会是强/弱之一,也会是静态/动态之一。例如,Ruby和Javascript都是动态类型的,但Ruby是强类型的,而Javascript是弱类型的。也就是说,在Ruby中,以下代码将会产生错误:
1.9.2p290 :001 > 'a'+1
TypeError: can't convert Fixnum into String

当在JavaScript中使用时,您会得到:

> 'a'+1
>> 'a1'

因此,强类型语言要求您将两个变量转换为相同的类型以便组合它们(例如使用1.to_s),而弱类型语言将尝试使用一些额外的内置语言逻辑将两个变量强制转换为相同的类型-在JavaScript的情况下,将任何东西与字符串组合将把它转换为一个字符串值。
参见:http://www.artima.com/weblogs/viewpost.jsp?thread=7590了解更多信息。

0
简单来说,强类型与对象的绑定方式有关(基本上是早期绑定与晚期绑定),而与对象的声明方式无关。
假设在C#中我有这个类:
public class Foo
{
    public int Bar;
    public double Baz;
}

我声明一个类型为foo的变量:

var myFoo = new Foo();

当我像这样引用Foo:

foo.

当我键入 . 时,Visual Studio将显示一个包含 Bar Baz 的列表,因为它已经知道 myFoo 包含这些成员; 它是 Foo 类型。 这是强类型; 这意味着如果我拼错了Bar或Baz,我的程序甚至无法编译。

然而,假设我声明了一个 dynamic 类型的变量,这会导致对象绑定被推迟到程序执行时:

dynamic myFoo = new Foo();
myFoo.Grapes = 6;

这将编译。在运行程序之前不会出现错误;因为 Foo 上不存在 "Grapes",会抛出运行时异常。


0

这是一个老问题,但对于未来的读者,这篇优秀的文章可能会澄清一些事情:http://blogs.perl.org/users/ovid/2010/08/what-to-know-before-debating-type-systems.html

虽然有点长,但绝对值得一读。

强类型和弱类型:

类型系统最常见的分类方式可能是“强类型”或“弱类型”。这很不幸,因为这些词几乎没有任何意义。在有限的范围内,可以比较两种非常相似的类型系统,并将其中一种指定为具有更强的系统。除此之外,这些词毫无意义。

静态类型和动态类型

这几乎是唯一有实际意义的常见类型系统分类。事实上,它的重要性经常被低估[...] 动态类型系统和静态类型系统是两个完全不同的东西,它们的目标部分重叠。
静态类型系统是编译器检查源代码并为语法片段分配标签(称为“类型”)的机制,然后使用它们推断程序行为的机制。动态类型系统是编译器生成代码以跟踪程序使用的数据类型(巧合的是,也称为其“类型”)的机制。在这两个系统中使用相同的“类型”一词当然不是完全巧合的;然而,最好将其理解为具有某种弱历史意义。试图找到一个世界观,其中“类型”在两个系统中真正意味着相同的东西,会导致极大的混乱。它们并不相同。
显式/隐式类型:
当使用这些术语时,它们指的是编译器将推理程序部分的静态类型的程度。所有编程语言都有某种形式的类型推理。有些比其他的更多。ML和Haskell具有隐式类型,因为不需要(或者根据所使用的语言和扩展名很少)类型声明。Java和Ada具有非常明确的类型,人们不断地声明事物的类型。以上所有语言都具有相对较强的静态类型系统(与C和C++相比)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接