我经常听到这样的说法,即动态类型的语言比静态类型的语言更具生产力。提出索赔的原因是什么?难道不只是使用现代概念作为工具,例如约定优于配置,使用功能编程,高级编程模型以及使用一致的抽象-所有这些都可以在静态类型语言中使用吗?公认的是,杂乱程度较小,因为不需要(例如,在Java中)通常多余的类型声明,但是您也可以在使用类型推断的静态类型语言中省略大多数类型声明,而不会失去静态类型的其他优点。所有这些都可用于现代静态类型的语言,例如Scala。

那么:对于动态类型的生产力而言,这到底是类型模型本身的优势呢?

说明:我对大/中型更感兴趣大型项目,而不是快速黑客。 :-)

评论

您希望“静态二重奏”比“动态二重奏”更快或更高效吗?

二重奏是什么意思?无论如何:我可以想到两个原因,即静态类型比动态类型更有效率:更多的编译器检查错误,代码完成,更多有关程序员意图的信息。这就是为什么我要问相反的问题。

这是开玩笑的观点。 “动态二重奏”是蝙蝠侠和罗宾。如果他们被称为“静态二人组”,他们对哥谭市犯罪黑社会的恐惧就不会那么大。由于开发人员是人,所以不论术语是什么,肤浅的事物都会有所作为。

我的第一个问题是我是否知道自己在做什么。如果这样做,那么我可以提前进行设计,并且静态类型化是有意义的。如果我不这样做,那么我将不得不即时更改很多事情,动态键入会更容易。当我不知道自己在做什么时,Common Lisp是我发现的最好的语言。 (注意:我只抓过Haskell,因此对推断静态类型没有好感。)

我完全同意John Skeetmsmvps.com/blogs/jon_skeet/archive/2009/11/17/…

#1 楼

我实际上认为这是一个非常接近的电话。动态打字和静态打字都有其优势。

动态打字的原因可以提高生产力:




它更加简洁-很多无关紧要如果所有内容都是动态键入的,则可以删除样板代码-类型声明,类型转换逻辑等。在所有其他条件相同的情况下,较短的代码可以稍快地编写,但是更重要的是,它可以更快地读取和维护(因为您不需要遍历多页代码来掌握正在发生的事情)

更容易“黑客”技术,如鸭子打字和猴子打补丁可以很快获得结果(尽管以后可能会使您感到困惑) ...)

更多交互式-动态类型可以说更适合用于类似于REPL的交互式编程,以快速进行原型制作,对正在运行的程序实例进行实时调试,甚至实时编码。

测试用例可能会捕获运行时错误-假设您正在使用TDD或至少具有良好的测试程序当然,这应该可以解决代码中的所有打字问题。

更好的多态性-动态语言可能更有可能鼓励多态函数和抽象的创建,从而提高生产力和代码重用。例如,Clojure在其许多抽象中充分利用了动态多态性。

原型-在我看来,基于原型的数据/对象模型比静态类型的继承体系更强大,更灵活。动态语言更可能允许或鼓励基于原型的方法,Javascript是一个很好的例子。

静态类型输入的原因更具生产力:



更好的设计-被迫预先考虑软件中值的类型可以促使您寻求更清洁,更合乎逻辑的解决方案。 (我可以说-仍然可以设计非常糟糕的代码...)

更好的编译时检查-静态类型可以使更多错误在编译时被捕获。这是一个巨大的优势,并且可以说是整体上静态类型语言的最佳选择。

自动完成-静态类型还可以向IDE提供更多信息,以便自动完成代码或文档查找更加有效。

防止黑客入侵-您必须在代码中保持类型约束,这可能是长期可维护性的一个优势。

类型推断-在某些情况下语言(例如Scala)可以为您带来动态语言的许多简洁好处,而这些语言仍将保持类型纪律。

平均而言,我的结论(经过多年的篱笆两面经验)是动态类型可以在短期内提高生产力,但是除非您拥有非常好的测试套件和测试纪律,否则它最终将变得难以维护。

另一方面,我实际上更喜欢静态类型方法,因为我认为正确性的好处和工具支持为您提供了更好的选择从长远来看会提高生产力。

评论


+1,非常详细的答案。强调“更好的编译时间检查”这一点的价值。

– NoChance
2011年11月29日在8:57

除类型推断外,还具有Haskell样式的重载,C ++模板,泛型,也许还有其他一些语言功能,它们提供了静态类型化框架中Duck类型化的某些优点-只要对象提供所需的接口(它您可以使用“鸭子般的鸭子”),而几乎与该对象的标称类型无关。 “几乎”是因为某些方法需要某种“这类鸭子,例如相关的鸭子”声明,例如Haskell中的“类”声明。

