什么时候应该劝阻弱类型?弱类型是否会在大型项目中受到阻碍?如果左侧是强类型的,如下所示,这是否是该规则的例外?

   int i = 5
   string sz = i
   sz = sz + "1"
   i  = sz

是否有任何语言支持与上述类似的语法?告诉我更多关于弱类型和相关情况的利弊。

有帮助吗?

解决方案

我认为您将“弱类型”与“动态类型”混淆了。

术语“弱类型”意味着“非强类型”,这意味着内存位置的值允许与其类型指示的值不同。

C 是弱类型语言的一个例子。它允许编写这样的代码:

typedef struct
{
    int x;
    int y;

} FooBar;

FooBar foo;
char * pStr = &foo;
pStr[0] = 'H';
pStr[1] = 'i';
pStr[2] = '\0';

也就是说,它允许将 FooBar 实例视为字符数组。

在强类型语言中,这是不允许的。要么会生成编译器错误,要么会引发运行时异常,但 FooBar 内存地址在任何时候都不会包含不是有效 FooBar 的数据。

C#、Java、Lisp、Java Script 和 Ruby 是不允许此类行为的语言示例。它们是强类型的。

其中一些语言是“静态类型”,这意味着变量类型在编译时分配,而一些语言是“动态类型”,这意味着变量类型直到运行时才知道。“静态与动态”和“弱与强”是正交问题。例如,Lisp 是一种“强动态类型”语言,而“C”是一种“弱静态类型语言”。

此外,正如其他人指出的那样,“推断类型”和程序员指定的类型之间存在区别。C# 中的“var”关键字是类型推断的一个示例。但是,它仍然是静态类型构造,因为编译器在编译时而不是在运行时推断变量的类型。

所以,你的问题真正要问的是:

静态键入,动态键入,弱打字,Stong键入,推断静态类型以及用户指定的静态类型的相对优点和缺点。

我在下面提供了所有这些问题的答案:

静态类型

静态类型有 3 个主要优点:

  1. 更好的工具支持
  2. A 减少某些类型错误的可能性
  3. 表现

由于静态类型提供了额外的信息,静态类型语言的用户体验和诸如智能和重构之类的准确性得到了极大的提高。如果您键入“A。”在代码编辑器中,“ A”具有静态类型,然后编译器知道可能在“”之后合法出现的一切。因此可以向您显示准确的完成列表。可以用动态类型语言支持某些场景,但它们的限制要大得多。

此外,在没有编译器错误的程序中,重构工具可以识别使用特定方法、变量或类型的每个位置。在动态类型语言中不可能做到这一点。

第二个好处有些争议。静态类型语言的支持者喜欢这样说。然而,静态类型语言的反对者认为,他们捕获的错误是微不足道的,并且无论如何他们都会通过测试捕获。但是,您确实会预先收到有关拼写错误的变量或方法名称之类的通知,这可能会有所帮助。

静态类型语言还可以实现更好的“数据流分析”,与 Microsoft 的 SAL(或类似工具)等工具结合使用可以帮助发现潜在的安全问题。

最后,通过静态类型,编译器可以进行更多优化,因此可以生成更快的代码。

缺点:

静态类型的主要缺点是它限制了您可以做的事情。您可以使用动态类型语言编写无法使用静态类型语言编写的程序。Ruby on Rails 就是一个很好的例子。

动态打字

动态类型的一大优点是它比静态类型强大得多。你可以用它做很多很酷的事情。

另一个原因是它需要更少的打字。您不必到处指定类型。

缺点:

动态类型有两个主要缺点:

  1. 您不会从编译器或 IDE 获得那么多“帮助”
  2. 它不适合关键性能场景。例如,没有人用 Ruby 编写操作系统内核。

强类型:

强类型的最大好处是安全性。强制执行强类型通常需要某种类型的运行时支持。如果程序可以证明类型安全,那么许多安全问题(例如缓冲区溢出)就会消失。

弱类型:

强类型的一大缺点和弱类型的一大优点是性能。

当您可以以任何您喜欢的方式访问内存时,您就可以编写更快的代码。例如,数据库只需写出原始字节即可将对象交换到磁盘,而不需要求助于“ISerialized”接口之类的东西。视频游戏可以通过在大缓冲区上运行单个释放来丢弃与一个级别相关的所有数据,而不是为许多小对象运行析构函数。

能够做这些事情需要弱类型。

类型推断

类型推断可以发挥静态类型的许多优点,而无需进行太多类型的输入。

用户指定类型

有些人就是不喜欢类型推断,因为他们喜欢明确。这更多的是一种风格。

其他提示

弱类型是语言简化的尝试。虽然这是一个有价值的目标,弱类型是不良的溶液。

