1

It's been always a question for me how some (web, desktop) applications are made in couple of programming languages. For example, I hear (or read) that some apps such as firefox, photoshop or even amazon.com (logical codes of course) are written in C++ or that blah-blah app core is C++. To get to the point, I wonder how a programmer(s) can integrate some programming languages or modules written in those to build an application in one piece? What exactly is the idea?

Thanks in advance,

4

5 回答 5

4

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

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

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

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

于 2012-10-09T17:40:14.260 回答
1

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

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

单个应用程序可以由用不同语言编写的多个组件组成。例如,我处理的一个程序有部分是用 C++ 编写的,而其他部分是用汇编编写的。我研究过用 FORTRAN + C 甚至 VB 和 C++ 编写的程序(Ick,不好玩)。

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

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

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

于 2012-10-09T18:05:42.197 回答
1

要回答如何:

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

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

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

但是,您不能只在给定平台上选择多种语言。为了支持这个方案,需要有一个前端编译器会聚在这个通用的后端上。

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

于 2012-10-09T17:54:28.493 回答
1

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

这方面的例子是:

  • Lua 绑定
  • 脚本绑定

Amazon 的另一个示例和混合语言允许使用在该特定领域更有意义的语言编写其系统的分布式部分。该部分是否需要很高的速度?C++。是不是有很多逻辑,但你会招致很多回电?节点JS。有很多问题可以用其他语言更容易和更快地解决,而不是坚持使用 Java 或 C++。

这是如何完成的示例:

  • 消息传递
  • 数据库
  • RPC 调用
  • 远程 API
于 2012-10-09T17:55:29.460 回答
-3

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

考虑一个 Web 应用程序。它通常用 HTML、Javascript、CSS 和 PHP 编写。其中可能还使用了 SQL。

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

于 2012-10-09T18:00:19.583 回答