–Steve314
11年11月29日在11:25

我必须非常不同意您的主张,即“较短的代码...更快地读取和维护”。有一个中间步骤,了解代码。我不得不在Delphi和JavaScript中都维护其他人的代码,而Delphi代码则更容易理解,因为它更冗长。尤其是因为Delphi代码具有类型声明,而JavaScript没有。当处理比原语更复杂的内容时,类型声明使您轻而易举地查看变量是什么以及变量可以做什么,这对于维护工作是必不可少的知识。

–梅森·惠勒
2011年11月29日17:24



我不同意这里给出的大多数理由。以Haskell为例,它可能拥有最严格的类型系统。它有一个REPL(实际上至少是两个),它通过对构造函数进行模式匹配而具有非常强大的多态性,并且它简明扼要-比Javascript或Python还要多。因此,我想您提到的某些原因是偶然的,而不是松散类型的语言所固有的。

– Andrea
2012年2月17日在11:09

我不会对“测试案例”过于信任。您无法将它们与好的类型系统进行比较。类型系统提供了一个证明,即至少已经使用类型正确的参数调用了您的函数,而测试用例只能提供经验证据。然而,即使是这种证据也是从人为的环境中收集的。

– Ingo
2012-2-17在11:36

#2 楼

使用动态语言,可以比编写类型的语言更快地编写糟糕的代码。

一旦快速创建了大量动态内容,就可以安全地移至另一个项目,而无需担心长期的工作保养。

这是提高生产率的方法:)

我在开玩笑,但是参与了使用“动态语言”的项目后,我对不必要的数量感到恐惧测试,文档和约定,如果您想拥有一个运行正常的产品,就必须进行处理。
并且在编译时可能会遇到很多运行时错误,这很令人高兴。
我也忘记了关于元编程让您在代码中引入的所有这些黑道和伏都教徒,您大声疾呼!

因此,对于中型/大型项目,在整个生命周期中提高生产率可能是一个神话。

评论


是的,我的经历是一样的。一个100行的perl脚本是可以的,如果没有如此出色的工具,我们将会迷失方向。但是一个10万行的perl项目很可能是一场噩梦。

– Ingo
2012-2-17在11:41

...然后您有了JavaScript(不仅是动态的,而且是弱类型的)。

–丹
14年6月20日在11:22

#3 楼

对于这个问题也有一个理论上的看法:
静态类型系统本质上是一个专门的定理证明者,它仅在可以证明程序的类型正确性时才接受该程序。所有静态类型系统都会拒绝某些有效程序,因为没有可判定的静态类型系统强大到足以证明所有可能的类型正确程序。

有人会说,静态类型检查程序无法证明的那些程序是黑客。和/或样式不好,但是如果您已经有了一个有效的程序而typechecker不接受它,那肯定会在短期内损害您的生产率。

在某些情况下,您可能会注意到类型-checker妨碍使用通用容器以及参数和返回类型的协方差/协方差。

评论


相反,如果错误输入了错误的程序,则编译器会立即告诉您并突出显示错误的行。与注意到失败的测试运行和调试以发现错误相比,这可以提高您的生产率。

– MarkJ
11年11月29日在19:04

如果您做错了,通用容器和显式的协方差/“协方差”意在“挡路”。编译将在运行时失败的代码有什么好处?

– M.Stramm
2012年8月31日在7:49

通常认为作业成功完成0%,直到它成功运行所有测试。只有这样,您的进步才是最重要的。考虑到这一点,我认为在尚未完成的事情上衡量您的生产力是不值得的。

– Pijusn
13 Mar 26 '13在15:25

-1不能解决实际的问题(记住,“生产率提高”吗?)而且,您甚至可能不想编写那些“类型系统拒绝的有效程序”。仅仅因为可以做并不意味着你应该做。以及为什么您甚至会有类型检查器拒绝的“有效程序”?什么,您是在编写Javascript程序并突然尝试使其在Java中编译吗?

– Andres F.
15年11月19日在21:11



类型系统拒绝的那些有效程序可以帮助缩短代码,从而减少类型系统无法找出的错误(更少的代码=更少的错误)。可以使用带有测试值的动态语言(即REPL驱动的开发)完成编译器/ IDE的突出显示这一行,因此您可以看到中间值,并且它们可以拾取类型系统无法实现的错误以及类型错误。您还可以使用静态类型推断来给您输入警告。

–aoeu256
19-10-3在19:43



#4 楼