如在COM变体是用来

弱类型是一个早期尝试来解决这个问题,但它是充满了危险,坦率地使更多的麻烦比它的价值。即使是Visual Basic程序员,谁也就忍了各种垃圾,正确地盯住这是一个坏主意,并backronymed微软的ETC(扩展类型转换),以邪恶的强制类型转换。

不要混淆弱类型推断的类型。推断打字是在编译时根据上下文推断强类型。一个很好的例子是var关键字,在C#用来声明合适的一个变量来接收LINQ表达式的值。

相反,弱类型推断每个时间的表达进行评估。这是在问题的示例代码所示。另一个例子是使用无类型的指针中C.非常方便又乞求麻烦。

推断打字解决相同的问题弱类型,引入与弱类型相关联的问题。因此,它是优选的备选方案,每当宿主语言使其可用。

他们应该总是望而却步。的代码,我能想到其中将需要它的唯一类型是低级别的代码,需要一些指针伏都

和回答你的问题,C支持这样的代码(当然除了不具有字符串类型的),那听起来象是PHP或Perl将有(但我可能是完全错误的认为)。

  

当应该弱类型泄气?弱类型气馁   大项目?如果左边是强类型像下面   会是这样的例外规则?

     

int i = 5 string sz = i sz = sz + "1" i = sz

     

是否有任何语言都支持类似的语法上述?告诉我更多   关于正反向相关弱类型和情况。

也许你可以编写自己的库来做到这一点。

在C ++可以使用一种叫做“运算符过载”,这意味着你可以声明一个类型的变量被初始化为另一类型的变量。这是什么使语句:

[std::string str = "Hello World";][1]

具体地,你会定义一个函数(其中,变量的类型是T和B是要设置为类型)

工作,即使引号之间的任何文本将被解释为字符数组。

T& T::operator= ( const B s );

请注意,这是一个类的成员函数 另外请注意,你可能会想有某种功能,如果你想自由的使用它是逆转这种操纵 - 像

B& T::operator= ( const T s);

C ++是强大到足以让你做出一个对象通常弱类型的,但如果要单纯把它弱类型,你将要作出只是一个单一的可变类型的可以用作任何原始的,并且只使用称取指针功能无效。 相信我,这是一个更容易使用强类型的节目可用时。

我个人比较喜欢强类型,因为我并不需要担心的是来的时候,我不知道什么是变量的意思做的错误。例如,如果我想编写一个函数跟一个人 - 和功能使用的人的身高,体重,姓名,孩子的数量等 - 但你给我的色彩,我会得到一个错误,因为你可以“T使用算法,这是非常简单的真正确定大多数这些东西的颜色。

至于弱类型的专业人士,你可能要习惯松散类型的节目,如果你是编程的东西可以在程序中运行(即Web浏览器或一个UNIX shell)。 JavaScript和外壳脚本是弱类型。

我会建议一个类似的编程语言汇编语言是唯一harware级弱类型语言之一,但根据分配的大小我见过汇编语言的味道附加一个类型,每一个变量,即字, DWORD,qword的。

我希望我给你一个很好的解释并没有把任何话传给你。

弱类型是其本质不是强类型不太可靠的,因为你不告诉机器该怎么做 - 而不是本机具有弄清楚你是什么意思。这往往工作相当充分,但在总体上是不明确的结果应该是什么。什么是,例如,一个字符串由浮子乘以?

  

是否有任何语言都支持类似的语法上述?

Perl的允许你把一些数字和字符串可以互换。例如,“5” +“1”给你6.问题,这样的事情,一般是它可能很难避免歧义:应该“5” + 1是“51”或“6”? Perl中得到解决此通过具有用于字符串连接一个单独的操作者,并且保留+为数字加法。

其他语言就必须弄清楚是否意味着做一个级联或增加,以及(如适用)的结果将是什么类型或表示。

我没有ASP / VBScript的编码和与遗留码工作,而无需“选项严格”,其允许弱类型。

这是一个地狱很多时间,尤其是在缺乏经验的程序员手中。我们得到了所有愚蠢的错误,需要年龄诊断。

一的笨例子是这样的:

'Config 
    Dim pass
    pass = "asdasd"


If NOT pass = Request("p") Then
Response.Write "login failed"
REsponse.End()
End If

到目前为止好,但如果用户改变传递到一个整数密码,你猜怎么着,因为INT过关!=串传输(从查询字符串)将不再工作。我认为它应该工作,但事与愿违的我不记得代码的确切一块的。

我讨厌弱类型,而不是笨调试会话我可以花费额外秒键入变量的精确类型。

简单地说,在我的经验,尤其是在大项目,尤其是没有经验的开发商,它只是麻烦了。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top