甚至在20年前,也可以调用用一种语言编写的代码来调用另一种语言编写的代码; 在学校,我们从Ada代码中调用汇编图形例程进行一个类赋值.值得注意的例外是从脚本中运行编译代码或从编译代码中执行系统命令; 但很少我们用C++编写库以在我们的Java应用程序中使用.当Java第一次出现并且它仍然很慢时,可以选择用Java编写主应用程序并将瓶颈代码移动到使用JNI调用的某些C/C++ DLL中.
那么,经过这么多年,是什么阻止我们编写多语言应用程序?我想到的主要场景是,当一种语言被认为是一个很好的选择时,如果它不是因为某些性能瓶颈(比如在早期的Java时代),所以它完全用C语言编写,而不是使用两种语言的混合.
我从架构角度和语言设计中对此感兴趣.你有什么好的例子,成功的故事或报价吗?
[编辑]最好的例子之一是对Java的反对,因为它在早期的性能很慢.尽管JIT编译器已经解决了这个问题,但我的问题始终是用一种语言编写软件,使其更易于编写,读取和维护.如果存在瓶颈,请在程序集或C中编写例程以解决瓶颈问题.这样你至少在理论上应该得到两全其美.
使用多种语言涉及:
更多样化的技能组合,并非每个人都能解决系统中的任何问题
根据所涉及的语言,跨语言调用通常会有些痛苦.(你的JNI例子在这里很好 - 这是令人讨厌的IME .P/Invoke更简单.)
调试通常比较困难
一个更复杂的构建系统(例如,使用Java可以获得可移植性 - 但是如果你有一个本地库来构建和部署,那么生活会变得更难......)
是的,它有时是值得的 - 但是在我有一个非常好的理由之前我不会这样做.
当然,.NET和Java都使这变得容易多了 - 在一个平台上使用不同语言比在托管和本机代码之间进行互操作要容易得多.
我看到的最大问题是因为它要求团队中的每个人都非常多样化(参见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所没有的东西.真的,这是所有个人喜好,但你明白了.
人们一直在编写多语言应用程序.您提到了从脚本语言调用的编译代码.这种情况经常发生,例如来自Python,Perl,Lua或R的C++或来自Groovy的Java.不确定从Java调用C++的频率,但我确信它也会发生.
这就是为什么swig如此受欢迎的原因.