弱类型语言的优点(和缺点)是什么?

2024-03-28 14:50:05 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我想知道的是缺点。像C这样的强类型语言,如果不是PHP这样的弱类型语言,你能从中得到什么呢?同样,对于类型设置(比如double($variable)),人们可能会认为,即使是弱类型语言也可以像强类型语言一样工作。

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


Tags: 语言类型动态variablephpdouble缺点意识
3条回答

弱者和强者都是负载项。(你想成为一个弱语言程序员吗?)动态和静态更好,但我想大多数人宁愿做一个动态程序员而不是静态程序员。我会称PHP为一种混杂的语言(这不是一个加载项;)

菲律宾比索:

garbage_out = garbage_in * 3; // garbage_in was not initialized yet
"hello world" + 2; // does this make sense?

允许未初始化的变量将很难从拼写错误中找到错误。允许对不相关类型进行操作也几乎总是应该报告的错误。大多数解释过的动态语言不允许这些事情是有充分理由的。您可以使用动态类型语言,而不允许使用垃圾。

我同时使用强类型(如Java)和弱类型(如JavaScript)语言已经有一段时间了。我发现,弱类型语言的便利性对于小型应用程序非常好。不幸的是,随着应用程序规模的增长,管理变得不可能。在你的头脑中有太多的东西需要跟踪,你必须开始越来越多地依赖你的IDE和编译器,否则你的编码就会停下来。这是强类型语言开始变得更有用的时候——随着应用程序变得非常大。

在弱类型JavaScript中有两个经常让我抓狂的例子,它们使用的外部库没有完全文档化和重构。

外部库:在处理强类型语言时,库本身的代码提供自文档。当我创建一个Person类型的变量时,IDE可以检查代码并告诉它有一个getFirstName()、getLastName()和getFullName()。在弱类型语言中,情况并非如此,因为变量可以是任何东西,具有任何类型的变量或函数,并且具有也可以是任何东西的函数参数(它们没有显式定义)。因此,开发人员必须大量依赖于文档、web搜索、讨论论坛以及它们对过去用法的记忆。我发现在JavaScript中查找外部库可能需要几个小时,而在Java中,我只需按“.”键,它就会弹出我所有的选项并附带文档。当您遇到没有100%完全文档化的库时,对于弱类型语言来说可能会非常令人沮丧。我最近发现自己在问“函数‘draw’中的参数‘plot’是什么?”当使用jqplot时,它是一个相当好但没有完全文档化的JavaScript库。我不得不花一两个小时研究源代码,然后最终放弃并找到另一种解决方案。

重构:使用强类型语言,我发现只要更改需要更改的文件,然后修复编译器错误,就可以快速重构。有些工具甚至可以通过简单的点击按钮来重构。对于弱类型语言,您必须进行搜索,然后小心地替换,然后测试、测试、测试,然后再测试一些其他语言。你很少能完全确定你已经找到并修复了所有损坏的东西,特别是在大型应用程序中。

对于简单的需求和小型的应用程序,这两个关注点是最小到不存在的。但是,如果您使用的应用程序有100万千行或数百万行代码,弱类型语言会让您抓狂。

我认为许多开发人员对此感到不安,并把它变成一个情绪化的讨论,是因为我们有时会在头脑中明白,有一个对一个错的方法。但每一种方法都有其优点——各有利弊。一旦你意识到你把情感放在一边,为你现在所需要的选择最适合你的。

static类型化的优点是在编译时捕获了所有类的错误,这些错误无法到达运行时。例如,如果您有一个静态类型的类或接口作为函数参数,那么您很可能不会意外地传入一个错误类型的对象(没有显式和不正确的强制转换,也就是说)。

当然,这并不能阻止您传入正确类型的错误对象,或者一个接口的实现,在这个接口中,您给了它正确的函数,但是它们做了错误的事情。此外,如果您有100%的代码覆盖率,比如PHP/Python/etc,谁会关心您是在编译时还是在运行时捕获错误呢?

就我个人而言,我在有静态输入的语言中度过了愉快的时光,在没有静态输入的语言中度过了愉快的时光。这很少是一个决定性的问题,因为我从来没有在两种语言之间做出选择,除了它们的类型,它们是相同的,通常还有更重要的事情要担心。我确实发现,当我使用静态类型语言时,我故意“依赖编译器”,试图以这样一种方式编写代码,如果它是错误的,它将不会编译。例如,有些重构可以通过在一个地方进行更改来执行,然后修复导致的所有编译错误,重复执行直到完成编译。通过多次运行完整的测试套件来执行相同的操作可能不太实际。但IDE用其他语言自动完成相同的重构,或者测试快速完成,这并非闻所未闻,所以这是一个什么是方便的问题,而不是什么是可能的问题。

除了方便性和编码风格偏好之外,那些关注代码正确性的人是那些致力于正式证明代码正确性的人。我无知的印象是,静态类型演绎可以做大部分(但不是全部)的工作,显式静态类型做,并节省相当大的磨损键盘。因此,如果静态类型迫使人们以一种更容易证明的方式编写代码,那么从POV中很可能会有一些东西。我说“如果”:我不知道,而且似乎大多数人都不会证明他们的静态类型代码。

动态更改变量类型等

我认为这有可疑的价值。做一些事情总是很吸引人(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"

但实际上,一个函数中的不同事物应该使用相同的名称吗?也许 吧。可能不会。”例如,在静态类型语言中,不鼓励将整型变量用于其他事情。不需要考虑简洁、描述性的变量名的愿望,可能95%的时间不应该覆盖对明确代码的渴望。。。

顺便说一下,通常类型意味着发生隐式类型转换,而类型意味着不发生隐式类型转换。根据这个定义,就算术类型而言,C是弱类型的,所以我认为这不是你的意思。我认为人们普遍认为完全强类型比帮助更麻烦,而“完全弱类型”(任何东西都可以转换成其他东西)在大多数语言中都是荒谬的。因此,问题是在代码变得难以理解之前,可以容忍多少和哪些隐式转换。在C++中,也看到在决定是否实现转换运算符和非显式一个ARG构造函数的过程中存在的困难。

相关问题 更多 >