Jon Skeet发布了这篇博文,其中他声称他将会问为什么语言的动态部分如此优秀.所以我以为我先发制人地问他:是什么让他们这么好?
编程语言中两种根本不同的类型方法是静态类型和动态类型.它们实现了截然不同的编程范例,它们各有各的利弊.
我强烈推荐克里斯史密斯的优秀文章在辩论类型系统之前要知道什么,以获得更多有关该主题的背景知识.
从那篇文章:
静态类型系统是一种机制,通过该机制,编译器检查源代码并将标签(称为"类型")分配给语法片段,然后使用它们来推断有关程序行为的信息.动态类型系统是一种机制,通过该机制,编译器生成代码以跟踪程序使用的数据类型(巧合地,也称为"类型").当然,在这两个系统中使用相同的"类型"一词并非完全巧合; 然而,最好将其理解为具有某种微弱的历史意义.试图找到一个世界观,其中"类型"在两个系统中真正意味着相同的东西,会产生很大的混乱.它没有.解决问题的更好方法是认识到:
- 大多数时候,程序员都试图用静态和动态类型来解决同样的问题.
- 然而,静态类型不限于动态类型解决的问题.
- 动态类型也不限于可以使用静态类型解决的问题.
- 从本质上讲,这两种技术根本不是一回事.
最重要的是,您可以避免因让程序员“声明”这个、那个和另一个而产生的大量冗余。通过类型推断可以获得类似的优势(例如boo就是这样做的),但不那么便宜和灵活。正如我过去所写的......:
完整的类型检查或推理需要对整个程序进行分析,这可能非常不切实际,并且阻止了 Van Roy 和 Haridi 在他们的杰作“计算机编程的概念、技术和模型”中所说的“完全开放编程”。引用我 2004 年的一篇文章:“”“我喜欢 Van Roy 和 Haridi 的解释,他们的书第 104-106 页,尽管我可能同意也可能不同意他们的结论(基本上是内在差异很小) ——他们分别指出 Oz 和 Alice 是没有和有静态类型的可互操作语言),他们提出的所有观点都很好。最重要的是,我相信,动态类型允许真正的模块化(静态类型更难,因为类型规则)必须跨模块边界强制执行),以及“集成多种编程范式的计算模型中的探索性计算”。
他们总结道,“当程序必须尽可能灵活时,建议使用动态类型”。我建议阅读敏捷宣言,以了解为什么最大的灵活性在大多数现实世界的应用程序编程中至关重要,以及为什么在现实世界中,而不是在学术界,Van Roy 博士和 Hadidi 博士转向动态类型通常是更可取的,而不是像它们所造成的那样是一个小问题。尽管如此,它们至少表现出了对这些问题更多的认识,用了 3 页精彩的篇幅讨论了它的优点和缺点,比我见过的几乎任何其他书都要多——大多数书都以这种或那种方式清楚地描述和执行优先级,所以讨论很少像这样平衡;)。