我是一名刚毕业的研究生,旨在攻读计算机科学硕士学位。我遇到了多个真正吸引我并鼓励我为它们做出贡献的开源项目(CloudStack,OpenStack,moby和Kubernetes仅举几例)。我发现它们中的大多数共同点是使用多种编程语言(例如Java + Python + Go或Python + C ++ + Ruby)。我已经看过另一个问题,它涉及如何使多种编程语言相互通信:如何使两种不同的编程与两种不同的语言交互?

我想了解促使企业使用多种编程语言的要求。什么样的要求或要求类型使软件架构师或项目负责人说:“我建议我们将语言X用于任务1,将语言Y用于任务2”?我似乎无法理解在同一产品或软件中使用多种编程语言的原因。

评论

作为计算机工程专业的研究生,我要特别指出的是,对于研究代码,通常是“作者(学生)在开始时最了解哪种语言”的问题。研究项目,尤其是那些不会导致更大研究项目的一次性项目,倾向于将结果看重于“正确性”(以我的经验)。

@tonysdg:我想说的是“正确性”在学术界更重要,而不是更少。通常不相关的是可维护性,用户体验和/或文档。混合语言尤其会影响可维护性;它限制了合格维护人员的数量。

@MSalters:可维护性是我当时想寻找的一个词---我同意您所写的所有内容!

用于不同任务的不同工具。您会注意到,建筑建筑师和工程师使用不同的工具来建造一所房屋。

当您度假时,从您的房屋到机场再到外国机场再到酒店再到海滩,您是否在旅途的每一段都使用相同的交通方式?

#1 楼

这个答案涵盖了极好的范围,并且链接了为什么不同的语言可以为项目带来独特的好处。但是,项目最终使用多种语言的原因不仅仅涉及语言的适用性。

项目最终使用多种语言的原因有六个,主要原因:


重用以其他语言编写的代码的成本效益;
需要包含和容纳遗留代码;
编码人员可以使用特定语言;
需要特殊语言以满足特殊需求;
传统语言偏见;和
项目管理不善(计划外的多语言使用)。原因1-4是积极的原因,从直接解决这些问题可以帮助项目更快,更高效地完成项目,更高质量的产品,以及更轻松的长期支持。原因5和6是负面的,对需要的更改有抵抗力的症状,计划不力,管理不力或所有这些因素的组合。不幸的是,这些负面因素是“偶然”使用多种语言的常见原因。
原因1,重用的成本效益,已成为越来越强大的理由,允许在项目中使用多种语言。不仅可以发挥开源软件的作用,还可以提高在网络上查找正确的代码组件的能力。面对经济现实,过去几十年的“内部全部编码”理念一直在消失,对于任何新项目而言,从根本上讲,它绝不是最具成本效益的方法。反过来,这使得在项目中严格执行单一语言使用的机会减少了。

特别是在项目重用管理良好的开源组件的情况下,使用多种语言可以提供巨大的总体成本优势,因为重用的组件既隐藏在设计良好的界面后面,又由零成本的外部组独立维护。在最佳情况下,通过这种重用来混合语言对于项目而言,与使用操作系统组件相比,成本不会更高。我没有比微软在其浏览器中大规模采用开源软件更好的例子。

原因2,容纳遗留代码的需要被忽视了,任何大型项目。然而,遗留代码可能会带来很多麻烦,天真的假设可以轻松地用新语言替换新代码会带来极大的风险。旧版代码,甚至是糟糕的旧版代码,通常也包含与使用旧版产品的社区所期望的功能的隐式“合同”。该社区通常是公司收入的主要来源,或者是支持政府软件的主要目标。简单地丢弃隐含的合同会成群结队地吸引客户,并且如果其他可行的选择可以使一家公司破产。

同时,不替换旧语言的旧代码就像危险,因为要大量更换。最糟糕的例子是美国退伍军人管理局(U.S. Veterans Administration),该机构拥有大量的重要系统,这些系统是由医生而非计算机科学家设计的,语言称为MUMPS(不开玩笑)。没有人愿意学习MUMPS,而真正了解MUMPS的人快要死了。因此,程序员在尝试使用其他更常见,功能更强大且维护更好的语言时,必须适应MUMPS。

