Architecture 为什么不';有更多的应用程序是用多种语言编写的吗?

Architecture 为什么不';有更多的应用程序是用多种语言编写的吗?,architecture,programming-languages,Architecture,Programming Languages,即使在20年前,调用一种语言编写的代码也可以调用另一种语言编写的代码;在学校里,我们从Ada代码中为一个课堂作业调用汇编图形例程。值得注意的例外是从脚本中运行编译代码或从编译代码中执行系统命令;但是我们很少在C++中编写一个库来在java应用程序中使用。当Java第一次出现时,它仍然很慢,可以选择用Java编写主应用程序,并将瓶颈代码移动到一些C/C++dll中,以便使用JNI调用 那么,这么多年来,是什么阻止我们编写多语言应用程序呢?我想到的主要场景是,如果一种语言不是因为某些性能瓶颈(如早期

即使在20年前,调用一种语言编写的代码也可以调用另一种语言编写的代码;在学校里,我们从Ada代码中为一个课堂作业调用汇编图形例程。值得注意的例外是从脚本中运行编译代码或从编译代码中执行系统命令;但是我们很少在C++中编写一个库来在java应用程序中使用。当Java第一次出现时,它仍然很慢,可以选择用Java编写主应用程序,并将瓶颈代码移动到一些C/C++dll中,以便使用JNI调用


那么,这么多年来,是什么阻止我们编写多语言应用程序呢?我想到的主要场景是,如果一种语言不是因为某些性能瓶颈(如早期的Java时代)而被认为是一个不错的选择,那么它完全是用C语言编写的,而不是使用这两种语言的混合

我从架构的角度以及语言设计的角度对此感兴趣。你有什么好的例子、成功的故事或引语吗

[编辑] 其中一个最好的例子就是对Java的强烈反对,因为它早期的性能很慢。尽管JIT编译器已经解决了这个问题,但我的问题始终是如何用一种更易于编写、阅读和维护的语言编写软件。如果有瓶颈,就用汇编或C语言为瓶颈编写一个例程。这样你就应该两全其美,至少在理论上是这样

“那么,这么多年来,是什么阻止我们编写多语言应用程序?”

从语言B中的代码中调用语言A中的代码可能会发现有太多的陷阱。字节对齐、尾端、参数顺序等。覆盖所有陷阱以便您可以在夜间睡觉需要时间


.NET试图解决这些问题,但我不确定效果如何。这是另一个讨论。

使用多种语言包括:

  • 更多样化的技能,不是每个人都能在系统中的任何地方解决问题
  • 根据所涉及的语言,跨语言通话通常会带来一些痛苦。(您的JNI示例在这里很好——这是一个令人讨厌的IME。P/Invoke要简单得多。)
  • 调试通常比较困难
  • 一个更复杂的构建系统(例如,使用Java,您可以获得可移植性——但是如果您也有一个本机库来构建和部署,那么生活就会变得更困难……)
是的,有时候这是值得的,但我不会这样做,直到我有一个真正好的理由


当然,.NET和Java都让这变得容易多了——在一个平台上使用不同的语言比在(比如)托管代码和本机代码之间进行互操作要容易多了。

什么让你认为这不会发生


我的ASP.NET MVC应用程序有一些C#、一些VB.NET和一些JavaScript。我可以很容易地加入一些Python和F#,但还没有发现有必要这么做。

在我看来,在解释器/编译器中包含多语言支持有两个主要原因:

  • 在性能对应用至关重要的罕见情况下,允许开发人员在汇编中编写函数
  • 为便于向熟悉其他语言的开发人员介绍新语言

第一个是现在很少见到的,主要是由于使用了共享库(如DLL)和增加了抽象性(代码和下面的程序集之间的抽象层相当厚),而第二个主要是营销,营销通常不是编写语言规范的人的主要兴趣(.NET是目前第一个出现的例外)。

< P>人们总是写多语言应用程序。你提到的是从脚本语言调用的编译代码。这种情况经常发生,例如来自Python、Perl、Lua或R的C++或Groovy的java。不确定C++从java调用的频率,但我确信它也会发生。


这就是为什么它如此受欢迎。

一个稍微不同的方面:

在20世纪80年代,很少有语言能够实现全方位的功能。业务应用程序可以用COBOL编写,但如果需要复杂的数值例程,则可以用FORTRAN编写,并使用定制的汇编程序来管理从COBOL到FORTRAN的函数调用。如今,有多种语言可供选择可以用一种语言提供全部功能的nd关联库


计算机容量(CPU、内存、磁盘、I/O速度)的严重限制也导致对程序或系统的不同部分使用不同的语言。

< P>在我的家庭项目中,我从C调用FORTRAN过程,或者从C++中调用C程序。 在我的工作代码中,我们将Java与一些C混合


这种情况仍然存在,但人们出于充分的理由试图避免这种情况。

UNIX已经解决了这个问题。UNIX风格的编写小型实用程序,可以串在一起形成一个解决方案,是一种用多种语言编写应用程序的形式。而不是定义语言之间交互的接口和/或机制uages,例如JNI,命令行或shell环境已经成为事实上的标准


我想知道是因为接触了UNIX,还是因为缺乏UNIX,使得这个主题不值得努力,还是变得复杂得令人发狂。也就是说,那些有UNIX经验的人不必为JNI操心,因为他们处理设计问题的方式不同,所以他们的应用程序更具内部模块化和内聚性;更有利于将我所看到的最大的问题是,它要求团队中的每个人都非常多样化(见Jon Skeet的答案)。如果你有一个由十个人组成的团队,其中三个人非常了解C#和一些VB.NET,三个人非常了解VB.NET,很少了解C#,另一个