有哪些论点支持弱类型?


40

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


17
Cooper和Torczon的Engineering a Compiler将弱类型定义为使用设计不良的类型系统。那肯定听起来不会使任何人受益。
科宾2011年3

@Corbin March:很好。我需要将其添加到我的列表中。
约尔格W¯¯米塔格

5
最好的论据可以由公司高管给出:它允许我雇用便宜的人来构建我的系统
2014年

Answers:


46

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

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

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

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

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

然而,似乎广泛使用的三个定义是

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

除非大家对什么是“弱类型”即使是同意的定义,它甚至没有意义的,想想它的优势可能。优点是什么?更糟的是,如果没有定义可言,那么每个人都可以只改变他们的定义,以适应他们的论点,和每一个讨论几乎保证下放成flamewar。

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


5
愤世嫉俗的答案!我知道您来自哪里,但我觉得这“足够好”,可以猜出没有提供定义的人都在指“弱和/或动态类型”,这就是为什么我在答案中都包括了这两个原因。我知道它不是完美的,但是大多数人似乎在定义类型系统时会微调。
妮可(Nicole)

7
@Renesis:我称之为“现实主义” :-)我已经看到了足够多的关于类型系统的讨论,以意识到一半的人没有意识到他们在谈论完全不同的事情,而另一半人却不知道他们在说什么有关在所有。几个月前,关于一种我不会命名的语言的核心开发列表进行了讨论,有关添加可选的类型系统以提高性能。讨论进行了一周,涉及数十人和数百封邮件。没有意识到定义上的可选类型系统不能提高性能。...
约尔格W¯¯米塔格

8
+1愤世嫉俗!您可能会添加“强类型输入=当IDE知道我的变量类型(Intellisense等)时,弱类型键入=何时不知道”)
user281377 2012年

1
用于类型系统的更好定义的名称缺少具有的隐式值判断。
伊娃(Eva)2013年

1
华丽,有趣且准确。我对类型系统了解的越多,我越意识到在一种语言与另一种语言根本没有区别的错觉下遭受了多长时间。这个概念引起了多少混乱,真是令人惊讶,我真的认为,只要我们接受弱/强不是一件真事,那是没有必要的,所以让我们谈一谈实际上是什么,也许我们会学到一些东西。
BrianH

25

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

动态打字

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

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

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也必须走一部分路,.toString()将对象与String; 组合在一起时会隐式调用。否则,Java程序员将整日咒骂它(日志语句将失去控制)。


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


1
在需要使用静态类型的语言生成大量代码的情况下,动态类型化也是有益的。将C#中的Entity Framework与动态类型的语言(PHP,Python等)的ORM库所需的代码生成量进行比较。尽管有些人可能会争辩说,IDE IntelliSense的好处超过了所有代码生成的成本……
Dean Harding

3
您的评论“ //否i =((Array)data).length或Array myArr =(Array)data;” 与动态类型无关,因为数据的数组性在编译时就可以证明。静态类型的语言可以传播从instanceof获得的知识。
彼得·泰勒

@Peter Taylor,我想这在简单的情况下是正确的,你知道吗?它确实与动态类型有关,因为无论使用的是if块还是其他更复杂的逻辑(甚至是运行时还是动态的)逻辑,下一行都是合法的并且不会出错。
妮可(Nicole)

@Renesis,我不知道。但是ML语言家族是静态类型的,并且使用类型推断,因此您很少需要显式声明变量的类型。
彼得·泰勒

1
@彼得泰勒是正确的。在具有更好的静态类型系统的语言中,例如Haskell,Scala甚至C#,在某些情况下,动态类型的许多好处是可用的。我要说的是动态类型化的主要优点是处理固有的无类型的事物,例如HTML DOM。为什么要编写node [“ attr”]而不是node.attr?无论如何,它们总是在运行时解决。
Matt Olenik

7

主要论点弱打字的性能之一。(这是为了回答OP所述的问题)。关于动态与静态,隐式与显式,有很多很好的讨论。等等

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

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

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

就是说,在大多数情况下,拥有一个经过编译时间检查或运行时检查的强类型系统,其帮助多于伤害。


2
我不明白为什么强类型语言不能像C那样高效地进行编译。但是编译器应该复杂得多。
9000

2
C ++是一种这样的语言的示例。在C ++中,所有类型检查都是在编译时完成的,而没有在运行时完成的……除非您启用了RTTI。
Berin Loritsch 2011年

2
不确定我是否同意这种性能观点,但这一个有趣的观点。
马丁·巴

2

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

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


1
我认为弱类型语言和新手友好的语言之间没有强烈的对应关系。Ruby和python是强类型的,通常被认为是新手友好的。C是弱类型的,通常被认为是新手敌对的。
sepp2k 2011年

不,不是一般的语言,我只是在谈论打字
Homde 2011年

2
动态和强类型是新手友好的组合。尽管我已经看到,当人们从静态类型的语言过渡到动态类型的语言时,他们也会感到非常困惑。自从学校大多数时候最开始讲C或Java以来​​,我从未见过有人从动态类型入手过。
jsternberg 2011年

3
@Mchl:与静态/动态或强/弱键入无关。必须声明类型是关于显式/隐式键入。
约尔格W¯¯米塔格

1
可能还不错;)所以我也从显式语言转移到隐式类型的语言。如果我错了,请纠正我,Pascal是静态,强类型和显式类型,而PHP是动态,弱类型和隐式类型,不是吗?
Mchl 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.