这种多语言的使用需要仔细计划。该计划必须在一方面失去数十年的客户知识与另一方面失去支持软件的能力之间走出一线优势。可以在明确定义的接口后隔离旧代码,并在其行为得到充分记录后使新的功能更强大的代码替换旧代码的技术可以提供帮助。但是,这种遗留方案绝非易事,并且已经(并将继续成为)许多公司和组织在各种规模上消失的原因。
原因3,编码器的可用性各种语言,是一个务实的因素,项目会无视其危险。无论项目组织者可能(正确或错误地)感觉到某种特定的语言最适合其目标,如果该语言与他们可用的语言专业知识库相冲突,则学习的进度和质量都会受到影响

,更合理的方法是根据功能区域分析项目的语言需求。例如,仔细查看项目可能会发现只有一小部分高价值代码的“顶点”,例如为了实现某些专有算法,需要使用不那么常用的语言进行编码的专业知识。大型项目的其他部分通常可以很容易地用更通用的语言,或者(甚至更好)通过管理良好的开源产品来容纳。因此,根据语言需求分析项目可以提供一种更现实,更具成本效益的方法来聘用或租用特殊语言的特殊专业知识,还可以帮助增强单个项目中语言之间的接口。

原因4:针对不同的需求使用不同的语言,可以从对项目需求的这种分析中迅速而顺利地得出结论。还应注意这一点,因为在单个项目中选择太多的语言来进行支持会导致支持和组件之间的接口的复杂性组合爆炸式增长。最安全的方法是始终首先寻找最大的重用机会,尤其是在存在可以通过定制而满足项目需求的好的软件包的情况下。接下来,应针对可满足大多数已确定需求的少量语言做出某种决策。在重用密集型开发中,这通常是粘合代码的一种类型。

选择具有非常相似功能的多种语言通常不是一个好主意,因为项目中的某些成员喜欢另一个。但是,如果存在可以从特殊的语言技能中受益的良好识别的,定义明确的功能子集,则可能是在新代码开发中使用多种语言的一个很好的理由。所使用语言的必要更改可能会导致严重的项目中断和内部冲突。正如用户Daveo在对此答案的评论中指出的那样,对于某些项目人员而言,变更可能非常困难。同时,抗拒变革从来都不是一个简单的问题,这就是为什么它会引起很多冲突的原因。如果遗留语言功能足够强大,则使用遗留语言技能可以极大地提高项目的生产率,并且可以使团队运作顺畅并尊重质量,从而获得质量卓越的产品。但是,必须在传统语言技能与以下事实之间取得平衡,即许多较旧的语言在高级功能,组件可用性,开放源代码选项和智能工具套件支持方面已无法与更新的语言竞争。

到现在和现在,继续使用较弱,可读性较低或生产率较低的遗留语言的最常见(也是具有讽刺意味的是,最经常正确的)论据是,较旧的语言可以生成更有效的代码。这是一个古老的论点,可以回溯到1950年代,当时汇编语言的用户常常对FORTRAN和LISP中编程的出现感到愤慨。在诸如操作系统内核之类的处理密集型代码中,即使在现在,代码效率参数仍然具有有效性的示例仍然可见,其中C仍然是C ++的首选语言(尽管出于超出简单效率的原因)。 />
但是,在新千年的全球联网和功能强大的机器支持的项目环境中,作为选择项目语言的主要论据的代码效率变得越来越弱。计算和网络硬件的爆炸式增长使人工智能应用得以大规模营销,这也意味着人类编程的成本可以轻易地使相对便宜的硬件和云软件上相对高效的代码执行成本相形见war。如果将其与组件库,开放源代码选项和高级智能工具包等最新语言的更高可用性结合起来,则仅出于效率原因而保留一种语言的情况就变得非常狭窄。即使在确实适用的情况下,重点也应该放在使用仍在社区中获得广泛支持的诸如C之类的语言上。当项目出于任何原因而很少或根本没有改变人员的选择时,就会出现一个使项目保留传统语言的更有说服力的理由。例如,当一个主要的旧产品线完全以仅能熟练使用现有员工的语言进行编码时,就会发生这种情况。在这种情况下,项目必须要么继续尝试使用旧语言进行编程,要么尝试对现有员工进行如何使用新语言的培训。

