weak-typing - 什么时候不应该鼓励弱类型?

标签 weak-typing

什么时候不应该鼓励弱类型?大型项目中不鼓励使用弱类型吗?如果左侧像下面这样强烈键入,那将是该规则的例外吗?

   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”关键字是类型推断的示例。但是,它仍然是静态类型的构造,因为编译器会在编译时而不是在运行时推断变量的类型。

因此,您的问题真正要问的是:

相对优点是什么?
静态打字,动态打字的缺点
打字,弱打字,强打字,
推断的静态类型和用户
指定的静态类型。

我提供以下所有答案:

静态键入

静态键入具有3个主要优点:
  • 更好的工具支持
  • A减少了某些类型的错误的可能性
  • 性能

  • 由于静态类型提供了额外的信息,因此在静态类型的语言中,诸如智能化之类的东西的用户体验和准确性大大提高了。如果键入“a”。在代码编辑器中,并且“a”具有静态类型,则编译器知道合法地出现在“”之后的所有内容。从而可以向您显示准确的完成列表。可以使用动态类型的语言来支持某些方案,但是它们的局限性更大。

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

    第二个好处有些争议。支持静态类型语言的人喜欢提出这一主张。但是,反对使用静态类型语言的人则认为,它们捕获的错误是微不足道的,并且无论如何都要通过测试来捕获它们。但是,您确实会事先收到有关拼写错误的变量或方法名称之类的通知,这可能会有所帮助。

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

    最后,使用静态类型,编译器可以做更多的优化,因此可以产生更快的代码。

    缺点:

    静态键入的主要缺点是它限制了您可以执行的操作。您可以使用动态类型的语言编写程序,而不能使用静态类型的语言编写程序。 Ruby on Rails是一个很好的例子。

    动态键入

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

    另一个是它需要更少的键入。您不必在整个地方指定类型。

    缺点:

    动态打字有2个主要缺点:
  • 您不会从编译器或IDE中获得太多“手持”信息
  • 它不适用于关键性能方案。例如,没有人用Ruby编写OS Kernels。

  • 强输入:

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

    弱输入:

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

    当您可以按任意方式访问内存时,可以编写更快的代码。例如,数据库可以仅通过写出对象的原始字节即可将对象换出到磁盘,而无需诉诸于“ISerializable”接口之类的事情。通过仅在大型缓冲区上运行一次免费游戏,而不是为许多小对象运行析构函数,视频游戏可以丢弃与某个级别关联的所有数据。

    能够做这些事情需要弱打字。

    类型推断

    类型推断可提供静态类型的许多好处,而无需进行过多的类型化。

    用户指定的类型

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

    关于weak-typing - 什么时候不应该鼓励弱类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/597664/

    相关文章:

    perl - Try::Tiny:try-catch 的奇怪行为与否?

    language-agnostic - 不需要声明变量类型的语言的质量是否是弱类型或动态类型的示例

    php - PHP 中的严格类型有什么作用?

    refactoring - 静态/强类型和重构

    dynamic - 强打字与静态打字与弱打字与动态打字之间的区别

    javascript - 什么时候 JavaScript == 比 === 更有意义?

    python - Python 是强类型的吗?