it-swarm.cn

有哪些论点支持弱类型?

这是在与朋友的讨论中提出的,我发现自己很难想出任何好的论点。弱打字会带来什么好处?

41
Fishtoaster

这种讨论的问题很简单,就是术语“弱类型”和“强类型”是不确定的,与术语“静态类型”,“动态类型”,“显式类型”,“隐式类型”,“鸭式”,“结构式”或“标称”。哎呀,甚至仍然是研究和讨论的开放领域的术语“清单类型”和“潜在类型”也可能更好地定义。

因此,直到您的朋友提供了对“弱类型”一词的定义,该定义足够稳定,可以用作讨论的基础,回答这个问题甚至没有任何意义。

不幸的是,除了 Nick的答案 之外,没有人回答提供它们的定义,您也可以看到一些评论中产生的混乱。很难说,因为实际上没有人提供它们的定义,但是我想我仅在此页面上至少数了三个不同的定义。

一些更常用的定义是(是的,我知道,其中几乎没有任何意义,但是这些是我定义的看到人们实际使用):

  • 弱打字=不安全打字/强打字=安全打字
  • 弱类型=动态类型/强类型=静态类型
  • 弱类型=鸭子类型/强类型=名义类型
  • 弱类型=结构性类型/强类型=名义类型
  • 弱类型=隐式类型/强类型=显式类型
  • 弱打字=潜打字/强打字=清单打字
  • 弱打字=不打字/强打字=打字
  • 弱类型=隐式强制转换/强类型=仅显式强制转换
  • 弱类型=隐式或显式强制转换/强类型=完全不强制转换
  • 弱类型=隐式转换/强类型=仅显式转换
  • 弱类型=隐式或显式转换/强类型=完全没有转换
  • 弱类型=解释/强类型=编译
  • 弱打字=慢/强打字=快
  • 弱类型=垃圾回收/强类型=手动内存管理
  • 弱类型=手动内存管理/强类型=垃圾回收
  • ……还有许多其他

但是,似乎广泛使用most的三个定义是

  • 弱打字=您笨拙的cr脚编程语言/强打字=我的超赞编程语言
  • 弱类型=所有其他编程语言/强类型=我唯一想学习的编程语言(通常是Java,C#或C++;奇怪的是,以Haskell或Scheme为第一和唯一语言学习的人似乎并没有共享这个世界观)
  • 弱类型=我不懂的每种语言/强类型= Java(随意替换为C#或C++)

除非每个人都对什至的“弱类型输入”的定义达成共识,否则考虑其优势可能甚至没有意义。有什么优势?更糟糕的是,如果根本没有定义,那么每个人都可以改变定义以适合他们的论点,并且每次讨论都可以保证得到进行。陷入一场大战。

多年来,我本人已经多次更改了自己的定义,而现在我什至认为这些术语不再有用。我还曾经以为弱键入(在各种定义中)在Shell脚本中占有一席之地,但是每当我必须在Bash和PowerShell中解决相同的问题时,都会很痛苦地想起我错了。

46
Jörg W Mittag

请记住,有两个主要概念经常被混淆:

动态打字

当一种编程语言的大多数类型检查在运行时而不是在编译时执行时,可以说它是动态类型的。在动态类型化中,值具有类型,而变量则没有。也就是说,变量可以引用任何类型的值。

此处的优点通常不像“新”程序员那样被忽略,但对于任何程序员也可以很方便:

_if (!(arr is Array)) arr = [arr]; // is, instanceof, .constructor ==, whatever
_

在任何情况下,您不得不强制转换或分配新值的代码将更少:

_if (data is Array)) {
    i = data.length; // no i = ((Array)data).length or Array myArr=(Array)data;
}
_

打字错误

弱类型意味着语言在使用时会隐式转换(或强制转换)类型。

优点:

  • 将任何类型的值作为参数传递给函数。对于回调,灵活的API有用,并使闭包的实现更简单。
  • 隐式布尔评估任何类型都可以评估为布尔值。这也有一些副作用,例如可以将_||_的一部分用于赋值,而无需转换为布尔值:

    _var a = param || defaultValue;
    _
  • 再次减少代码:

    _var num = 5;
    var str = "Hello";
    input.innerHTML = input.value = num;
    for (var i=0; i < input.value; i++) { ... }
    _

    甚至Java也必须走一半路,在将对象与String组合时会隐式调用.toString();否则Java =程序员将整日咒骂它(日志语句将失去控制)。


这两个定义均来自 http://en.wikipedia.org/wiki/Type_system 。它说的比我好。

25
Nicole

主要参数for弱类型是性能之一。 (这是为了回答OP所述的问题)。关于动态与静态,隐式与显式的讨论很多。等等.

C是最著名的弱类型语言,它不对变量类型执行任何运行时检查或编译时检查。从本质上讲,您可以将char *强制转换为int *,而该语言将不在乎。那为什么要这么做呢?

C编程与您使用Assembly进行处理的方式非常接近,因此有时您只关心地址。出于这个原因,强制转换或传递void *引用并不少见。如果您知道内存的组织方式(同样是C和Assembly问题),则可以根据void *中的地址进行一些非常酷的计算,以获取所需的信息。这可以让您缩短必须在Java)中执行的过程。

尽管运行时类型检查没有太多的开销,但有时它足以使关键部分过慢。在这种情况下,我主要考虑的是嵌入式编程和实时系统。

就是说,在大多数情况下,拥有一个经过编译时间检查或运行时检查的强类型系统,其带来的好处多于痛苦。

7
Berin Loritsch

对于新手来说,弱类型通常更容易掌握,例如在Excel,javascript和vbscript之类的东西中。您还需要以一定的开发速度来换取潜在的错误。

关于该主题的好文章: 强类型输入与强测试

2
Homde