4

我可能是这里的少数人,但似乎在我的整个学术/职业生涯中,我都学过不同的语言。在此期间,语法和编程范式是重点,但我们从来没有教过如何集成使用不同语言编写的系统以及做出此决定的正确方法。

现在郑重声明,我不是在谈论规范的 Web 堆栈或更新、更性感、对 JVM 友好的语言。我想知道是否有“已知资源”可以让我了解诸如 Java 和 C++ 等绑定语言背后的决策过程。

诚然,我想到了 XML、JSON 和 XMPP 等工具。再说一次,我见过使用序列化绑定 Java 和 C++ 的系统。我不是在寻找一种万能的解决方案。我更感兴趣的是了解不同的解决方案以及我应该如何做出这样的决定。

如果这对于这个论坛来说太宽泛了,我深表歉意,但至少我没有要求人们更正或重写我拙劣的代码;)

4

5 回答 5

7

我能想到四种不同的模型:

  • 在应用程序中嵌入动态语言,该应用程序主要用更“系统”的语言编写,例如嵌入在 Java、C++ 或 C# 应用程序中的 Lua、Python 或 Javascript。这主要用于应用程序的脚本/自定义组件。这将通过以动态语言可以使用的格式公开一些主机应用程序数据类型来实现。

  • 为有性能问题的语言编写本机(或 C# 或 Java)扩展。Python 和 Ruby 有很多这样的扩展。这与上面的不同之处在于动态语言是框架。这是通过编写本机库(或其他本机库的包装器)以符合客户端语言的调用约定来实现的。在系统代码中将汇编程序与 C 混合时,这也是相同的一般结构。

  • 在不同的地址空间中运行应用程序并通过套接字或管道进行通信。在这种情况下,应用程序运行在同一台机器上只是一个巧合——它们也可以通过网络进行通信。

  • 使用共享相同平台和调用约定的多种语言开发应用程序。例如,Java 和 Scala 可以自由混合。

于 2009-08-11T06:01:43.917 回答
2

安全的解决方案是一种多进程解决方案,其中每种语言在其自己的地址空间中运行,并且它们通过套接字或其他一些多进程抽象(例如,Linda 元组)进行通信。

如果两种语言在同一个地址空间中运行,要么它们必须在一个公共运行时之上一起设计(就像 Digital 用它的 VAX VMS 系列语言做的很好,就像微软努力用它的公共语言运行时做的那样.NET)或必须“负责”。有许多语言(OCaml、Standard ML、Haskell、Lua,可能还有 Perl、Ruby)可以与 C 很好地互操作,只要它们负责。它们彼此不互操作。

通常最基本的困难是自动内存管理(“托管堆”)。某个实体必须负责决定何时可以安全地回收死物,如果两种不同的语言都决定它们应该回答这个问题,那么就会出现不同的进程。

于 2009-08-11T03:18:38.427 回答
1

Lua是一种脚本语言,可以在同一进程中与 C 很好地集成。它使用堆栈模型来桥接两种语言/运行时之间的阻抗不匹配。Lua 实现是开源的并且相对紧凑;所以它可能是学习的好人选。

D-Bus是使用 IPC 的一个例子。它可用于集成以不同语言实现的单独流程。它支持异步消息传递以及同步方法调用。有 Gtk、Qt、python 等的 D-Bus 实现......

Parrot 虚拟机是一个以语言互操作为目标的虚拟机。

另一种方法是 GLib 采用的方法(由 Gtk 使用)。从GObject 手册

GLib 使用的解决方案是使用 GType 库,该库在运行时保存对程序员操作的所有对象的描述。 然后,特殊的通用胶水代码使用这个所谓的动态类型 1库在不同的运行时域之间自动转换函数参数和函数调用约定。

于 2009-08-11T02:40:04.590 回答
1

我认为Swig是您所需要的。另请参阅页面,您可以在其中找到将 Python 与许多其他语言集成的各种工具。

于 2009-08-11T05:38:39.300 回答
0

决策过程有点分歧……

在构建系统时,您将其拆分为功能独立的子系统。对于每个子系统,理论上,您应该找出您将构建它的框架。重要的方面: * 什么框架与子系统的功能最匹配 * 您的开发人员对哪些框架感到满意 * 未来支持:如果框架供应商停止支持它会怎样(就像 MS 几乎对非托管 C++ 所做的那样) *

当系统变得异构时,是时候考虑子系统内的粘合了。这也可以被视为一个独立的子系统,并且可以建立在多个进程间通信协议上,如 MPI、管道……或自制的东西。

于 2009-08-11T08:29:04.337 回答