即使在20年前,也可以调用用一种语言编写的代码来调用另一种语言编写的代码;在学校,我们从Ada代码中调用汇编图形例程进行一个类赋值。值得注意的例外是从脚本中运行编译代码或从编译代码中执行系统命令;但我们很少用C ++编写库以在我们的Java应用程序中使用。当Java第一次出现并且它仍然很慢时,可以选择用Java编写主应用程序并将瓶颈代码移动到使用JNI调用的某些C / C ++ DLL中。
那么,经过这么多年,是什么阻止我们编写多语言应用程序?我想到的主要场景是,当一种语言被认为是一个很好的选择时,如果它不是因为某些性能瓶颈(比如在早期的Java时代),所以它完全用C语言编写,而不是使用两种语言的混合。
我从架构角度和语言设计中对此感兴趣。你有什么好的例子,成功的故事或报价吗?
[编辑] 其中一个最好的例子就是对Java的反对,因为它早期的性能很慢。尽管JIT编译器已经解决了这个问题,但我的问题始终是用一种语言编写软件,使其更易于编写,读取和维护。如果存在瓶颈,请在程序集或C中编写例程以解决瓶颈问题。这样你至少在理论上应该得到两全其美。
答案 0 :(得分:37)
使用多种语言涉及:
是的,它有时是值得的 - 但在我有充分的理由之前我不会这样做。
.NET和Java都使这更容易,当然 - 在一个平台上使用不同的语言 比在托管和本机代码之间进行互操作要容易得多。
答案 1 :(得分:13)
我看到的最大问题是因为它要求团队中的每个人都非常多元化(参见Jon Skeet的回答)。如果你有一个由十人组成的团队,三个人非常了解C#和一些VB.NET,那么三个人知道VB.NET非常好而且很少知道C#,其他四个人非常了解C ++,但是在C#或VB上只是好的。 Net,你能想象他们会编写什么样的程序是多语言吗?它可能会变得很好,但如果你失去了几个团队成员,时间是至关重要的,并说这是你的C ++人,现在谁将修复该代码呢?当然不是那些没有C ++多样性的.NET人员。这可能会导致很多问题。
我认为为什么应用程序今天主要是单一语言的第二个原因是因为当你达到大量的代码行时,能够遵循相同的流程,模式并看到相同类型的代码是非常好的整个系统。你的大脑不需要在语言之间切换来解决问题,因为你已经在“思考C#”了。
我有一个朋友在VB.Net中编写用户界面,他的后端代码总是存储在C#的DLL中。这没关系,VB.NET和C#工作得非常好,但是说他需要将它外包给某人来修复一段代码,其中一个错误在VB.NET和C#代码中都有,好吧,他需要外包两个开发人员,一个流利的VB.NET,另一个在C#。这会增加两倍的成本,以及当他刚刚完成一次时的开销。
但是,我完全同意可能将C ++用于性能关键部分的应用程序。有时候,对于性能关键的代码段,简单的.NET可能不是一个好的选择。这种代码混合绝对没问题。从长远来看,代码混合并不是一件坏事。这可能是好的,因为它可以帮助您作为开发人员变得更加多样化,改变您的思维方式,并帮助您作为开发人员。但是你必须为更多的开销做准备,可能需要花费,甚至可能会遇到一些挫折。
对你来说也许是一个好主意(如果你正在寻找这种类型的答案)就是选择每种技术的语言。我亲自在VB.NET中编写了所有的web应用程序(asp.net等)。它编写速度快,易于阅读且易于维护。对于网络来说,这正是你想要的。然而,我的所有桌面应用程序都被推入C#,因为它在某些方面是一种更强大的语言,并提供了一些VB.NET所没有的东西。真的,这是所有个人喜好,但你明白了。
答案 2 :(得分:8)
人们一直在编写多语言应用程序。您提到了从脚本语言调用的编译代码。这经常发生,例如,来自Python,Perl,Lua或R的C ++或来自Groovy的Java。不确定从Java调用C ++的频率,但我确信它也会发生。
这就是swig如此受欢迎的原因。
答案 3 :(得分:3)
UNIX已经解决了这个问题。编写可以串联在一起形成解决方案的小实用程序的UNIX风格是用多种语言编写应用程序的一种形式。而不是定义语言之间交互的界面和/或机制,例如, JNI,命令行或shell环境已成为事实上的标准。
我想知道是否暴露于UNIX,或者缺乏这种主题,使得这个话题分别不值得努力或者令人抓狂。也就是说,具有UNIX经验的人不会为JNI而烦恼,因为他们以不同的方式处理设计问题,因此他们的应用程序更具内部模块性和内聚性;更有利于变成一系列应用程序中的组件而不是单一的整体怪物。
答案 4 :(得分:3)
根据您对此问题的看法,有许多应用程序使用多种语言编写或不使用。
例如,考虑使用多个网络服务的 mash-up网络应用。每个Web服务都可以用不同的语言编写。所以在某种意义上,这样的应用程序 用多种语言编写。
或者,您可以查看可能使用的“简单”,非混搭,网络应用:
在C#的情况下,甚至可能存在 OR / M工具或 LINQ to SQL ,用于访问数据存储。我们不要忘记在各种代码级别中嵌入正则表达式。这些都是不同的语言。因此,在这个意义上,经常使用多种语言来构建应用。
但我不认为这就是你的想法。 我认为您的预期范围是由单个项目团队生成的代码的“主体”。你想知道为什么一个项目不会写,比如说,Java中的一个组件,Lisp中的另一个组件,Erlang中的第三个组件,然后将它们作为统一的可交付项链接在一起。
有人提出了一些答案,比如构建/部署更难,或者不是每个人都能够在系统的每个部分工作,因为某些语言缺乏技能。我不会出售这些类型的答案。我在主要用单一语言编写的项目中看到过令人讨厌的构建/部署脚本。根据我的经验,当几乎任何项目达到一定规模时,特别是如果它是由许多人思考的,那么每个人都很难精通系统的每个部分。此外,从一种语言跳到另一种语言(考虑到经验丰富的开发人员)确实没有像有些人那样成功的障碍。
问题在于我们不能只像lego块一样插入代码。我们希望,在某些情况下,也许我们可以做到这一点。问题主要在于公共组件接口和组件依赖性的规范是否成熟。再一次,我已经看到这些东西妨碍了“主要是一种语言”的项目。但是当你跳过语言界限时,情况会更复杂。
无论如何,为正确的问题使用“正确”的语言是非常有价值的。如果你真的相信你有三个最好用Java,Lisp和Erlang表达的组件,那么用这些语言编写这些组件对你有利。 只要您希望将它们链接在一起并维护这些链接所需的工作量不会超过您使用多种语言编写的值。
因此,它真正归结为降低组装组件的成本。这与仅仅说“构建越来越难”的概念略有不同。通过定义良好的公共接口,适当的信息隐藏以及相对无痛的依赖项发现和解决,没有理由不能用单一项目的组件编写多种语言。
答案 5 :(得分:2)
我完全同意这个问题的前提。
学习多种领域特定语言比尝试学习将通用语言应用于多种域更容易。
不要误以为使用一种通用语言会以任何方式缩小所需的技能和学习。现在你必须学会如何将单一语言扭曲成各种形状,并学习六种框架来配合它。
我们编写了一个系统,用2个DSL编写的750行代码替换10,000行通用Java代码,并用Java粘合在一起。我们在原系统的1/10时间写了它,包括DSL学习时间。
答案 6 :(得分:2)
我最近的4个职位是应用程序:
(这甚至不算SQL,JS,OQL等)
根据我的经验,这种转变恰恰相反:更多的语言。原因包括:
这些都是付费项目,BTW。在我的个人项目中,我总是使用单一语言。简单性超过了能够快速提取包并将其与我的项目集成的好处。
答案 7 :(得分:2)
“那么,经过这么多年,是什么阻止我们编写多语言应用程序?”
可能会发现语言A中的代码与语言B中的代码有太多的问题。字节对齐,字节顺序,参数顺序等等。覆盖所有的问题,以便您可以在晚上睡觉需要时间
.NET尝试解决这些问题,但我不确定它有多好。那是另一个讨论。
答案 8 :(得分:1)
一种情况是库或其他固定代码与应用程序使用不同的语言。很多这些东西都是用C语言编写的,现在很多应用程序都不是用C语言编写的。数字内容通常是用Fortran编写的(在研究生院,我必须将Fortran例程与Common Lisp应用程序连接起来)。
如果您已经编写了重要的部分,那么使用其他语言比重写和验证其他人的代码要容易得多。
答案 9 :(得分:1)
Devs一直担心性能,比如优化C ++中的虚方法调用或Java的字节码运行时编译,因为发明了汇编程序。它本质上是质疑任何不明显的东西。
答案 10 :(得分:1)
我在最近的项目中使用了C和Lua(或C ++和Lua)的混合体。我觉得让两种语言与不同的利弊进行平衡是很自由的。 Lua代码主要被编译(烘焙)到同一个exe中,因此最终结果只是一个二进制文件。
有关调试此问题的困难以及对所有问题的理解的评论是有效的。但它确实将源行数保持在较低水平。
Apple的Objective-C几乎采用相同的“汞合金”方法,但逐行转换思维模式。我发现那个困难。 Lua和C(++)允许我按源文件切换思维模式。
答案 11 :(得分:1)
是什么让你觉得这没有发生?
我的ASP.NET MVC应用程序有一些C#,一些VB.NET和一些JavaScript。我可以很容易地输入一些Python和F#,但是没有发现需要走那么远。
答案 12 :(得分:0)
我不确定原因是什么,但我认为这与我们在90年代末开始的“语言 - du-jour”心态有很大关系。我即将开始一个令人抓狂的项目,我想用C ++编写,但我希望有许多其他语言版本。我可能会使用Swig和SpiderMonkey的组合。
但其中很多真正归结为没有人创建缺少.DLL的统一对象/重用接口。 COM在Windows上很棒。 IDispatch使任何使用IDispatch的东西都可用。用C ++编写我们的组件并在ASP中使用它们来自VBScript是很棒的。但是没有任何类似的东西可以携带。当然,尝试通过CORBA和其他六种半生不熟的技术进行尝试 - 但它们都有数据编组问题,调用问题,性能问题和字符串问题。没有人真正花时间尝试解决它,现在这个行业正朝着SOAP发展,取而代之的是性能不计算的地方(并坚持CORBA的地方)。
答案 13 :(得分:0)
即使作为一名初学程序员,我发现自己需要在C代码中使用一些汇编语言来加快速度。 (这是用于使用相当慢的处理器板来跟踪摄像机馈送的线路)
我建议如果有人用某种语言写作,那么他们可能对这种语言最满意。需要极其令人信服的理由来使用他们可能不太习惯的语言。
据我了解,许多游戏开发人员将使用程序集来处理关键数学库。
答案 14 :(得分:0)
我认为其中很大一部分原因是因为没有令人信服的理由这样做。如果一种语言具有足够强大的功能(例如,面向对象),那么它可能足以引起整个项目的使用。 BITD,过去是你用汇编语言重新编写代码的一部分,如果它不够快,或者编写适配器以便你可以从C调用FORTRAN统计软件包。现在,没有太大的压力要做到这一点。许多性能问题在代码中是不可修复的(例如,网络延迟),并且提供软件组件的大多数公司以几种“风格”(例如,Java jar文件或.NET组件)提供它们。正如其他人所提到的那样,许多开发人员之间也存在大量的惯性,这些惯性倾向于使他们不能学习新语言,特别是如果它不同的话。当然,如果一个语言不是不同,那么可能没有任何令人信服的理由来学习它。
答案 15 :(得分:0)
我们经常用多种语言写作。这取决于手头的任务。在最近的一个Web应用程序中,我用PHP编写了Web框架,客户端用JavaScript编写,后端引擎和Delphi中的PHP插件以及MS-SQL中的数据库。
目前我在一个环境中工作,我们在Delphi中执行快速原型设计,然后发送到生产部门进行MS C#编码。该公司还聘用了多种其他语言。
几年前,我参与了一个使用8种不同语言的项目。这是一个正确的混乱,但仍然大规模支持。
所以我真的不同意Kelly French提出的我们没有使用多种语言的提议。您只需将应用程序扩展到数据库或Web服务中,就可以将自己混淆起来。没有一种语言可以做到这一切。如果有,我会在星期天使用它并参加它的教堂。
答案 16 :(得分:0)
在我的家庭项目中,我从C调用Fortran过程,或从C ++调用C过程。
在我的工作代码中,我们将Java与一些C混合。
它仍然存在,但人们试图避免它,原因很充分。
答案 17 :(得分:0)
略有不同的方面:
在20世纪80年代,几乎没有能够提供全方位功能的语言。业务应用程序可以用COBOL编写,但如果它需要复杂的数字例程,则可以用FORTRAN编写,定制的Assembler用于管理从COBOL到FORTRAN的函数调用。如今,语言和相关库有多种选择,可以用一种语言提供整个功能。
对计算机容量(CPU,内存,磁盘,I / O速度)的严格限制也导致需要为程序或系统的不同部分使用不同的语言。
答案 18 :(得分:0)
我认为,在解释器/编译器中包含多语言支持有两个主要原因:
今天很少见到第一个,主要是由于使用共享库(如dll)和增加抽象(代码和下面的程序集之间的抽象层非常厚),而第二个主要是营销事物和营销通常不是编写语言规范的人的主要兴趣(.Net是现在想到的第一个例外)。
答案 19 :(得分:0)
使用多种语言会使重构变得更加困难和昂贵。因为当这些类用不同语言编写时,将方法从一个类移动到另一个类的操作要困难得多。
答案 20 :(得分:0)
我会说比你想象的更多的应用程序是使用多种语言编写的。举个例子:
答案 21 :(得分:0)
这主要是一个管理问题。答案更多地源于经济学而不是技术性。简单的说,它更昂贵。您可以想象所有难以管理的困难,包括调试,重构,开发人员更换等等。
答案 22 :(得分:0)
对于许多类应用程序,根本不需要“经典”多语言项目(涉及高级语言和低级语言),并且额外的复杂性成本非常高:
答案 23 :(得分:0)
我在python中编写,从C调用,使用SQL查询其数据库,使用HTTP执行其I / O,提供使用TEI描述的文档,使用XSLT转换它们,使用HTML在客户端呈现其输出和CSS,以特殊的模板语言格式化其非文档输出,并使用javascript为其用户界面添加功能。
您可能已经注意到,这是一个相当通用的Web应用程序(TEI除外)。如今,你所谈论的技术很荒谬。动机并不总是优化代码的速度敏感部分,但技术肯定在那里。