动态类型语言是否值得所有批评?[关闭]


35

我已经在Internet上阅读了几篇有关企业中编程语言选择的文章。最近,许多动态类型的语言已经流行,例如Ruby,Python,PHP和Erlang。但是许多企业仍然使用静态类型的语言,例如C,C ++,C#和Java。

是的,静态类型语言的好处之一是可以在编译时而不是运行时更早地发现编程错误。但是动态类型语言也有优势。(更多关于维基百科

企业之所以开始不使用Erlang,Ruby和Python之类的语言的主要原因,似乎是因为它们是动态类型的。这似乎也是StackOverflow上的人决定反对Erlang的主要原因。请参阅您为什么决定“反对” Erlang

但是,对于企业中的动态类型,似乎存在强烈的批评,但是我真的不明白为什么它如此强大。

真的,为什么在企业中对动态类型的批评如此之多?它对项目成本的影响真的很大吗?但是也许我错了。


3
我认为带有类型推断的静态类型化和可能的鸭子类型化是最好的处理方式。这也非常复杂
Casebash

2
我只是看了C#的鸭子类型(我不使用该语言),虽然看起来完全满足了鸭子类型的定义,但所需的冗长似乎无法达到目的。这并不是说它偶尔不会有用。
Chinmay Kanchi 2010年

3
仅仅是我还是对静态类型语言的批评比对动态类型语言的批评更多?同样,根据我的经验,大型“企业”的语言/技术选择似乎由当前的趋势/安全选择所决定,而不是由任何实际的技术优点所决定。
MAK 2010年

2
@ChinmayKanchi:详细?您只需要声明为as dynamic并开始使用它即可。它没有普通方法调用或运算符重载那么冗长。
乔伊,

4
我无法计算在Grails上Groovy上我目前在公司的调试错误上浪费的时间,如果我们使用Java,编译器会立即检测到。
WKS 2014年

Answers:


46

是的,我相信他们会的。

在为新项目选择语言时,需要考虑以下几个原因:

  • 运行时速度。与C / C ++ / Fortran相比,Perl和Python太慢了,很有趣。
  • 初始化速度。相比于上述快的语言,Java的倒下和呼声作为JVM保持载荷和载荷和... while(1)....
  • 原型能力。详尽地完成C ++或Java所需的声明/定义工作会增加LOC,LOC是唯一已知的与bug计数可靠相关的度量。这也需要很多时间。还需要更多地考虑类型和连接。
  • 内部可辨认性。在开始调试自修改代码之前,动态地弄乱内部结构是件好事。(Python,Lisp,Perl)
  • 正确性验证。编译器可以在C ++中为您的代码提供一次快速的半正确性传递,这非常好。
  • 静态分析详细信息。C和Java具有很好的静态分析。从理论上讲, Perl不能完全静态地分析(可能也是Python)。我有理由确定Lisp也不是。
  • 通常,怪异的平台仅使用C。
  • 支持链。如果你可以有一个合同,你得到看着和工作在你的错误,这是巨大的

如果您可以假设与您合作的组织具有“向前发展”的原则(有一个会计术语),并且不会只是随机决定不使用该软件,那么您有一个更好的理由使用该软件。由于没有主要业务出售(承担维护它的责任)Python / Perl / $ dynamic_language,因此可以大大降低风险。

以我的经验,开源维护者经常会遇到一个问题,即完全负责错误修正并发布更新。“它是免费的,您可以自己开发!” 这不是大多数企业可以接受的答案(除了其他方面,还不是其核心能力)。

当然,我不是在谈论webapp /启动世界,它倾向于遵循高风险/高奖励规则,并且非常乐于保持技术的蓬勃发展。


16
“它是免费的,您可以自己开发!” <-通常是F / OSS的最大问题,我想+1但我得票了:(
Billy ONeal 2010年

4
不错的总结。我将坚持认为,构造良好的类型可以传达语义(我可以查看一个类型并理解它的用途以及如何使用它),并且可以用于强制正确性(我可以构建仅接受约束输入的类型),而且我不会因拼写错误而产生愚蠢的错误(我讨厌自动变量声明)
smithco 2011年

4
您可以为任何大型开源项目获得商业支持。大公司将动态类型的PL用于大型零件(确定合适的零件),Facebook使用PHP(UI)和Erlang(聊天),Twitter使用Ruby(UI),Google使用Python(我不知道是什么),Lisp和Python是被用于许多复杂的研究项目中。注意:我是C#开发人员,我(几乎)从未使用过动态类型的语言。但是这些观点在相当大的程度上无效。
Kaveh Shahbazian 2012年

4
我喜欢您的回答,但Java不是动态键入的……
Mehrdad

2
@PaulNathan:你想得太辛苦了。问题是关于动态类型语言的问题,这个答案提到了Java,就好像它是动态类型一样。
Mehrdad

24

您给企业决策者带来了太多的技术信誉。有句老话:“没有人因为购买IBM而被解雇。” 如果您走了一条不同的路而事情变得一团糟(他们总是如此),那么没人愿意冒险受到指责。遵守标准并责备其他人。

许多年轻的公司最终将成为明天的企业,并将使用这些语言。

而且,不要忘了用VBA编写的大量代码行!


1
为“ ...……未来的企业[并将]使用这些语言” +1。
rdmueller 2011年

6
“有许多年轻的公司最终将成为明天的企业,并且将使用这些语言。”:您似乎暗示动态语言是相当新的,需要更多的公司采用。另一方面,动态语言已经存在很长时间了。
乔治

17

企业使用C,C ++,C#和Java的原因不是因为它们是静态类型的(至少不是直接类型)。我向您保证,企业决策者不会在客观比较类型系统的基础上做出这些选择。

企业确实关心:

  • 长期维护成本:您能否合理地期望事情在10年的时间内可以继续正常工作?如果语言进化是保守的并且向后兼容(与Java一样),那实际上是一件好事。静态类型在这里很有用,因为它会在编译时捕获主要类型的错误,然后才将其引入您的生产系统。
  • 人才可用性 -您是否能够找到开发人员来维护您的闪亮新系统?如果原始开发人员离开,其他人会理解代码吗?这给引入任何“新”语言(特别是如果它还对部署,构建系统,操作支持等产生了新要求)都设置了很大的障碍。这为广泛使用的语言(C,C ++,C#和Java)提供了巨大的优势。
  • 集成成本:与现有的或可能获得的其他技术连接/集成是否容易?如果您已经拥有一堆旧式J2EE系统,则需要与它们集成。为此,一个新的Java EE解决方案可能比Python更实用。
  • 可预测性/低风险:平台/语言是否经过验证,我可以确定它会起作用吗?这通常比简单的生产率重要。经理说服老板给他大量预算来建立新系统要容易得多,而不是让他以后再说这没用.....
  • 企业支持/支持 -主要的国际组织是否致力于支持语言和平台?他们会签署合同支持我,以便在出现问题时找人打电话吗?
  • 供应商中立性/平台独立性 -我是否会陷入单一供应商的困境?还是我有很多未来的供应商选择/过渡途径?您不想陷于体系结构的死胡同,在竞争对手吃午餐时无法取得进展。如果您作为企业架构师的工作做得很好,则需要至少提前5到10年考虑这些内容。

我个人认为,如果您想在企业中使用动态语言,那么到目前为止,您最好的机会是使用在现有企业生态系统中附带的东西。最值得注意的是新的动态JVM语言:例如JRuby,Groovy,Clojure。就IT管理而言,它们是“安全的”动态语言选择,因为它们在Java企业生态系统的其余部分中运行并很好地与它们一起使用。


1
我不敢相信没有人支持您的回答。
Sebastian N.

11

企业之所以开始不使用Erlang,Ruby和Python之类的语言的主要原因,似乎是因为它们是动态类型的。

我认为这只是他们的主要借口。真正的原因是,企业并没有真正认真对待它们,并觉得它们可能有点过于业余。Java和.NET是“大企业”,具有良好的商业营销,商业客户支持,因此确实受到了广泛的重视。

不幸的是,几乎没有静态类型的语言能够像大型企业一样流行。为什么开源/自由软件编程环境几乎总是动态输入的?这可能表明静态类型的语言实际上并不那么容易制作,而动态类型则是“懒惰的黑客”。在这种情况下,决定反对使用动态类型语言的企业实际上可能有道理。


8
真?上次我看到,Google在Python背后投入了大量的精力和大量的开发工作,其中包括雇用Python的创建者,并允许他将50%的时间用于编写该语言。Google还为Python贡献了大量代码,尤其是现在,无燕子已被合并到Python 3源代码树中。这使Python成为我的“大公司”。
Chinmay Kanchi 2010年

13
@Chinmay Kanchi:有趣的是您如何从样本量为1的统计数据得出结论。–
Timwi

6
触摸。但是,您的某些结论也是有缺陷的。正确实施动态语言是远远比实现静态类型语言更加困难。就像您所说的那样,动态类型肯定不是 “懒惰的黑客”。它允许开发人员懒惰,但不允许编写编译器/解释器的人。实际上,优化动态类型的语言是如此困难,以至于我只能想到一种最近被广泛接受这种处理的语言(JavaScript),尽管有其他语言的优化/ JITting项目(Python,PHP)。
Chinmay Kanchi 2010年

2
另外,如果您认为动态类型语言是开放源代码环境中最常用的语言,那么这还不是很明确。根据您选择的指标,这可能是正确的,但事实并非如此。衡量代码行,C胜出一筹。如果衡量开放源代码项目中使用的语言(包括多语言),则最受欢迎的语言依次是JavaScript,C,C ++和PHP。如果仅测量主要语言,则最受欢迎的语言是Perl,Java,C#和JavaScript。bit.ly/C6xTB
Chinmay Kanchi 2010年

7
当然,为动态类型的语言编写优化器很困难,但不是解释器:您可以省去所有类型检查,其余的都一样。没有业余语言制造者考虑编写优化器。—关于最后一点,我并不是要暗示大多数开源软件都是用动态类型的编程语言编写的,而是大多数开源编程语言(我说“环境”,因为我在说编译器/解释器,IDE等)是动态类型的。
Timwi's

9
  • 动态类型的语言往往比其静态类型的表亲慢。
  • 错误更难捕捉,调试也更难
  • 编译器/解释器对可以做什么和不可以做什么的要求往往不那么严格。即,您几乎只在编译阶段捕获语法错误
  • 如果您对动态类型语言的设计不是很谨慎,那么您最终会使用Javascript,这是代码嗅觉语言。

编辑:我应该提一下,目前我的主要编程语言是动态类型化的Python。就个人而言,我喜欢不必预先声明变量所带来的自由,但是有时,最好指定(例如)函数采用哪种参数尽早而不是迟早地捕获错误。


1
尽管编译器并不严格,但解释器通常是正确的。在大多数情况下,口译员会发现问题情况并发出错误信号。
Winston Ewert 2010年

17
我喜欢动态类型,但我讨厌不必预先声明变量!这么多次我最终都无意中引入了一个新变量,因为我拼错了一个变量名。
Frank Shearar 2010年

1
@弗兰克:我无可厚非地喜欢 Perl具有强制变量声明的设置。我认为,这是Perl的优势之一。
保罗·内森

8

(某些程序员/老板)认为动态类型化的语言会产生无法正常工作的代码。动态类型程序可以编译的事实并不能告诉您它的正确性。静态类型语言可以编译的事实告诉您更多信息。(另一方面,在编译和执行正确的事情之间还有很长的路要走,因此看起来可能没有意义。)

动态类型的语言被认为是脚本语言。您永远不会在bash或批处理文件中编写应用程序。所有动态类型的语言都倾向于循环到该类别(不公平)。

动态类型的语言要比静态类型的语言慢。(但是,我们将看到在JIT上的出色表现改变了这一点)


2
一些程序员“意识到” 。当我和程序员争论动态类型时,他们通常最终会承认他们从未真正使用过这种语言。
Frank Shearar 2010年

1
@Frank您是在说那些为动态打字的自卑而辩护的人通常没有使用它吗?
Winston Ewert 2010年

2
@弗兰克:我曾经使用过这种语言,大多数时候结果都是难以维护的混乱。(公平地说,这是PHP,并且PHP除了动态类型
化外

@比利:我认为这很普遍。多年以来,由于我在VB方面的经验,我一直不喜欢动态打字-当我最终意识到动态打字这种可怕的精神分裂症实施并不常见时,我的看法发生了巨大变化。
Shog9

@温斯顿:我是说我所争论的人没有。在我看来,这是一个案例,“动态打字不可能行得通”……但是他们会很高兴地使用动态语言,动态语言和动态语言(IDE,重构,头等大事)首先开发的许多技术。另外,这样的问题:stackoverflow.com/questions/2317579指出,虽然可能不是通用的,但我与之争辩的案例-不能工作,但我没有尝试过的程序员并不是孤立的。(我,我认为两种方法都有价值。)
Frank Shearar 2010年

8

注意:这主要是主观的,并且基于我的经验和印象。

动态类型语言与静态类型语言有很大的不同。这些差异在重量级企业软件中可能比在大多数其他应用程序中更为重要。

静态类型的语言往往是非常规范的。方法将仅接受与其签名完全匹配的输入。访问级别往往非常重要,并且接口已明确定义,并具有冗长但明确的限制来强制执行这些定义。

另一方面,动态类型的语言非常实用。类型转换通常是隐式发生的,如果您提供了错误的输入类型,只要它们表现得足够相似,函数甚至可能会起作用。在像Python这样的语言中,甚至访问级别也将基于合同而不是技术限制(即,这是private因为系统提示您不要使用它,并且它的名字很有趣)。

许多程序员喜欢动态语言,因为它们(可以说)允许快速原型设计。代码通常以较短的结尾(如果仅仅是因为缺少类型声明),并且由于需要快速而肮脏的解决方案或想要测试某些东西而想要违反适当的协议,那很容易实现。

现在,“企业级”公司通常偏爱静态类型的语言的原因恰恰是因为它们对这些限制更加严格和明确。尽管在实践中,即使是静态类型的代码也可以被编译器的白痴破坏,但许多问题在流程的更早阶段(即运行时之前)就更加明显。这意味着即使代码库很大,整体且很复杂,也可以轻松捕获许多错误,而不必运行代码或将其发送给QA部门。

对于该环境之外的许多程序员来说,收益没有超过弊端的原因是,这些错误通常可以通过对代码进行彻底的检查甚至尝试运行它们来轻易捕获。尤其是当遵循测试驱动的方法时,这些错误通常变得微不足道并且易于修复。而且,由于许多此类公司的发布周期要短得多,因此生产力通常比刚性更重要,并且开发人员自己也要进行很多(基本)测试。

企业公司不使用动态类型语言的另一个原因是遗留代码。在我们看来,愚蠢的是,大公司通常会坚持使用可行的解决方案,即使它们已经过了保质期。这就是为什么如此多的大型公司强制执行Internet Explorer 6并如此缓慢地升级其OS。这也是为什么他们经常使用“旧”语言(例如Java的古老版本)编写新代码的原因:向不存在生命的软件中添加几行代码比获得批准以新的方式完全重写要容易得多语言。

tl; dr:静态语言更像是官僚主义,因此企业管理者更喜欢它们。


3
打字规则松散的语言会为错误的排序工作带来很多机会。例如,在JavaScript中,将数字传递给期望字符串的代码通常会像传递了该数字的字符串表示一样,但并非总是如此。尝试将456附加到123不会产生123456,而是会产生579。除非很清楚是谁负责数字到字符串的转换,否则它要么多余,要么根本无法完成。
超级猫

1
@supercat,我认为PHP和JavaScript是处理该问题的两种方式的好例子(关于运算符):在PHP中,运算符是明确的- +取数字并将其相加,如果需要串联,则需要使用.;在JS中,两个操作共享同一个运算符-如果您不知道自己的值将如何运行,则应明确转换它们。当然,这也与松散类型与严格类型有关(Python甚至更严格),但是基本上,您必须确保值具有正确的类型或使您的操作强制使用预期的类型。
艾伦·梅

1
我对PHP不太熟悉,但是听起来它使用了我称之为“正确”的方法。恕我直言,JavaScript在许多方面都是令人讨厌的,但我认为“ +”的行为是最糟糕的行为之一。实际上,我不相信松散的动态类型会比更强大的类型系统具有更多优势,后者允许接口声明某个其他类或接口类型的事物应被视为具有特定规则的实现或派生自该接口,关于如何优先考虑索赔。我目前使用的结构化类型框架最大的局限性在于……
supercat 2014年

1
...如果两个人独立开发相似的界面,那么第三方将无法编写可互换使用它们的代码。如果第三方可以定义新接口并声明现有接口中的一个或两个的实现应自动实现新接口(如果需要,则使用新接口中提供的包装器),我认为这将处理99%的语义关于动态类型好。
2014年

3

不,我认为动态类型语言不值得所有批评。(或者,如果您愿意,它们应该受到与静态类型语言一样多的批评。)

以我的经验(并且我没有尝试去概括该语句),批评动态语言的程序员没有使用过它们。对话通常是“但是使用静态类型时,编译器会捕获很多错误!” 我说“嗯,根据我的经验,这不是问题”。(通常,其他程序员来自Java,Delphi或类似背景;我不知道任何Haskell或ML程序员。)

真正抱怨我的唯一的事情是,当该技术美孚不能有人声称可能完成(或者可能是很难做到的),在动态类型语言......当这种技术在被发明,通过和动态类型语言。IDE?短暂聊天。自动重构?短暂聊天。调用者/执行者?短暂聊天。


我不想以我个人的立场来弄乱我的答案,这就是:做正确工作的正确工具。无论使用哪种语言,都比另一种语言更适合某些任务,而较不适合其他任务。
Frank Shearar 2010年

6
当其他程序员来自Haskell时,他/她已经知道它是Java和动态语言的上乘语言;)
Andres F.

0

企业只是没有足够快地采用新的语言和工具,这有充分的理由。但是,当像C#这样的主流工具之一实现其中的某些功能时,它们就会then入主流企业中。


我不知道为什么这被否决了,但这是一个有见地的声明。企业缓慢而保守。人们也喜欢渐进式变化(例如C#中的dynamic关键字,它使您偶尔使用静态类型的语言中的动态类型)而不是突然的变化(例如Ruby)。
Vaddadi Kartick '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.