什么是动态类型错误?

时间:2012-02-11 06:26:05

标签: dynamic types static

在编程时,我对功能x与功能y没有强烈的看法。我认为它们都有适当的用途。

而且我总是在阅读尽可能多的编程语言,以便我可以将最好的想法拉出来并进行比较(从Haskell到Lisp再到C到Erlang)。

但有些东西一直困扰着我,基本上当我读到静态和动态类型之间的比较时,动态类型的一个缺点就是“错误”因为编译器没有能够检查变量的类型。

现在,我在编程时遇到了很多错误,但由于类似这样的事情,我永远不会出现错误,而我实际上很难想象这样的例子是什么错误会是。就像忘记你在某处使用整数而不是字符串一样?这似乎是如此做作......

我为了一个爱好而不是为了生活而编程,所以也许这些类型的错误只有在有不同思考方式的人聚在一起时才会出现。我真的只是在寻找一些真实的例子。

3 个答案:

答案 0 :(得分:3)

例如,当您将变量从一种类型更改为另一种类型时:

setType(String type)

然后您决定将类型更改为更高效的枚举:

setType(SomeEnum type)

当您使用强类型语言执行此操作时,无论何处调用setType,您都会收到错误。这允许您快速修复它们并确保您没有错过任何一个。在动态类型语言中,您不会遇到此类错误,并且必须自己查找这些实例。

强类型语言通常也更快,因为它们可以将数据存储在更有效的结构中(因为类型在编译类型中是已知的)。一个例子是C数组与PHP数组。 C数组是紧凑的,但PHP数组有一个相当大的开销来管理它们包含的动态数据。

答案 1 :(得分:2)

@Laurent非常好地回答了你的问题。我想补充一点,例如,有一个名为TypedJS的JavaScript(动态类型语言)的测试/动态错误查找工具。它旨在防止由于动态编程而发生的错误。

可以在此屏幕截图中看到TypedJS尝试阻止的示例错误:

TypedJS

答案 2 :(得分:2)

关于类型及其编程价值,可以说很多。例如,这是CACM最近的一篇文章,讨论了(在其他方面)功能语言OCaml中发现的高级类型系统的轶事优势:

http://cacm.acm.org/magazines/2011/11/138203-ocaml-for-the-masses/

在更原则性的说明中,以下经典论文中的前几页对各种程序错误进行了分类,并解释了类型系统的一些基本优点:

http://www.lucacardelli.name/Papers/TypeSystems.pdf

由于后一篇论文相对较旧,我想补充一点。

首先,输入的语言与要求(显式)类型声明之间存在差异。一些现代语言,尤其是来自功能阵营的现代语言,具有复杂的类型系统,但大多数时候都不需要你写下单一类型。所有类型都由编译器推断。

其次,类型系统本质上是一种逻辑。表示程序某些属性的逻辑,然后由编译器检查。原则上,这种逻辑的强大程度没有限制。有些语言的类型系统足够强大,你可以使用它们。表示排序列表的类型和排序函数的类型,以便函数只进行类型检查,看它是否实际上是排序算法的正确实现。显然,如果编译器能够像这样实际检查程序的正确性,它是非常有用的。然而,在类型系统的表现力和易用性之间存在权衡,因此在实践中,大多数主流语言最终都处于简单化的一面。但是,特殊领域可以从更复杂的类型系统中受益匪浅。