弱类型语言有哪些好处(和缺点)?

EGP*_*EGP 15 php c python types

我是PHP的忠实粉丝,它显然是一种非常弱类型的语言.我意识到一些好处包括动态改变变量类型的一般独立性等.

我想知道的是缺点.你可以从像C这样的强类型语言中得到什么呢?否则你无法从像PHP这样弱类型的语言中获得这种语言?还有类型设置(如double($ variable)),人们可以争辩说即使是弱类型的语言也可以像强类型语言一样.

所以.弱型.我没有包括哪些好处?更重要的是,有哪些缺点?

Ste*_*sop 11

静态类型的优点是在编译时捕获了整个类错误,无法达到运行时.例如,如果你有一个静态类型的类或接口作为函数参数,那么你很不会意外地传入一个错误类型的对象(没有明确和错误的转换,即).

当然,这并不能阻止你传入正确类型的错误对象,或者是一个接口的实现,你已经为它提供了正确的功能,但它们做错了.此外,如果你有100%的代码覆盖率,比如说PHP/Python /等人,谁在乎你是否在编译时或运行时捕获错误?

就我个人而言,我在使用静态打字的语言中度过了愉快的时光,而在没有语言的情况下玩得很开心.这很少是决定性的问题,因为我从来没有必须在两种语言之间进行选择,这些语言除了打字之外都是相同的,通常还有更重要的事情需要担心.我确实发现,当我使用静态类型语言时,我故意"依赖于编译器",试图以这样的方式编写代码:如果它错了,它将无法编译.例如,您可以通过在一个地方进行更改来执行某些重构,然后修复导致的所有编译错误,重复直到清除编译.通过多次运行完整的测试套件来做同样的事情可能不太实际.但它'

那些对方便性和编码风格偏好有正当顾虑的人是那些致力于正式证明代码正确性的人.我的无知印象是,静态类型演绎可以完成显式静态打字所做的大部分(但不是全部)工作,并且可以节省键盘上相当大的磨损.因此,如果静态类型强迫人们以更容易证明的方式编写代码,那么从POV中可能会有一些东西.我说"if":我不知道,并不是说大多数人无论如何都要证明他们的静态类型代码.

即时更改变量类型等

我认为这是值得怀疑的.做(Python/Django)之类的东西总是很诱人:

user = request.GET['username']
# do something with the string variable, "user"
user = get_object_or_404(User,user)
# do something with the User object variable, "user"
Run Code Online (Sandbox Code Playgroud)

但实际上,是否应该在函数中使用相同的名称来表示不同的东西?也许.可能不是.例如,对于静态类型语言中的其他事物的整数变量,"重用"也不会受到大力鼓励.不必考虑简洁,描述性的变量名称的愿望,可能95%的时间都不应该超越对明确代码的渴望......

顺便说一句,通常类型意味着发生隐式类型转换,而类型意味着它们不会.根据这个定义,就算术类型而言,C是弱类型的,所以我认为这不是你的意思.我认为人们普遍认为,完全强的打字比帮助更令人讨厌,而"完全弱的打字"(任何东西都可以转换成其他任何东西)在大多数语言中都是荒谬的.所以问题是在你的代码变得难以理解之前,可以容忍多少和哪些隐式转换.另请参阅C++中决定是否实现转换运算符和非显式单arg构造函数的持续困难.


小智 9

我使用强类型(如 Java)和弱类型(如 JavaScript)语言已有一段时间了。我发现弱类型语言的便利性对于小型应用程序来说非常有用。不幸的是,随着应用程序规模的增大,它变得无法管理。你的头脑中需要记住的东西太多了,你必须开始越来越依赖你的 IDE 和编译器,否则你的编码就会陷入停滞。这就是强类型语言开始变得更加有用的时候——随着应用程序变得非常大。

在弱类型 JavaScript 中,两个经常让我抓狂的例子是使用没有完整记录和重构的外部库。

外部库:在处理强类型语言时,库本身的代码提供自我文档。当我创建 Person 类型的变量时,IDE 可以检查代码并告知存在 getFirstName()、getLastName() 和 getFullName()。在弱类型语言中,情况并非如此,因为变量可以是任何东西,可以具有任何类型的变量或函数,并且具有也可以是任何东西的函数参数(它们没有显式定义)。因此,开发人员必须严重依赖文档、网络搜索、论坛以及他们对过去用法的记忆。我发现在 JavaScript 中查找外部库可能需要几个小时,而在 Java 中我只需点击“.”即可。键,它会弹出我的所有选项并附加文档。当您遇到未 100% 完整记录的库时,弱类型语言可能会让人非常沮丧。我最近发现自己在问“函数‘draw’中的参数‘plot’是什么?” 当使用 jqplot 时,这是一个相当完善但文档不完整的 JavaScript 库。在最终放弃并寻找替代解决方案之前,我不得不花一两个小时挖掘源代码。

重构:使用强类型语言,我发现自己能够通过仅更改需要更改的文件然后修复编译器错误来快速重构。有些工具甚至只需单击一个按钮即可为您重构。对于弱类型语言,您必须进行搜索,然后小心替换,然后测试、测试、测试,然后再测试更多。您很少完全确定自己已找到并修复了所损坏的所有内容,尤其是在大型应用程序中。

对于简单的需求和小型应用程序,这两个问题是最小的甚至不存在。但是,如果您正在使用具有数百、数千或数百万行代码的应用程序,弱类型语言会让您发疯。

我认为许多开发人员对此感到不安并将其变成一场情绪化的讨论,因为我们有时会认为方法有一种正确,一种错误。但每种方法都有其优点 - 其自身的优点和缺点。一旦你认识到,你就可以把情绪放在一边,并选择最适合你现在需要的东西。