用新语言培训传统语言的员工。本身就是危险。我仍然记得有这样一个情况,一个刚刚接受过培训并从C过渡到C ++的项目成员向我真诚地抱怨说,他只是不了解面向对象方法的优点。当我查看他的代码时,他已将其较早的103 C函数转换为单个C ++对象类的103方法...并且理所当然地看不到有什么帮助。

更深刻的信息是当人们用一种语言和一种语言风格进行编程长达数年或数十年时,即使拥有良好的培训计划,使他们以新的方式“思考”的困难也变得几乎无法克服。在某些情况下,别无选择,只能招募更适应当前趋势和方法的年轻设计师和程序员。

原因6,糟糕的项目管理本身就是不言而喻的。语言的选择和在项目中的使用应始终予以明确考虑和评估,并且绝不允许偶然发生。至少,语言选择会对项目的长期命运和支持成本产生巨大影响,因此应始终加以考虑和计划。不要成为MUMPS!

评论


我完全同意。尽管Basile的答案主要侧重于性能和可表达性问题,但您的答案可帮助任何人理解选择多语言编程背后的管理观点。

–Parth Patel
18年5月2日在5:34

@ParthPatel我想您应该接受这个答案,这是最好的独立式包装。

–leftaround关于
18年5月3日在13:26

+1:但是你忘了自我的。许多人拒绝学习新的语言,并坚持他们所知道的。多个团队的成熟度不同,可以在一个项目中带来许多不同的技术

– Daveo
18年5月4日在5:15



原因7,试图使IT部门出于招聘目的而显得性感。别开玩笑,在一个.Net项目中,我们最终不得不替换现有服务中的单个端点,以在Go中使用全新的服务,这样他们才可以在工作添加中添加“ polyglot”!

–克里斯·李(Chris Lee)
18-09-18在20:03

h!我不能不同意使用多种语言对那些担心自己会陷入死胡同,纯COBOL的工作的人的吸引力。这是我第一次听说专门为此目的添加语言,但是可以肯定的是,在许多环境中,使用更多种工具和语言被视为表明它们正在使用最新技术,因此是一个更进步的工作场所。很好的例子,谢谢!

–特里·布林格(Terry Bollinger)
18-09-18在20:14

#2 楼


我似乎无法理解为什么在同一产品或软件中使用多种编程语言的原因?


很简单:没有单一编程适用于所有需求和目标的语言。

阅读Michael L. Scott的书《编程语言语用学》

一些编程语言偏向于表达性和声明性(很多脚本语言,但也很高级)级别的编程语言,例如Agda,Prolog,Lisp,Haskell,Ocaml等)。如果开发成本很重要(人工和开发人员的成本),则适合使用它们(即使运行时性能不是最佳的)。

其他编程语言更喜欢运行时性能(许多低级语言,通常使用已编译的实现,例如C ++,Rust,Go,C,汇编器,还使用专用语言,例如OpenCL ...);通常,它们的规范允许某些未定义的行为。当代码的性能很重要时,最好使用这些语言。

一些外部库是为特定语言和ABI编写的,并且要记住调用约定。您可能需要使用其他语言,并通过编写一些胶合代码来遵循外来函数接口约定。

