与静态类型语言相比,动态类型语言的优点和局限性是什么?
解释器推断类型和类型转换的能力使开发时间更快,但它也可能引发运行时故障,而在静态类型语言中您无法在编译时捕获它们。但是最近(并且很长一段时间以来)社区中正在热烈讨论哪个更好(或者即使这总是正确的)。
对这个问题的一个很好的看法来自微软的 Erik Meijer 和 Peter Drayton 的《Static Typing Where possible, Dynamic Typing When Needed: The End of the Cold War Between Programming Languages》 :
静态类型的拥护者认为静态类型的优点包括更早地检测编程错误(例如防止将整数添加到布尔值),更好的类型签名形式的文档(例如,在解析名称时合并参数的数量和类型),更多编译器优化的机会(例如,当接收器的确切类型静态已知时,用直接调用替换虚拟调用),提高运行时效率(例如,并非所有值都需要携带动态类型),以及更好的设计时开发人员体验(例如知道接收器的类型,IDE 可以显示所有适用成员的下拉菜单)。静态类型狂热者试图让我们相信“ell-typed 程序不会出错”。虽然这听起来确实令人印象深刻,这是一个相当空洞的陈述。静态类型检查是程序运行时行为的编译时抽象,因此它必然只是部分合理且不完整。这意味着程序仍然可能由于类型检查器未跟踪的属性而出错,并且有些程序虽然不会出错,但无法进行类型检查。使静态类型不那么部分和更完整的冲动导致类型系统变得过于复杂和异国情调,正如“幻像类型”[11]和“模糊类型”[10]等概念所证明的那样。这就像试图跑一场马拉松,腿上绑着一个球和链子,然后得意洋洋地大喊你几乎成功了,即使你在第一英里后跳了出来。静态类型检查是程序运行时行为的编译时抽象,因此它必然只是部分合理且不完整。这意味着程序仍然可能由于类型检查器未跟踪的属性而出错,并且有些程序虽然不会出错,但无法进行类型检查。使静态类型不那么部分和更完整的冲动导致类型系统变得过于复杂和异国情调,正如“幻像类型”[11]和“模糊类型”[10]等概念所证明的那样。这就像试图跑一场马拉松,腿上绑着一个球和链子,然后得意洋洋地大喊你几乎成功了,即使你在第一英里后跳了出来。静态类型检查是程序运行时行为的编译时抽象,因此它必然只是部分合理且不完整。这意味着程序仍然可能由于类型检查器未跟踪的属性而出错,并且有些程序虽然不会出错,但无法进行类型检查。使静态类型不那么部分和更完整的冲动导致类型系统变得过于复杂和异国情调,正如“幻像类型”[11]和“模糊类型”[10]等概念所证明的那样。这就像试图跑一场马拉松,腿上绑着一个球和链子,然后得意洋洋地大喊你几乎成功了,即使你在第一英里后跳了出来。因此它必然只是部分健全和不完整的。这意味着程序仍然可能由于类型检查器未跟踪的属性而出错,并且有些程序虽然不会出错,但无法进行类型检查。使静态类型不那么部分和更完整的冲动导致类型系统变得过于复杂和异国情调,正如“幻像类型”[11]和“模糊类型”[10]等概念所证明的那样。这就像试图跑一场马拉松,腿上绑着一个球和链子,然后得意洋洋地大喊你几乎成功了,即使你在第一英里后跳了出来。因此它必然只是部分健全和不完整的。这意味着程序仍然可能由于类型检查器未跟踪的属性而出错,并且有些程序虽然不会出错,但无法进行类型检查。使静态类型不那么部分和更完整的冲动导致类型系统变得过于复杂和异国情调,正如“幻像类型”[11]和“模糊类型”[10]等概念所证明的那样。这就像试图跑一场马拉松,腿上绑着一个球和链子,然后得意洋洋地大喊你几乎成功了,即使你在第一英里后跳了出来。并且有些程序虽然不会出错,但无法进行类型检查。使静态类型不那么部分和更完整的冲动导致类型系统变得过于复杂和异国情调,正如“幻像类型”[11]和“模糊类型”[10]等概念所证明的那样。这就像试图跑一场马拉松,腿上绑着一个球和链子,然后得意洋洋地大喊你几乎成功了,即使你在第一英里后跳了出来。并且有些程序虽然不会出错,但无法进行类型检查。使静态类型不那么部分和更完整的冲动导致类型系统变得过于复杂和异国情调,正如“幻像类型”[11]和“模糊类型”[10]等概念所证明的那样。这就像试图跑一场马拉松,腿上绑着一个球和链子,然后得意洋洋地大喊你几乎成功了,即使你在第一英里后跳了出来。 动态类型语言的拥护者认为静态类型过于死板,动态语言的柔软性使其非常适合用于具有变化或未知需求的原型系统,或者与其他不可预测的变化系统交互(数据和应用程序集成)。当然,动态类型语言对于处理真正动态的程序行为是必不可少的,例如方法拦截、动态加载、移动代码、运行时反射等。在所有关于脚本的论文之母 [16] 中,John Ousterhout 认为静态类型系统与动态类型的脚本语言相比,编程语言使代码的可重用性更低、更冗长、更不安全、更缺乏表现力。这个论点被许多动态类型脚本语言的支持者照搬。我们认为这是一个谬误,并且与声称声明式编程的本质是消除分配属于同一类别。或者正如 John Hughes 所说的 [8],通过省略特性来使语言更强大在逻辑上是不可能的。捍卫将所有类型检查延迟到运行时是一件好事的事实,是在玩鸵鸟策略,即应在开发过程中尽早发现错误。通过省略特性来使语言更强大在逻辑上是不可能的。捍卫将所有类型检查延迟到运行时是一件好事的事实,是在玩鸵鸟策略,即应在开发过程中尽早发现错误。通过省略特性来使语言更强大在逻辑上是不可能的。捍卫将所有类型检查延迟到运行时是一件好事的事实,是在玩鸵鸟策略,即应在开发过程中尽早发现错误。
静态类型的拥护者认为静态类型的优点包括更早地检测编程错误(例如防止将整数添加到布尔值),更好的类型签名形式的文档(例如,在解析名称时合并参数的数量和类型),更多编译器优化的机会(例如,当接收器的确切类型静态已知时,用直接调用替换虚拟调用),提高运行时效率(例如,并非所有值都需要携带动态类型),以及更好的设计时开发人员体验(例如知道接收器的类型,IDE 可以显示所有适用成员的下拉菜单)。静态类型狂热者试图让我们相信“ell-typed 程序不会出错”。虽然这听起来确实令人印象深刻,这是一个相当空洞的陈述。静态类型检查是程序运行时行为的编译时抽象,因此它必然只是部分合理且不完整。这意味着程序仍然可能由于类型检查器未跟踪的属性而出错,并且有些程序虽然不会出错,但无法进行类型检查。使静态类型不那么部分和更完整的冲动导致类型系统变得过于复杂和异国情调,正如“幻像类型”[11]和“模糊类型”[10]等概念所证明的那样。这就像试图跑一场马拉松,腿上绑着一个球和链子,然后得意洋洋地大喊你几乎成功了,即使你在第一英里后跳了出来。静态类型检查是程序运行时行为的编译时抽象,因此它必然只是部分合理且不完整。这意味着程序仍然可能由于类型检查器未跟踪的属性而出错,并且有些程序虽然不会出错,但无法进行类型检查。使静态类型不那么部分和更完整的冲动导致类型系统变得过于复杂和异国情调,正如“幻像类型”[11]和“模糊类型”[10]等概念所证明的那样。这就像试图跑一场马拉松,腿上绑着一个球和链子,然后得意洋洋地大喊你几乎成功了,即使你在第一英里后跳了出来。静态类型检查是程序运行时行为的编译时抽象,因此它必然只是部分合理且不完整。这意味着程序仍然可能由于类型检查器未跟踪的属性而出错,并且有些程序虽然不会出错,但无法进行类型检查。使静态类型不那么部分和更完整的冲动导致类型系统变得过于复杂和异国情调,正如“幻像类型”[11]和“模糊类型”[10]等概念所证明的那样。这就像试图跑一场马拉松,腿上绑着一个球和链子,然后得意洋洋地大喊你几乎成功了,即使你在第一英里后跳了出来。因此它必然只是部分健全和不完整的。这意味着程序仍然可能由于类型检查器未跟踪的属性而出错,并且有些程序虽然不会出错,但无法进行类型检查。使静态类型不那么部分和更完整的冲动导致类型系统变得过于复杂和异国情调,正如“幻像类型”[11]和“模糊类型”[10]等概念所证明的那样。这就像试图跑一场马拉松,腿上绑着一个球和链子,然后得意洋洋地大喊你几乎成功了,即使你在第一英里后跳了出来。因此它必然只是部分健全和不完整的。这意味着程序仍然可能由于类型检查器未跟踪的属性而出错,并且有些程序虽然不会出错,但无法进行类型检查。使静态类型不那么部分和更完整的冲动导致类型系统变得过于复杂和异国情调,正如“幻像类型”[11]和“模糊类型”[10]等概念所证明的那样。这就像试图跑一场马拉松,腿上绑着一个球和链子,然后得意洋洋地大喊你几乎成功了,即使你在第一英里后跳了出来。并且有些程序虽然不会出错,但无法进行类型检查。使静态类型不那么部分和更完整的冲动导致类型系统变得过于复杂和异国情调,正如“幻像类型”[11]和“模糊类型”[10]等概念所证明的那样。这就像试图跑一场马拉松,腿上绑着一个球和链子,然后得意洋洋地大喊你几乎成功了,即使你在第一英里后跳了出来。并且有些程序虽然不会出错,但无法进行类型检查。使静态类型不那么部分和更完整的冲动导致类型系统变得过于复杂和异国情调,正如“幻像类型”[11]和“模糊类型”[10]等概念所证明的那样。这就像试图跑一场马拉松,腿上绑着一个球和链子,然后得意洋洋地大喊你几乎成功了,即使你在第一英里后跳了出来。
动态类型语言的拥护者认为静态类型过于死板,动态语言的柔软性使其非常适合用于具有变化或未知需求的原型系统,或者与其他不可预测的变化系统交互(数据和应用程序集成)。当然,动态类型语言对于处理真正动态的程序行为是必不可少的,例如方法拦截、动态加载、移动代码、运行时反射等。在所有关于脚本的论文之母 [16] 中,John Ousterhout 认为静态类型系统与动态类型的脚本语言相比,编程语言使代码的可重用性更低、更冗长、更不安全、更缺乏表现力。这个论点被许多动态类型脚本语言的支持者照搬。我们认为这是一个谬误,并且与声称声明式编程的本质是消除分配属于同一类别。或者正如 John Hughes 所说的 [8],通过省略特性来使语言更强大在逻辑上是不可能的。捍卫将所有类型检查延迟到运行时是一件好事的事实,是在玩鸵鸟策略,即应在开发过程中尽早发现错误。通过省略特性来使语言更强大在逻辑上是不可能的。捍卫将所有类型检查延迟到运行时是一件好事的事实,是在玩鸵鸟策略,即应在开发过程中尽早发现错误。通过省略特性来使语言更强大在逻辑上是不可能的。捍卫将所有类型检查延迟到运行时是一件好事的事实,是在玩鸵鸟策略,即应在开发过程中尽早发现错误。