为什么仍在积极开发弱类型语言?


17

我想知道为什么仍在积极开发弱类型语言。例如,一个人可以从写作中获得什么好处

$someVar = 1;
(...)  // Some piece of code
$someVar = 'SomeText';

而不是使用截然不同的版本

int someInt = 1;
(...)
string SomeString = 'SomeText';

确实,您需要在第二个示例中声明一个附加变量,但这真的有害吗?并非所有语言都应努力实现强类型化,因为它会在编译时强制执行类型安全性,从而避免类型转换中的某些陷阱?


9
“强类型”不是一个明确定义的术语。通常,它的意思是“您不能破坏类型系统”。它与您在上面描述的正交,可能是隐式对清单类型,还是静态对动态类型。
弗兰克·希勒

10
我错过了什么,将火焰诱饵与几个紧密相关,甚至可以重复的问题(只是在SackOverflow中搜索提及其标签中的静态和动态键入的问题)移到了合法的问题?

1
静态类型的语言和动态类型的语言都有优点和缺点。动态类型的语言非常适合快速开发或原型制作(因此“脚本语言”通常是动态类型的原因),而静态类型的语言(可以说)随着它们成长为大型复杂项目而更易于维护和扩展。
查尔斯·萨尔维亚

6
第一个示例有点像Python,其中变量没有声明的类型。但是,Python是一种非常强类型的语言,因为对象(本身)具有几乎无法更改或强制的类型。我认为滥用术语使这个问题很难回答。
S.Lott

1
@delnan这个问题有两个合理的答案,并没有演变为一场火焰大战,这一事实很有帮助。
亚当李尔

Answers:


25

强/弱类型和静态/动态类型是正交的。

功能上讲,强/弱是关于值的类型是否重要。在弱类型语言中,您可以使用两个恰好用数字填充的字符串,并对它们执行整数加法运算。在强类型语言中,这是一个错误(除非您首先将值强制转换或转换为正确的类型)。强/弱打字不是黑白事情;大多数语言都不是100%严格也不是100%弱小的。

静态/动态类型是关于类型是绑定到值还是绑定到标识符。在动态类型的语言中,您可以将任何值分配给任何变量,而无论类型如何。静态类型为每个标识符定义一个类型,而从其他类型进行赋值要么是错误,要么会导致隐式转换。一些语言采用混合方法,允许使用静态声明的类型以及未类型化的标识符(“变体”)。还有一种类型推断,一种机制,通过使编译器找出类型,可以进行静态类型而无需明确声明所有类型。(Haskell广泛使用此类型,C#通过var关键字公开它)。

弱的动态编程允许一种务实的方法。语言在大多数情况下不会妨碍您,但是当您用脚射击时也不会介入。相比之下,强静态类型促使程序员以允许编译器或解释器检测一类错误的方式,明确表达对代码中值的某些期望。有了一个好的类型系统,程序员可以准确地定义一个值可以做什么和不可以做什么,并且,如果偶然地有人不希望地尝试某个东西,那么类型系统通常可以阻止它并确切地指出问题出在哪里以及为什么出了错。


在像HyperTalk这样的适当的弱类型语言中,它具有用于字符串串联和加法的单独运算符(例如,假设&串联),运算类似"12"+345 & "6"没有歧义(它们分别计算15和“ 456”)。在更强类型的语言中,“ +”运算符可以安全地重载字符串连接和数字加法而不会引起歧义,因为将禁止对字符串和数字进行运算。当语言指定无法确定类型或要执行的操作时,就会出现问题。
supercat 2014年

4

弱打字更像1 == "TRUE"维基百科上的这一部分很好地说明了区别。

请注意,维基百科中的两个示例都不是静态类型的,这是您在第二个示例中所引用的。

因此,如果问题是为什么人们使用动态类型的语言,那么答案是:静态类型系统对您施加了限制。许多人根本没有使用过具有表现力的静态类型系统,这使他们得出以下结论:静态类型的弊大于利。


0

弱类型语言仍在开发中,因为人们使用它们并且喜欢它们。如果您不喜欢弱类型输入,请不要使用弱类型语言。宣告某事是“唯一的方式”,每个人都应该这样做“唯一的方式”忽略了世界的复杂性。


0

并非所有语言都应努力实现强类型化,因为它会在编译时强制执行类型安全性,从而避免类型转换中的某些陷阱?

不必要。学习Objective-C:入门指南直接在Objective-C的背景下解决了这个问题:

弱类型变量经常用于诸如集合类之类的事物,其中集合中对象的确切类型可能是未知的。如果您习惯于使用强类型语言,则可能会认为使用弱类型变量会引起问题,但是它们实际上提供了极大的灵活性,并在Objective-C程序中提供了更大的动态性。

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.