这个答案涵盖了极好的范围,并且链接了为什么不同的语言可以为项目带来独特的好处。但是,项目最终使用多种语言的原因不仅仅涉及语言的适用性。
项目最终使用多种语言的原因有六个:
- 重用其他语言编写的代码的成本效益;
- 需要包括和容纳遗留代码;
- 提供特定语言的编码器;
- 需要特殊语言以满足特殊需要;
- 传统语言偏见;和
- 项目管理不佳(计划外使用多种语言)。
原因1-4是积极的原因,在某种意义上说,直接解决这些问题可以帮助项目更快,更有效地完成,拥有更高质量的产品并获得更轻松的长期支持。原因5和6是负面的,对需要的更改有抵抗力的症状,计划不力,管理不力或所有这些因素的组合。不幸的是,这些负面因素是“偶然”使用多种语言的常见原因。
原因1,即重用的成本效益,由于开源软件的更大作用以及改进的在Web上查找正确的代码组件的能力而成为允许在项目中使用多种语言的越来越强大的原因。面对经济现实,过去几十年的“内部全部编码”理念一直在消失,对于任何新项目而言,它从根本上不是最具成本效益的方法。反过来,这使得在项目中严格执行使用单一语言的机会减少了。
特别是在项目重用管理良好的开源组件的情况下,使用多种语言可以带来巨大的总体成本收益,因为重用的组件既隐藏在设计良好的界面后面,又由零成本的外部组独立维护。在最佳情况下,通过这种重用来混合语言对于项目而言,与使用操作系统组件相比,其成本不会更高。我没有比微软在其浏览器中大规模采用开源软件更好的例子说明这种方法的价值。
原因2(容纳遗留代码的需求)在任何大型项目中都被忽略。然而,遗留代码可能会带来很多麻烦,天真的假设可以轻松地用一种新语言替换新代码会带来极大的风险。遗留代码,甚至是糟糕的遗留代码,通常也包含了使用遗留产品的社区所期望的隐式“合同”。该社区通常是公司收入的主要来源,或者是支持政府软件的主要目标。简单地抛弃隐含的合同可以成群结队地追赶有意识的客户,并且如果其他选择随时可用,则可以在一夜之间使公司破产。
同时,不替换旧语言的旧代码与批发替换旧代码一样危险。最糟糕的例子是美国退伍军人管理局,它拥有大量的重要系统,这些系统是用称为MUMPS(不开玩笑)的语言编码的,这种语言是由医生而非计算机科学家设计的。没有人愿意学习MUMPS,而真正了解MUMPS的人快要死了。因此,程序员在尝试使用其他更常见,功能更强大且维护更好的语言时,必须适应MUMPS。
这种多语言使用需要仔细计划。该计划必须在一方面失去数十年的客户知识与另一方面失去支持软件的能力之间的最前沿。可以在明确定义的接口后隔离旧代码,并在其行为得到充分记录后,使功能更强大的新代码替换旧代码的技术可以提供帮助。但是,这种遗留方案绝非易事,并且已经(并将继续成为)各种规模的许多公司和组织消亡的原因。
原因3(提供各种语言的编码器)是一个务实的因素,项目会忽略这些危险。无论项目组织者可能(正确或错误地)感觉到某种特定的语言最适合其目标,如果该语言与他们可用的语言专业知识库相冲突,则学习的进度和质量都会受到影响。弯曲的程序员试图学习一种新语言。
一种更合理的方法是根据功能区域分析项目的语言需求。例如,仔细查看该项目可能会发现,只有少量的“高价值”代码“顶点”(例如,用于实施某些专有算法的代码)需要使用一些不那么常用的语言进行编码的专业知识。大型项目的其他部分通常可以很容易地用更通用的语言,或者(甚至更好)通过管理良好的开源产品来容纳。因此,根据语言需求分析项目可以提供一种更为现实且更具成本效益的方法来聘用或租用特殊语言的特殊专业知识,还可以帮助加强单个项目中语言之间的界面。
原因4使用不同的语言满足不同的需求,从对项目需求进行的这种分析中可以立即得出结论。还应注意这一点,因为在单个项目中选择太多的语言来进行支持会导致支持和组件之间的接口的复杂性组合爆炸式增长。最安全的成本明智的做法是始终首先找到最大的重用机会,尤其是如果存在可以通过定制而满足更多需求的好的软件包。接下来,应该对可以满足大多数已确定需求的少量语言做出某种决定。在重用密集型开发中,这通常是粘合代码的一种。
通常选择一个具有非常相似功能的多种语言不是一个好主意,因为项目的某些成员很喜欢。但是,如果存在可以从特殊语言技能中受益的明确识别,定义明确的功能子集,则这可能是使用多种语言进行新代码开发的一个很好的理由。
原因5(对使用的语言进行必要的更改的抵制)可能导致严重的项目中断和内部冲突。作为用户Daveo在对此答案的评论中指出,对于某些项目人员而言,变更可能非常困难。同时,抵制变革绝不是一个简单的问题,这就是为什么它会引起很多冲突的原因。如果遗留语言功能足够强大,则使用遗留语言技能可以极大地提高项目的生产率,并且可以使团队运作顺畅并尊重质量,从而获得质量卓越的产品。但是,必须在许多高级语言,组件可用性,开放源代码选项和智能工具套件支持方面无法与许多较旧的语言与最新的语言一起完成这一事实之间达到平衡,同时要兼顾传统语言技能。
到现在和现在,继续使用较弱,可读性较低或生产率较低的遗留语言的最常见(且具有讽刺意味的是,最正确的)说法是,较旧的语言可以生成更有效的代码。这是一个古老的论点,可以回溯到1950年代,当时汇编语言的用户常常对FORTRAN和LISP中编程的兴起表示愤慨。在处理密集型代码(例如,操作系统内核)中,即使在现在,代码效率参数仍然可以具有有效性的示例仍然可见,其中C仍然是C ++的首选语言(尽管出于超出简单效率的原因)。
但是,在新世纪的全球联网且功能强大的机器支持的项目环境中,作为选择项目语言的主要论据的代码效率变得越来越弱。计算和网络硬件的爆炸式增长使人工智能应用得以大规模营销,这也意味着人类编程的成本可以轻易地使相对便宜的硬件和云软件上相对高效的代码执行成本相形见war。如果将其与组件库,开放源代码选项和高级智能工具包等最新语言的更高可用性结合起来,则仅出于效率原因而保留一种语言的情况就变得非常狭窄。即使在确实适用的情况下,
当项目出于任何原因而很少或根本没有改变人员的选择时,就会出现一个使项目保留传统语言的更有说服力的理由。例如,当一个主要的旧产品线完全用仅能熟练使用现有员工的语言编码时,就会发生这种情况。在这种情况下,项目必须要么继续尝试使用旧语言编程,要么尝试培训现有员工如何使用新语言。
用一种新的语言来培训传统语言人员本身就可能是一种危险。我仍然记得有一个案例,一个刚刚接受过培训并从C过渡到C ++的项目成员向我真诚地抱怨说,他只是不了解面向对象方法的优点。当我查看他的代码时,他已将其较早的103 C函数转换为单个C ++对象类的103方法...并且理所当然地看不出这有什么帮助。
更深刻的信息是,当人们用一种语言和一种语言风格进行编程长达数年或数十年时,即使拥有良好的培训计划,使他们以新的方式“思考”的困难也变得几乎无法克服。在某些情况下,别无选择,只能招募更适应当前趋势和方法的年轻设计师和程序员。
原因6是项目管理不善,不言而喻。语言的选择和在项目中的使用应始终予以明确考虑和评估,而不是偶然发生。至少,语言选择会对项目的长期命运和支持成本产生巨大影响,因此应始终加以考虑和计划。不要成为MUMPS!