一些应用程序是如何用几种编程语言制作的



一些(web、桌面)应用程序是如何用几种编程语言制作的,这一直是我的一个问题。例如,我听说(或读到)一些应用程序,如firefox、photoshop甚至amazon.com(当然是逻辑代码)都是用C++编写的,或者应用程序的核心是C++。说到这里,我想知道程序员如何集成一些编程语言或用这些语言或模块编写的模块来构建一个完整的应用程序?这个想法到底是什么?

提前感谢

用不同的技术或语言构建应用程序的不同部分可能是有意义的。其中一些原因可能是:

  • 特定组件的性能要求;因此,当其他组件从高级语言中受益更多时,可以使用低级语言,从而提高开发人员的生产力
  • "最适合这份工作的工具"——呈现表格的技术堆栈可能不适合处理数字
  • 迁移遗留应用程序-如果你有一个需要迁移的大型代码库,那么迁移小部分而不是进行一次大的集成(这些集成往往会失败)是有意义的

如果您使用的是可以在同一运行时环境中运行的两种不同语言,那么组合可能很简单。例如,一个同时利用C#和F#程序集的.NET应用程序,或者一个具有在.中链接的部件程序集代码的C应用程序

然而,对于今天的大型应用程序,最常见的情况是通过服务或消息总线技术连接软件组件;将数据和事件从一个组件移动到另一个组件。进程外通信也可以像两个组件共享数据库或文件一样简单。

回答如何:

最终,所有编译的语言和脚本语言都必须转换为给定机器的本机代码才能执行。

编译器编程语言在从源代码到可执行二进制文件的过程中通常会经历几个转换阶段,而二进制库就是其中的一步。

现在,如果有一个标准化的ABI(应用程序二进制接口),它可以标准化函数调用的方式(参数传递、堆栈行为等),那么就有可能编译一组不同的语言来聚合到这个ABI上,并让链接器将它们链接起来,以生成一个可执行的二进制文件,该二进制文件最初是由不同语言的混合而成的。

然而,您不能在给定的平台上只选择一组不同的语言。为了支持这个方案,需要有一个前端编译器在这个公共后端上收敛。

脚本语言也可能与编译语言有所谓的"绑定",允许它们以同样的方式集成,但在运行时。

Firefox和Photoshop具有语言绑定,并具有允许使用其他语言的各种运行时插件。在这些情况下,可扩展性和易开发性更好,并允许进行第三方添加。

例如:

  • Lua绑定
  • avascript绑定

亚马逊的另一个例子是,混合语言允许用在特定领域更有意义的语言编写系统的分布式部分。这部分需要很大的速度吗?C++是不是没有太多的逻辑,但你会招致很多回拨?NodeJS。在其他语言中,有很多问题可以比只使用Java或C++更容易、更快地解决。

如何做到这一点的示例:

  • 消息传递
  • 数据库
  • RPC调用
  • 远程API

如果你在C++中工作,你很可能一直在使用用不同语言编写的程序。为了提高速度,标准库中的许多函数(如operator new)都是用Assmebly语言实现的。

@driis已经解决了用不同语言编写的组件可以相互作用的两种主要方式。至少还有一个。

单个应用程序可以由用不同语言编写的多个组件组成。例如,我工作的一个程序的部分用C++编写,其他部分用Assembly编写。我曾经编写过用FORTRAN+C编写的程序,甚至VB和C++(Ick,不好玩)。

这个想法在概念上很简单。您所需要做的就是确保一方知道另一方的函数在内存中的位置,并且双方对调用使用相同的调用约定。

调用约定是关于将哪些顺序参数和返回地址推送到堆栈以及其他类似内容的协议。

获取函数的地址可能是一件轻而易举的事,也可能是一场噩梦。例如,在Windows C++DLL中,这很容易。只要链接到.lib就可以了。让VB调用C或C++函数有点麻烦,因为VB不知道如何使用这些.lib文件——至少以前没有。你必须做一些棘手的事情,比如这里发布的内容。您必须直接加载DLL,然后为函数的地址分配一个指针。

我会让我的答案变得简单。

考虑一个web应用程序。它通常是用HTML、Javascript、CSS和PHP编写的。其中也可能使用SQL。

我假设您不需要我给出这种极其常见的场景的代码示例,而是让您思考考虑这种场景如何回答您的问题。:)

最新更新