我发现大多数动态语言的一个优点是,它们使编写更通用的代码更加容易。当您不必为类型系统而战时,在更高的抽象级别上编写要容易得多。

您不必花太多时间思考-编写对Java中的任何对象都不重要的代码很困难,并且可能需要基本上是动态类型的反射。使用JavaScript之类的东西,编写对所有对象都执行有趣操作的函数是第二自然。一个完美的例子是我最近编写的一个函数,该函数接受一个对象并将其所有方法替换为既执行相同操作又触发事件的方法。我不知道如何用Java处理这种事情。但是,我不确定其中有多少是由于类型系统引起的,有多少是由于其他语言差异引起的。

但是,我最近开始使用Haskell。 Haskell让我可以像使用过的任何动态类型化语言一样轻松地编写抽象的通用代码。我上面的Java / JavaScript示例在Haskell中没有任何意义,因为它没有对象,方法,事件或什至没有太多的变异,但是其他种类的通用代码确实很容易编写。

实际上,Haskell可以编写一些动态类型语言不能编写的通用代码;一个完美的例子是read函数,它基本上与toString相反。您可以获得IntDouble或任何您想要的类型(只要它在某个类型类中)。您甚至可以具有多态常数,因此maxBound可以是最大值IntDoubleChar ...等,所有这些都取决于它应该是哪种类型。

我的理论现在是生产率的提高与使用像Java这样的语言相比,使用动态语言所带来的影响总是更少,而Java语言的能力更低,更冗长且灵活性更差。

但是,即使Haskell的类型系统也存在一些烦人的问题,而您在动态类型化语言中不会遇到这些问题。我最烦恼的是数字的处理方式。例如,您必须弄乱类型系统才能将length(列表中的)用作双精度型,如果没有类型系统,就不会有问题。我遇到的另一个烦人的事情是使用Word8(无符号的int类型)和期望使用Int的函数。

因此,最终,没有类型系统可以更容易地编写通用代码而无需考虑并且避免了类型系统的烦人的陷阱。您不必使用动态语言来对抗类型系统,但是您也不能依赖它。

评论


是的,由于某些原因,数字系统很难正确设置。在斯卡拉,这也是一团糟。我认为动态类型系统在易于使用方面胜过简单的静态类型系统,但从更高级的系统(例如Scala,Haskell,ML等,它们都使用system-F的变体)中输了。

–埃德加·克莱克斯(Edgar Klerks)
2014年9月19日在18:30

您的回答很好,但有错误。首先,动态语言“没有类型系统”是不正确的,因此不能成为动态语言“使编写通用代码更容易”的原因。正如您自己对Haskell的反例所显示的那样,它们并没有使它变得更容易(您对自己的断言进行了揭穿!)。 “您不必对抗类型系统”是错误的:每次必须修复由静态类型检查不足引起的错误时,您都要与之抗争。最后,显式强制列表返回的Int是微不足道的。示例:1.0 + fromIntegral(长度为myList),即仅使用fromIntegral。

– Andres F.
2015年11月19日在21:20



最后,“快速编写代码”!=“提高生产力”。您的代码必须正常工作!如果编写的越野车软件以后必须花时间调试和修复,那么您的工作效率就不高。

– Andres F.
15年11月19日在21:22

对于大多数人而言,当他们谈论动态类型的语言“更具生产力”时,“不用考虑太多”的危险信号

– Ataraxia
18年11月7日在23:26

如果类型系统确实提高了生产率,那么Haskell或Idris中所有有用的应用程序在哪里?我认为,理解类型错误有多么容易,“可修补性”(以不可预测的方式编辑应用程序的能力)以及doctest和类型推断的90%错误检查等事情可能更为重要。

–aoeu256
19-10-3在19:54

#5 楼

问:我经常听到有人声称动态类型的语言比静态类型的语言更有生产力。提出此声明的原因是什么?“

这是有历史原因的。如果您回顾几十年,动态语言无疑比静态语言具有更高的生产力(同时速度也明显慢得多)。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 -type是C#中最明确的动态功能,其广告目的是使与外部对象和语言的交互更简单,更高效。但为了方便起见,它也被用在Asp.net MVC中。

上述所有功能的好处表明,即使在带有参数化类型,结构类型和类型推断的静态语言中,动态模型也具有明显的优势。 。

评论


我真的不喜欢这个答案,因为几乎所有要点都没有解决核心问题,即“动态打字应该带来多少生产力?”不是动态语言。

–保姆
2015年11月19日在21:17



@nanny您能详细说明一下动态类型化语言与动态语言之间的差异吗? (其模糊事物之一)。您能否举一个不是动态语言的动态类型化语言的示例,并给出每种语言的明确定义?