在实践中,不太可能使用具有高表达能力的编程语言(因此可以改进假设拥有足够熟练的开发人员团队,并且在运行时表现出色,则可以提高开发人员的工作效率。在实践中,要在表现力和性能之间进行权衡。

注意:但是,编程语言的进展缓慢:Rust比C甚至C ++更具表现力,但其实现是几乎与性能一样,并且可能会改进以生成同样快速的可执行文件。因此,您在职业生涯中需要学习新的编程语言。但是没有银弹

请注意,今天的开发成本越来越高(1970年代情况并非如此(当时的计算机非常昂贵,或者在某些嵌入式应用中具有大量产品)。经验法则(非常近似)是,熟练的开发人员每年能够编写约2.5万行(调试和记录的)源代码,并且在很大程度上不依赖于所使用的编程语言。

常见的方法是在大型应用程序中嵌入某些脚本语言(或某些领域特定的语言)。这个设计思想(与特定领域的语言有关)已经使用了数十年(一个很好的例子是Emacs源代码编辑器,自1980年代以来就使用Elisp编写脚本)。然后,您将在大型应用程序内使用易于嵌入的解释器(例如Guile,Lua,Python等)。在大型应用程序中嵌入解释器的决定必须尽早完成,并且具有很强的体系结构含义。然后,您将使用两种语言:对于必须快速运行的低级内容,应使用某些低级语言,例如C或C ++。用于高级脚本,其他DSL或脚本语言。

还请注意,给定软件可以在大多数当前操作系统(包括Linux,Windows,Android,MacOSX,Hurd等)中运行。在使用某种进程间通信技术的几个协作过程中。它甚至可以使用分布式计算技术(例如云计算,HPC,客户端服务器,Web应用程序等)在多台计算机(或其中的许多计算机)上运行。在这两种情况下,都可以轻松使用多种编程语言(例如,使用自己的编程语言对在一个进程或计算机上运行的每个程序进行编码)。阅读操作系统:三篇简单文章。此外,外部函数接口(例如JNI),ABI,调用约定等...有助于在同一程序(或可执行文件)中混合多种语言-并且您会找到诸如SWIG的代码生成器来提供帮助。

在某些情况下,您必须混合使用几种编程语言:Web应用程序需要Javascript或Webassembly(大多数Web浏览器中唯一运行的语言)才能在浏览器中运行(存在一些框架来生成这些语言,例如ocsigen)。内核代码需要一些内容(例如,调度程序或对中断的低级处理)才能部分地用汇编程序编写,因为C或C ++无法表达那里需要的内容,RDBMS查询应使用SQL,GPGPU需要使用OpenCL或CUDA由C或C ++主机代码等管理。...
某些语言旨在促进这种混合(例如,C中的asm语句,我较晚的GCC MELT中的代码块等)。 />
在某些情况下,您使用元编程技术:大型软件项目的某些部分将具有通过某些特定形式化的其他工具(可能是项目专用工具)生成的代码(例如,C或C ++)。我会想到像bison或ANTLR这样的生成器(不正确地称为编译器),还有SWIG或RPCGEN。并请注意,GCC内部有十几个专门的C ++代码生成器(GCC内部每个内部DSL都有一个)。另请参见此示例。注意,很难找到metabug。还请阅读有关自举编译器以及谐音和反射的信息(值得学习Lisp,玩SBCL并阅读SICP;还应研究GITJIT之类的JIT编译库;在某些大型程序中,您可能会在运行时使用生成一些代码他们;请注意Greenspun的第十条规则)。另请参阅FOSDEM2018上的Circuitless Traveled演讲。

有时,您想使用一些专门的注释语言(可能会为代码提供正式的注释)(例如,帮助证明,静态分析器,编译器)被视为某些DSL)。查看带有Frama-C的ACSL以注释C程序(安全性至关重要的程序)或HPC的OpenMP编译指示。注意:编写此类注释可能需要大量技能和开发时间。

BTW,这表明一些有关编译器和解释器的技能对每个开发人员都非常有用(即使没有在编译器内部工作)。因此,即使您不使用编译器,也请阅读《龙书》。如果您编写自己的解释器(或设计DSL),则另请阅读Lisp In Small Pieces。 >
还要研究一些大型自由软件项目的源代码(在github上或从Linux发行版中),以获取启发和启发。

此外,一些编程语言是通过添加注释(如编译指示)而演变而来的或注释)到现有语言。例如,考虑一下ACSL(注释扩展名,以注解C程序以通过Frama-C对其进行证明)或OpenCL(注释C的方言以编程GPGPU)或OpenMP或OpenACC #pragma或Common Lisp类型注解。 >
PS:混合编程语言也有社会,组织或历史原因;我在这里忽略了它们,但我知道实际上这些原因是主要的。另请阅读《神话人月》

评论


对我来说,这是正确的答案。例如,您可以使用C程序中的汇编例程。 UNIX Shell散布着多种编程语言,您经常会在bash脚本中发现使用awk(另一种编程语言),只是因为它更适合该任务)。但是,@ amon的观点仍然成立。

– MayeulC
18年4月29日在16:06

顺便说一句,一个优秀的程序员有时能够删除代码行...(通过用一小撮好代码替换很多糟糕的代码行)

–Basile Starynkevitch
18年4月29日在19:39

