14

您多久以在静态类型语言中实际上不可行的方式利用动态类型?

我感兴趣的是,这些在现实世界(而不是演示)代码中使用的频率如何?

4

3 回答 3

8

老实说:动态语言(注意我说的是“动态语言”,而不是“动态类型语言”)提供的大多数好处与动态类型本身没有任何关系(Python 是我最喜欢的语言!)。它们之所以受到如此多的关注,是因为大多数静态类型语言在灵活性方面都很糟糕。当谈到这个话题时,人们经常提到 Haskell——这是有原因的。在实践中,我发现静态但富有表现力(例如,固有的泛型)和动态类型系统之间几乎没有什么区别。

通常与动态类型相关的主要好处是广泛的多态性/鸭子类型/通用编程。例如,如果有人过来并传递不同类型的东西,我的大多数 Python 代码也能正常工作,只要它具有我的代码使用的字段/方法(前提是它们也大致等效)。基本上,它为我们节省了创建接口的麻烦,该接口尽可能简约并在我们可能想要传递给该特定函数的每个类中显式实现。好处应该是不言而喻的。

如上所述,这与静态/动态类型无关(有这种结构类型的东西,恕我直言归结为在编译时进行更广泛的编译检查的鸭子类型)。然而,在实践中,这两者是齐头并进的,因为没有静态类型的主流语言具有结构类型(ML/Ocaml/Haskell/...不是主流,Go 还有很长的路要走)。 C++ 模板的可能例外(与例如 Haskell 相比,这是无限的痛苦)。

于 2010-07-19T12:01:55.487 回答
2

理论上,您基本上可以在大多数静态类型语言中“模拟”动态类型,方法是在某种标记联合中编码值,并使所有操作根据输入“类型”(实际上是输入值)正确运行。当然,你必须引入一堆运行时错误行为,当你遇到对这些值的无意义操作时会发生这些错误行为。

大多数非常非常难做的事情要么是有风险的,要么是不正确的。由于反射的更自然编码,无需实例化高阶类型,动态类型语言中的许多大规模元编程要容易得多。

但是,要回答您的问题,我认为动态类型没有任何方式提供在合理的静态类型语言中不可行的功能。

于 2010-07-19T11:36:37.443 回答
1

恕我直言,当涉及到值时,动态类型在最好的情况下是“Meh”,在最坏的情况下会导致更多错误。换句话说,就价值观而言,我没有发现任何好处。

真正的价值来自动态类型语言提供的元编程潜力。没有像 Grails 这样的框架是不可能的。grails 所做的一个例子是:如果你有一个域类,向它添加一个变量,然后框架会自动为你在域类上放置方法“findByYourVar”,在运行时可用。因此,所有用 Java(或其他)编写繁琐的常见持久性方法都由框架提供给您。

于 2010-07-19T12:37:05.290 回答