–user40980
15年11月19日在21:21

@nanny:这个问题实际上是关于“动态类型化语言”的,而不仅仅是“动态类型化”。

–雅克B
15年11月19日在21:25

@MichaelT对不起,我不清楚。动态类型化是所有动态语言的一方面。这个答案是在谈论其他方面,从历史上看,动态语言往往会附带出现,而实际上并未涉及动态打字部分。

–保姆
15年11月19日在21:31

@nanny:我基本上是在回答这个问题:“我经常听到这样的说法,即动态类型的语言比静态类型的语言更有生产力。产生这种说法的原因是什么?” -我相信提出这一要求的原因是历史性的,不仅与动态类型有关,而且与动态语言的其他提高生产率的功能有关。

–雅克B
2015年11月19日在21:41



#6 楼

所有现代语言功能的整体是如此之大,以至于静态类型和动态类型都不占太大的负担。

规则是,语言功能越好,代码越短。那很简单。 Java展示了静态类型输入错误的严重方式,这给对手带来了很多麻烦。设计不良的语言功能通常要付出代价,而Java中的静态类型首先是必需的功能(否则大多数人甚至不会使用它),其次才执行得不好。
这就是为什么相比之下,大多数动态语言会发光,尽管我会争论说PHP并不能真正使您的生活(至少直到最近才)总体上有所改善,因为还有许多与类型系统无关的怪癖。

另一方面有很多语言具有表达类型系统,这些语言不会妨碍您,甚至不是强制性的。而且其中一些甚至在您需要转义类型系统时都允许嵌入未类型化的代码。

我个人使用haXe,这是一种具有类型推断的语言,标称和结构子类型化,可选的未类型化代码,一流的函数类型,代数数据类型以及(不是很成熟但功能非常强大的)词法宏,同时避免使用奥术语法。在使用haXe大约三年后,我得出一个简单的结论:

当您的语言不会将您锁定在范式的宗教选择上,而只是成为一个好习惯时,编程变得容易得多工具。有许多静态和动态语言以及混合语言可以成功地做到这一点。其中一些简单易学,最难掌握。
它们的强大功能来自于其各个特征的组合方式,可以轻松地为复杂问题创建简单的解决方案。这排除了一定的正交性,只有通过对到目前为止探索的所有语言功能的包含或省略的微妙平衡才能实现。如果您尝试向Ruby添加静态类型,则将使其瘫痪,如果您尝试将其从Haskell中移除,则将其粉碎。与此相反:如果您将它从C中拿走,人们几乎不会注意到,如果您将它从Java中拿走,有些人可能会感谢您。

根据我的个人经验,我可以告诉您:我喜欢露比它拓宽了我的视野和设计系统的方式。恕我直言,它应该首先用来教人们编程。它不显眼,功能强大,简洁,有趣。我知道为什么有人会喜欢东正教语言。
但是,从长远来看,静态类型允许将工作推迟到静态分析器,而通过类型推断,这基本上是免费的。结果是易于维护且通常运行更快的代码。

但同样,仅静态类型不能完成任何操作。这是结合的问题。我认为在F#,Scala,Nemerle,OCaml或haXe之间,您可以找到自己的最佳选择。但这最终取决于您,因为该语言应允许您毫不费力地嵌入自己的思想,而不是强迫您将思想转弯。毕竟,如果编程很有趣,没有什么比生产率更高。

评论


“规则是,语言功能越好,代码越短。”在某种程度上,这可能取决于意见,但我认为此说法不正确。较短的代码本身并没有提供太多优势,除了在写入时减少键入内容,而且可能占用更少的磁盘空间(无论如何,这在编译语言中也不是问题)。我认为,一种好语言的标记正在以尽可能简洁的方式传达尽可能多的信息。动态类型化不是很容易自我记录,因此导致imo失去了可维护性

– Ataraxia
18年11月8日,0:05



您可以为动态类型化的代码补充信息,例如默认值/关键字参数,从类型推断获得的类型,从JIT编译器获取动态类型推断的信息,或仅记录所有函数[遍历正在运行的程序中的每个函数或类,然后将其替换为记录参数/结果的函数版本)。然后,您可以查看该函数先前运行的日志。另一个想法是拒绝既没有类型注释,运行时协定也没有示例REPL会话测试的代码,但使开发人员可以选择这三种代码中的任何一种。

–aoeu256
19-10-3在20:04



#7 楼