很好的答案,但有一个要求:我很欣赏通过不太显眼地表示“旁白”的愿望,但是请不要滥用HTML SUP标签,因为它具有以较小字体呈现的副作用。这肯定是一个可访问性的噩梦,正如HTML5标准所告诫的那样,“这些元素只能用于标记具有特定含义的印刷约定,而不能用于出于演示目的的印刷表示。缺少这些元素将改变内容的含义。”

–FeRD
18年4月30日在7:39

@FeRD:删除了,但遗憾

–Basile Starynkevitch
18年4月30日在7:41

@BasileStarynkevitch表示赞赏。就像我说的那样,我很欣赏我的意图,作为一个过于冗长,倾向于切线的作者,我当然希望StackExchange提供一种受支持的样式较小的文本样式方法,或者可能在单击显示容器中折叠了。但是段落长度的上标不是解决该缺陷的方法。

–FeRD
18年4月30日在7:44

#3 楼

许多项目不是用多种编程语言构建的。但是,通常使用其他语言的脚本来辅助软件。


作为单独程序的管理工具有时用不同的语言编写。
库和API经常提供多种语言的绑定,以便开发人员可以使用他们喜欢的任何语言。
构建脚本和相关的开发脚本通常使用专用语言。
应用程序的端到端测试不需要使用相同的语言。语言。

一些项目确实在应用程序中使用多种语言,例如可以将插件集成为脚本语言的低级语言的核心。在某些生态系统(例如JVM或.NET)中,使用的确切语言不太重要,因为同一语言运行时上的多种语言具有良好的互操作性。例如,我可以在Scala中编写一个项目,该项目使用现有的Java库,并将脚本功能与Groovy集成。

如果一个项目包含多个工具,则也可以使用不同的语言来开发它们。虽然一致性将是一件好事,尤其是对开源项目的可用开发工作可能是一个瓶颈。如果有人愿意开发一个有用的工具但不熟悉主要语言,那么该工具可能比一致性更有价值。

评论


这是对@Basile答案的补充。 Linux内核中的perl脚本不是内核的一部分,Makefile也不是。对于这些使用C没有任何好处。而且,这些perl脚本可以独立于Linux内核使用。通常,这些项目可以被认为是一个紧密相关的项目,但却是截然不同的项目。通常,您将为一种任务使用一种语言。

– MayeulC
18年4月29日在16:04

#4 楼

这有两种形式,很多组织介于两者之间:

不好的形式-组织是一团糟,没有人可以确保对这项工作有一个单一的技术愿景。开发人员很可能会使用他们最熟悉的语言,或者最近尝试了新的框架或语言,并由于天真的乐观而决定开始使用它。

良好的形式-该组织确实拥有良好,干净的架构,非常适合多语言编程;将应用程序解耦到具有明确定义的边界上下文的独立组件中,并且这种组合使他们能够选择最简单地允许他们编写特定组件的编程语言。

现实-通常,前者比后者。我已经看到一些公司为其业务领域选择一种语言,为Web服务器选择另一种语言,并且通常为数据库管理选择第三种语言,这在技术上是可以的,但是很快他们缺乏技术理解(或者拒绝听其员工的话)。意味着它们最终将所有三个模糊在一起,变成一团糟,并经常引入更多的语言来解决这些混乱的特定部分。

#5 楼

我可以举一个例子,该例子已经运行了32年,并且看起来还有很多生命。它是商业性的,而不是开源的。

核心是用针对特定领域的语言编写的,专门为项目创建。事实证明,这非常有用,特别是因为它将回滚功能集成到了基本体系结构中,但是又将其编译为C代码,然后我们使用平台的编译器对其进行编译。在那段时间里,它已经支持了大约二十个平台,还不包括32位和64位版本的差异,目前已经在其中六个版本上发布了。

它有一个用C ++编写的附加组件,它是在项目的前任负责人确信C ++ / MFC / Windows / x86将取代所有其他体系结构和平台时启动的。必须提供C ++工作才能聘用员工。事情没有像他预期的那样。

除了领域语言和C ++,开发人员还使用LISP进行工作,该LISP使用测试工具中嵌入的解释器来编写测试用例。我们曾经考虑过用Java替换LISP,但幸运的是我们没有这么做。

