不需要声明变量类型的语言的质量是弱类型还是动态类型的例子

Posted

技术标签:

【中文标题】不需要声明变量类型的语言的质量是弱类型还是动态类型的例子【英文标题】:Is the quality of a language where it's not required to declare a variables type an example of weak typing or dynamic typing 【发布时间】:2012-06-30 13:10:12 【问题描述】:

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

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

【问题讨论】:

不,一件事与另一件事无关。 C# 并不总是要求您声明类型,因为它具有“类型推断”;即它可以通过上下文来判断类型是什么。但它仍然是一种强类型语言。 【参考方案1】:

根据: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。

【讨论】:

【参考方案2】:

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

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

public class Foo

    public int Bar;
    public double Baz;

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

var myFoo = new Foo();

当我引用 Foo 时,像这样:

foo.

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

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

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

这将编译。在程序运行之前我不会得到错误;由于Foo 上不存在葡萄,因此将引发运行时异常。

【讨论】:

【参考方案3】:

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

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

强类型和弱类型:

类型系统最常见的分类方式可能是“强” 或“弱”。这是不幸的,因为这些话几乎没有 完全的意思。在有限的范围内,可以比较两个 具有非常相似类型系统的语言,并指定一种具有 这两个系统中的强者。除此之外,这些话毫无意义 完全没有。

静态和动态类型

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

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

显式/隐式类型:

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

【讨论】:

以上是关于不需要声明变量类型的语言的质量是弱类型还是动态类型的例子的主要内容,如果未能解决你的问题,请参考以下文章

js中为什么说变量是弱类型和松散型?

Javascript数据类型转换

强类型和弱类型,静态类型和动态类型语言如何区分

js2

变量和数据类型

shell脚本编程之变量简介及脚本执行过程