问:我经常听到有人说动态类型的语言比静态类型的语言生产力更高。提出索赔的原因是什么?”
这有历史原因。如果回溯几十年,动态语言无疑比静态语言生产力要高得多(同时速度也要慢得多)。如果您同时知道Perl和Perl,那么Perl显然比C生产率高得多。但是随着时间的流逝,语言之间已经相互借鉴了很多,更新的语言正在缩小两者之间的差距(在生产率和性能方面)。
这里有几点要考虑:
垃圾收集:垃圾收集极大地提高了生产力。我相信Java是GC的第一种主流静态语言。在此之前,静态基本上意味着手动内存管理。(注意:在这里和以下内容中,我仅考虑主流语言。存在许多实验性和特殊语言,它们将为我提出的任何观点提供反例。)
内存安全性:这是生产力的提高,您不必担心用脚射击。在使用诸如Java之类的“托管”静态语言之前,静态通常意味着直接内存访问。调试也是生产力的一部分,不安全的内存访问会导致真正难以理解的错误。
繁琐的类型系统。在以静态语言引入参数化类型(如模板或泛型)之前,静态类型系统的局限性通常是一个负担。例如,在Java中,每次从集合中选择一个项目时,您都必须显式地向下转换。因此,您获得了强制转换的语法开销,并且没有类型安全性。考虑到编程中集合的普遍性,这是一个主要缺点。
必须声明所有内容的类型是很多冗余类型,但是通过现代类型推断,可以显着减少这种类型。
大标准库。由于大型标准库,Python被著名地宣传为“包含电池”。与具有极简标准库的C相比。但是,随着Java和.net等平台的出现,庞大的标准库正在成为标准,而Scala和F#等较新的语言正在“免费”继承此库。
一流的数据结构。诸如Perl和Python之类的动态语言具有内置的一流数据结构(如列表和映射),以及用于常规操作的便捷语法捷径。与此相比,C除了固定大小的数组外没有内置集合。
闭包和lambda语法 -动态语言通常从一开始就具有这种功能,但是静态语言采用了这种语言,最近才采用Java。
REPL具有以交互方式快速测试代码段的能力是一个很大的福音。但是,尽管使用了IDE工具,例如Visual Studio中的“立即”窗口,但是静态语言可以在某种程度上模拟它。
先进的工具 -除了上述静态语言越来越接近动态语言的便利性之外,现代编辑人员还以动态语言难以匹配的方式利用静态分析。例如,编辑人员可以提供安全的自动重构功能,这在动态语言中是严格不可能实现的。
底线:历史上确实如此,但是今天的答案还不那么明确。
问:那么,对于动态类型的生产力而言,这到底是类型模型本身的优势呢?
很难将动态类型化模型与动态语言区分开来,但是作为示例,C#随着时间的流逝采用了更多的动态特性,即使它的核心是静态语言。这确实是动态类型模型的好处的证明。例子:
反思
反思从根本上说是一种动态打字功能。您可以在运行时评估程序而非编译时检查对象类型。引入它时,人们对此并不满意,但是在C#中,反射的使用变得越来越普遍,例如ASP.Net MVC大量使用反射。
属性
属性是动态类型化的一个示例。您可以在编译时向类添加任意属性,然后在运行时检查(通过反射)并基于该对象操作对象。诸如MEP之类的东西基本上是基于动态类型模型的扩展框架。
Linq to SQL,EF mv。
各种Linq转换器将查询作为运行时对象进行检查,并即时生成sql。它没有比在运行时检查代码更动态。CodeDom是硬币的另一面,可以在运行时生成代码
Roslyn
Roslyn基本实现eval
,曾经被认为是一种真正的动态语言的定义特征。
动态
的dynamic
型是在C#中最明确的动态特征,并使得外部物体和简单和更富有成效的语言交互广告。但是为了方便起见,它也用于Asp.net MVC中。
所有上述特征的好处表明,即使在具有参数化类型,结构类型和类型推断的静态语言中,动态模型也具有明显的优势。