它也有一个主要的API包装语言,用C#编写。当客户需要时可以执行此操作,以便他们可以用C#重写应用程序。它是由Perl脚本创建的,该脚本读取API的C头文件以及重要的配置文件,然后为包装器编写C#代码。在Perl中进行所有这些文本处理比在C ++中进行更加容易。

它具有自己的构建系统,并且需要它们,因为领域语言不适合基于make的构建系统。一个用于类UNIX平台的程序是用Shell脚本,Perl和一些小程序用领域语言编写的。用于Windows平台的是用批处理语言,Perl和域语言中的相同小程序编写的。旧的VMS构建系统是用DCL编写的,但是十多年来一直没有使用。

领域语言的编译器中有一些YACC / Bison编程。有一些用Objective-C ++编写的Apple平台测试代码。团队的一些内部网站(用于项目管理,不属于可交付成果的一部分)是用ASP编写的,而其他网站则是用Perl编写的CGI脚本。

基本上,这是从一个解决难题的项目开始的,因此值得创建专门的工具,该工具似乎比其他任何工具都更适合该工作。该团队认为编程是一种与所用语言无关的技能,因此,如果这会使任务变得更容易,他们愿意使用一种新语言。但是,时尚并没有在他们的优先事项列表中排在首位,因此他们不会通过免费引入一种新语言来分散任务。

该代码的功能是数学建模,可在工作站和服务器上使用(如果我不识别产品,我可以说得更自由一点)。目前大约有2500万个LoC,团队总数约为50个。

评论


最好再介绍一下该软件产品:在哪个工业领域(例如,神经外科手术机器人与高频交易不同)?大概的大小(以几百万行代码为单位)?团队规模是多少?

–Basile Starynkevitch
18年4月29日在19:42

@BasileStarynkevitch:添加了详细信息。

–约翰·达曼(John Dallman)
18年4月30日在10:52

这个。这就是为什么项目从好到坏到丑陋都有多种语言的原因。

–杰瑞德·史密斯(Jared Smith)
18年5月1日在12:06

#6 楼

在某些情况下,您需要使用一种工具(例如操作系统的UI工具包),该工具最容易从给定的语言访问。例如,在iOS和macOS上,如果要使用UIKit和AppKit编写GUI应用程序,则用Swift或Objective-C编写是最快,最简单的方法。 (可能有其他语言的绑定,但它们可能是您要针对的最新操作系统版本提供的绑定,因此可能无法提供所有功能。)

通常情况下,当应用程序跨平台运行时,平台,应用程序的核心逻辑是用两种语言都可以访问的,并且UI / OS专用的部分是用它们本机可用的任何语言编写的。

编写Windows和macOS应用程序,您可以用C ++编写核心逻辑,并在Windows的UI上使用C#,在macOS的UI上使用Swift。这样可以节省时间,因为您不需要编写两次核心逻辑,也不需要处理两个应用程序中的不同错误集,等等。但是,它还允许使用真正的本机UI,该UI不能满足使用之间平台的最低公分母跨平台的UI库。

评论


MVC FTW!甚至可以只为每个操作系统/环境使用一个带有包装器应用程序的跨平台核心...或者在连接的现代世界中将其迁移到客户端/服务器架构

– ivanivan
18年4月29日在20:58

这符合我的经验。我从事的每个规模庞大的项目都使用多种语言,而多种语言从来没有提供任何好处。原因始终是,必须用特定的语言编写特定的部分才能与特定的工具进行交互。

–欧文
18年4月30日在0:24

作为一名前iOS开发人员,我可以确认我们做到了。我们有一个用PHP编写的API,该API以JSON进行通信;一个用PHP编写的Web前端,也有JavaScript / HTML5部分;一个用Java编写的Android前端,以及用Objective-C编写的iOS前端。 。后来,较新的项目是用Swift编写的,但是我们的内部框架仍然是用Objective-C编写的。因此,有时我们的应用程序之一是用PHP,Java,Objective-C,Swift,JavaScript和HTML5编写的,并且可以在3个平台上使用。

–贝儿
18年5月2日在9:47



#7 楼

除了某些编程语言可以更好地适合某些特定任务这一事实之外,还有实际的现实。

在实际的现实中,要考虑两个特别重要的方面:


人们对不同的编程语言有着不同的经验和兴趣水平。 -在某些情况下,允许人们使用自己喜欢的语言和精通的语言可以比强迫他们使用一种通用语言带来更好的最终结果。
大型代码库是由不同的人长时间构建的。 -一旦出现了更适合它的语言,就无法获得重新编写整个项目所需的资金或志愿者数量。

当然,应用程序通常包含特定的部分具有完全不同的需求,例如:用编译语言开发的性能敏感区域。示例语言:C ++
用脚本语言开发的区域需要便宜,易于更改并且可能可自定义。语言示例:Lua。
GUI布局。示例语言:HTML
安装程序。语言/工具示例:WiX。
构建。语言/工具示例:太多列表,通常一次列出多个。

最重要的是,复杂的代码库使用了很多工具,其中许多工具允许必要的自定义和插件。还有另一种语言。

评论


HTML不是一种编程语言

–贝尔吉
18年4月30日在13:46

@Bergi正确。彼得没有宣称是。这是一种标记语言。

–贝儿
18年5月2日,9:58

HTML,XAML,QML等是程序员在软件项目中使用的语言来告诉计算机该怎么做-这些语言通常不是严格必需的,因为程序员理论上可以用一种语言编写整个项目,包括UI。这就是它在此问题中的相关性。

–彼得
18年5月4日在11:20

#8 楼

除了已经提出的其他正确观点之外,
根据经验,许多语言或环境决策都是由“如果您有锤子,一切看起来都像钉子”来做出的,这意味着人们倾向于使用他们熟悉的工具

此外,引入新的环境甚至语言是对许可证,培训甚至硬件的一项重大投资,并且会浪费大量的生产时间-采购,安装,配置,培训每种产品在一家大公司工作几周,您最终会遇到一堆初学者。
基本上没有时间在更现代或更合适的环境或语言上进行“投资”,因此他们会坚持使用现有的东西直到无法工作为止。

专门针对您的问题,如果有多个人员/团队参与解决方案的开发,则每个小组都倾向于坚持他们最了解的知识,因此整个解决方案中可能包含多种语言,并且正在开发中多种环境。

#9 楼

这个问题(和一些答案)似乎假设应用程序是单片代码块-不一定是这种情况。

您像Stack Exchange这样的典型网站实际上是一堆正在运行的不同服务彼此独立,彼此之间有某种消息传递。这些服务可以(通常)以不同的语言实现,每种语言都有自己的优势。

我在一个很小的网上银行平台上工作,主要针对较小的社区银行和信用合作社。该平台具有多个组件-Web前端,数据库层,第三方通信层等。这些都是在具有不同操作系统的不同服务器上运行的独立应用程序。您在浏览器的客户端上运行着Javascript,在服务器端上运行了Perl,您使用C ++编写了多个服务,这些服务充当Perl代码和银行核心处理器之间的抽象层,这是另一套C ++应用程序,在各个层之间路由消息,少量C ++应用程序和Perl脚本以监视各个进程的运行状况并将其状态报告给内部监视器等,等等。与我层交互的第三方系统通常是COBOL在大型机上运行的应用程序。

整体应用程序仍然存在,但即使出于不同的原因,它们也可以利用不同的语言。您可以用Java编写90%的应用程序,但可以使用JNI来利用C或C ++来执行更关键的性能部分。

评论


令我惊讶的是,没有人提到SQL(或您选择的查询语言),如今大多数应用程序至少都具有某种“堆栈”架构。

–user3067860
18年5月2日在16:07

#10 楼

我想指出一个非常具体的实例,即“不同的语言具有不同的优势”的主题:FORTRAN。

Fortran最初是为了使工程师更易于进行数值分析工作而开发的,此后,为使Fortran编译器发出非常有效的数字代码付出了很多努力。另一方面,自从早期使用计算机以来,计算机的使用激增了数千个方向,其中没有一个涉及数值分析,并且编程语言的发展在很大程度上跟随了忽略“现实”世界的过程。

SO:今天,您发现自己在一家产品相当庞大的公司工作,其中大部分是用Java编写的(我是根据个人经验讲的)。但是您发现该产品的核心功能之一将是重新进行某种形式的数值分析,并且针对该特定分析的所有最佳代码已经在网上提供-在Fortran中。所以你会怎么做?您下载其中一个Fortran代码,找出其接口[即最顶层子例程的参数],用C为其鞭打JNI包装器,并将其打包为Java类。 AM!您只需要一次用三种语言进行开发。 [特别是如果您发现您的Fortran代码使用COMMON块-即静态存储-且必须进行修改以确保线程安全]

