4

不需要声明变量类型(例如 PHP 和 Perl)的语言的质量是弱类型还是动态类型?我很难理解这两个术语。

动态/静态类型与类型转换有关,而弱/强类型与变量减速有关,我对吗?

4

3 回答 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 的情况下,将任何内容与 String 组合将其转换为 String 值。

请参阅:http ://www.artima.com/weblogs/viewpost.jsp?thread=7590以获得进一步的解释。

于 2012-06-28T23:54:46.210 回答
0

简单来说,强类型更多地与对象的绑定方式(本质上是早期绑定与后期绑定)有关,而不是与对象的声明方式有关。

假设在 C# 中我有这个类:

public class Foo
{
    public int Bar;
    public double Baz;
}

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

var myFoo = new Foo();

当我引用 Foo 时,如下所示:

foo.

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

但是,假设我声明了一个类型为dynamic This 的变量,这会导致对象绑定延迟到程序执行为止:

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

这将编译。在程序运行之前我不会得到错误;将抛出运行时异常,因为 Grapes 不存在于Foo.

于 2012-06-29T00:01:49.373 回答
0

这是一个老问题,但对于未来的读者来说,这篇很棒的文章可能会让事情变得更清楚:http: //blogs.perl.org/users/ovid/2010/08/what-to-know-before-debating-type-systems。 html

它有点长,但绝对值得。

强类型和弱类型:

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

静态和动态类型

这几乎是唯一具有实际意义的类型系统的常见分类。事实上,它的重要性经常被低估 [...] 动态和静态类型系统是两个完全不同的东西,它们的目标恰好部分重叠。

静态类型系统是一种机制,编译器通过该机制检查源代码并将标签(称为“类型”)分配给语法片段,然后使用它们来推断程序的行为。动态类型系统是一种机制,编译器通过该机制生成代码以跟踪程序使用的数据类型(巧合的是,也称为“类型”)。当然,在这两个系统中使用同一个词“类型”并非完全巧合。但最好将其理解为具有某种微弱的历史意义。试图找到一种世界观,其中“类型”在两个系统中真正意味着相同的东西,导致了极大的混乱。它没有。

显式/隐式类型:

当使用这些术语时,它们指的是编译器对程序部分的静态类型进行推理的程度。所有编程语言都有某种形式的关于类型的推理。有些人比其他人拥有更多。ML 和 Haskell 具有隐式类型,因为不需要(或很少,取决于使用的语言和扩展)类型声明。Java 和 Ada 有非常明确的类型,并且不断地声明事物的类型。以上所有都具有(例如,相对于 C 和 C++)强静态类型系统。

于 2014-03-30T23:58:40.370 回答