就个人而言,动态键入会有所帮助的唯一原因是,如果您是一位非常慢的打字员,或者您构建了庞大的功能/方法/难以导航的内容。您还必须解决整个单元测试问题。动态类型需要(除非您喜欢编写残破的代码)剧烈的单元测试(以确保您的动态类型不会意外爆炸(即,变量主要是鸭子,但有时偶然是dcuk))。静力学将更加努力地防止这种情况的发生(是的,您可以为强大的单元测试提供参数)

#8 楼

我认为首先您需要定义“生产力”。 “生产力”是什么意思和包括什么?

如果“提高生产力”是指编写更少的代码行来实现相同的功能,那么是的,动态键入编程语言比“更具生产力”静态类型的语言。

但是,如果您还考虑花在调试和错误修复上的时间,那么动态类型的语言可能没有那么多产,因为动态类型的语言倾向于推动错误检查。与运行时相比,静态类型语言可以在编译时执行一些错误检查。通常认为,发现错误的时间越晚,修复该错误的成本就越高。因此,与静态类型代码相比,动态类型代码可能导致总体上等于或什至小于生产率。

评论


通常,使用动态语言可以用更少的行编写功能并不是正确的。无论如何,您正在比较哪些语言?

– Andres F.
15年11月19日在21:25

@AndresF。哦,我主要使用Python和C ++。

–姚斌
2015年11月20日在22:17



好的,但是当您实际比较Python和C ++时,您不能概括动态与静态。 C ++并不是具有静态类型的语言的特别具有代表性的示例。有非常简洁的静态类型语言,这些语言或多或少允许您编写与Python一样简短的程序。因此,通常来说,您的主张是错误的。

– Andres F.
15年11月21日在19:59

是的,但是如果您在程序仍在运行时对其进行编辑,该怎么办?任何运行时问题都只会发生,您可以在此处修复它们。在Lisp中,每当遇到错误时,您都可以修复程序,然后继续运行它...是的,对于更复杂的路径,类型注释会很好[也许您可以使用像mypy和lisp这样的渐进式输入],但是那些更复杂的路径也可能会出现非类型错误,因此避免使用任何语言的复杂路径都是一个好主意。

–aoeu256
19-10-3在20:17

#9 楼

动态类型的最大优点是生产率。

Python,Ruby等除了动态类型(默认参数,内置类型的字典等)以外,还具有许多其他生产率上的提高。生产力令人印象深刻。

在速度(或缺乏速度)和资源消耗方面的惩罚并没有您期望的那么糟糕,并且在大多数情况下,开发速度和灵活性可以弥补这些损失。

这里有一个(很旧!)论文。这是对程序员生产力进行的为数不多的适当研究之一,并且许多结论仍然有效。

今天进行的这项研究(可能)与现在不同:-


Java JVM的改进令人难以置信。
现代的IDE可以提高C ++和Java编码器的生产率,但对脚本语言的影响很小。
将包含C#可能与Java处于同一水平,但是稍好一点。

因此,除非性能是一个非常严重的问题,否则动态语言将提高您的生产力。

评论


我不清楚动态键入究竟能提高您的生产率。这篇文章很有趣,但是它是关于一个非常小的程序的,我不确定这如何在大多数程序中延续到成千上万行代码。

–汉斯·彼得·斯托尔
11年11月29日在17:06

该研究仅使用C,C ++和Java作为静态语言的示例,然后尝试将发现的结论总体上应用到传统编程语言中。三种语言都具有相同的基本语法,但具有相同的固有的,降低产品性能的缺陷,从而使比较无效。并不是说静态语言没有生产力,而是C系列没有生产力。如果他们在测试中加入了Pascal方言,他们很可能得出了不同的结论。

–梅森·惠勒
2011年11月29日在18:16

@mason-在该领域中很少有实际的客观研究。这是少数具有实际数字等的真实研究之一。“样本”程序并不简单!它结合了字典处理,复杂算法和大数据量的元素。失败和崩溃尝试的百分比很高,证实了任务的重要性。

–詹姆斯·安德森(James Anderson)
2011年11月30日,下午1:32

-1关于如何使动态类型的语言更具生产力,您并未说太多。默认参数和字典可以在静态类型化语言(例如)中找到。斯卡拉(Scala)。

–乔纳斯(Jonas)
2011年11月30日在16:57

@JamesAnderson更糟糕的是,您链接到的论文甚至都不支持您的观点。它将“脚本语言”(通常为动态)与“常规语言”(通常为静态)进行比较。现在,告诉我,“传统”语言到底是什么?您认为它与具有静态类型的语言集相同吗?更糟糕的是,纸张还不算旧。到2000年,已经存在许多具有静态类型的出色语言,可以说它们比动态语言更具生产力。

– Andres F.
15年11月20日在13:33