评论


否则,您可以通过在某一点调用一种新的算法来改进经过良好测试的FORTRAN计算核心,该算法依赖对指针进行堆排序,而该指针已经用C语言编写。并且您有要扫描的复杂输入文件,因此您可以编写Flex中的扫描仪。哦,也许您想在顶部使用GUI,您必须从C ++调用它。或者客户真的想将整个事情作为Matlab子例程来调用...

–jamesqf
18年4月30日在18:14

#11 楼

因为编程不是一项任务。即使创建产品也不是一项任务。有多种类型的任务,最好用不同的语言表达。

为了更具体一点,让我们假设一个简单的事情,例如独立应用程序(分布式应用程序要执行更多任务)。

产品需要


编写
放在一起(这涉及编译和收集资源(如图像,字体等)以进行部署)
部署
配置
受监视的

一种可能对编写产品的运行时间有益的语言不太可能与将产品组合在一起一样好。依此类推。

但是,即使编写产品的过程也可能无法用一种语言来优化。

比方说,产品中处理了很多结构化数据。在撰写本文时,数据的结构是否已知?如果是这样,您将需要在部署时配置一些数据库。最好使用一种可以生成可编译为您的运行时语言的语言来完成此操作。

如果数据结构可以不时改变怎么办?比您需要一种将新的数据构造转换为代码和数据库配置的结构化方法。最好用另一种语言完成。

可以用同一语言完成所有操作吗?当然。但是您的效率取决于完成项目的速度以及对更改的适应能力。如果您的许多工作可以使用已经存在的工具实现自动化,那么您花3个月的时间就可以由其他人在2天内完成。但是有人会使用其他语言来自动化您通过重复进行的操作。

评论


“可能不太适合写产品运行时的语言就不会那么好。” ...编程语言并非来自随机过程,因此以这种方式谈论可能性有点奇怪。编程语言旨在解决某些任务。现在,您的观点是,一种语言也不太可能偶然解决另一个并非旨在解决的问题。我要说的是,编程的本质是对人们可能希望解决的所有问题进行抽象,因此,一种设计得很好的语言应该可以胜任任何任务。

–leftaround关于
18年5月2日在13:18

@leftaroundabout混淆一种语言的功能和表达良好的语言是一个常见的错误。高级语言的目的不是解决问题。它充当一种语法来表达问题的解决方案,其中某些工具可以将此表达式转化为计算机要执行的任务。鉴于此,重要的是要记住,表达的实际工作是由人们完成的。人们使用不同的抽象来描述来自不同领域的问题的解决方案。

– grovkin
18年5月3日在1:30

当然,人们使用不同的抽象。我的观点是,一种好的语言应该能够表达所有这些抽象。

–leftaround关于
18年5月3日在8:35

@leftaroundabout,一点也不。表达任何东西都需要能够将注意力转移到事物上。试图很好地表达所有类型的抽象将意味着引起对所有抽象的关注。那样会分散注意力并导致想法表达不佳。选择要重点强调的内容并没有错。

– grovkin
18年5月3日在15:51

能够将注意力转移到某个地方与实际做事不一样。

–leftaround关于
18年5月3日在16:00

#12 楼

软件开发已经发展到可以在同一项目中使用不同的编程语言的程度,并且可以使其正常工作。

然后是一个问题,为什么您会使用多种语言。

原因之一是语言已经过时并逐渐被更新的语言所取代,如果幸运的话,可以一点一点地完成。因此,您的项目将混合使用新旧语言。

另一个原因是,语言X很大程度上是平台A上使用的语言,语言Y却是平台B上使用的语言非常多,但是两种平台都支持语言Z。因此,通用代码是用语言Z编写的,然后根据平台将其与X或Y组合在一起。

人们喜欢使用别人编写的代码(换句话说,他们不必花费时间自己编写代码)。他们可以随意使用他人用任何语言编写的代码,然后以他们喜欢的语言添加代码。

评论


关于第一句话:混合语言程序已经存在了50多年。

– Blfl
18年4月29日在13:17