CORBA 应用程序必须以与 ORB 相同的语言实现吗?

Posted

技术标签:

【中文标题】CORBA 应用程序必须以与 ORB 相同的语言实现吗?【英文标题】:Must a CORBA application be implemented in the same language as the ORB? 【发布时间】:2012-01-25 13:12:18 【问题描述】:

我知道 CORBA 允许以不同的编程语言实现多个对象,甚至可以在不同的计算节点上运行。但是,这是否也需要用两种不同语言编写的两个不同 ORB?

示例:节点 A 运行 Java 应用程序 J1,而节点 B 运行 C++ 应用程序 C1。我是否必须为节点 A 获取一个“Java ORB”,为节点 B 获取一个“C++ ORB”,或者所有/部分 ORB 是否可以与以任何语言编写且存在 IDL 映射的应用程序交互?

如果有人可以将我链接到明确说明这一点的来源,我将特别感激,因为我想引用它。我找到的最接近的是 "the way a programmer manipulates a struct or union, makes a remote call using a proxy or implements an interface with a servant class is exactly the same across all C++ CORBA products, is exactly the same across all Java CORBA products, and so on" 。这让我觉得我需要两个 ORB,但不够明确。我基本上想知道我是否可以说“由于 ORB 是用 C++ 编写的,因此应用程序程序员也被限制使用 C++”。

谢谢

【问题讨论】:

让我试着用一个具体的例子来澄清一点:“ACE ORB (TAO) is a is a is a CORBA V3.0 compatible, C++ ORB”link 这是否意味着我有如果使用 TAO,用 C++ 编写我的应用程序? 是的,就是这个意思。但是,它可以通过标准协议 IIOP(以及其他)以任何其他编程语言与任何其他 ORB 进行远程通信。 谢谢大家的帮助!共识似乎是应用程序需要* ORB 以提供应用程序实现所用语言的 API。通常,ORB 只会以它本身实现的编程语言提供 API,但没有什么可以阻止的它将其核心库链接到其他语言的 API。 *此外,还可以利用应用程序语言的任何语言嵌入功能,例如,从 Python 调用 C++ 或从 Java 调用 C。 【参考方案1】:

没有。 CORBA 的重点在于它完全解耦了组件。

显然,您的应用程序需要使用可以与之交互的客户端库。您的 ORB 可能只为一种语言提供绑定,在这种情况下,您需要找到其他绑定,或找到与它们互操作的方法(例如,如果使用 Python,您仍然可以根据需要使用 C++ 库)。

尝试实际使用该技术。

【讨论】:

呃,但是 Java 程序仍然必须有一个 ORB 的“视图”,用 Java 实现,对吧? @DiegoSevilla:我不明白你的意思。每个程序都需要有适当的 corba 客户端库才能与 corba 系统一起工作。 你和@DiegoSevilla 似乎不同意。我在原始问题中添加的评论是否会改变您的答案,还是说“C++ ORB”也可以在 Java 中提供客户端库/API? @Vidar:我坚持我的回答。 ORB 必须为应用程序选择使用的语言实现的应用程序提供绑定和 API,但底层 (对应用程序隐藏)可以写在任何东西上。通常,ORB 供应商最容易匹配它们(例如,通过在 Java 库上提供 Java API),但他们可以用不同的语言实现核心。例如,如果 ORB 供应商使用 JNI 桥接它们,则 C++ ORB 库可以在 Java API 下正常工作。就应用程序而言,他们正在调用 Java API。谁在乎它是如何实现的?【参考方案2】:

用哪种语言实现 ORB 并不重要,重要的是它提供了哪种语言绑定。对于语言 L,您需要为语言 L 提供绑定的 orb。通常,orb 只是为编写自己的语言提供绑定,但它们也可以为其他一些语言提供绑定。

【讨论】:

【参考方案3】:

在实现 CORBA 应用程序时可以使用多种方法,但总而言之,是的,ORB 基础架构必须使用与您的应用程序实现相同的语言。

在 Java 和 C++ 中,IDL 编译器都会生成 stubsskeleton,它们充当网络和程序之间的粘合剂。您提供 CORBA 对象的实现,通常继承自 IDL 编译器生成的类(骨架)。骨架以某种方式从客户端获取请求,然后调用您的实现。同样的情况在客户端反过来发生。

然后,骨架和存根都使用 ORB 提供的机制来远程调用服务器并回复响应,甚至包括在客户端和服务器位于不同机器时建立网络连接。这种“魔法”由 ORB 实现,并且必须以库、函数集等形式存在于您的程序中,存根和框架将使用这些形式完成工作。

因此,每个程序都必须具有某种 ORB 表示形式,才能与其他机器中的其他 CORBA 客户端和服务器进行交互。

但是,从逻辑的角度来看,ORB 被视为一个层,它实际上无缝地连接客户端和服务器,因此,即使 C++ 应用程序有一些用 C++ 编写的 ORB 实现,而 Java 实现也有一个用 Java 编写的 ORB,借助标准协议(GIOP、IIOP)的魔力,它们可以毫无问题地相互通信。

【讨论】:

我将重新表述关键点以检查我的理解:客户端程序将 ORB 视为使用与其自身相同的语言表达的 API。而且 ORB 仅以它本身实现的语言提供这样的 API。 这是正确的,因此您需要在与您的应用程序相同的地址空间(以及语言)中使用所谓的“ORB”(ORB API 和功能的实现)。 好吧,orb 可以用一种语言实现,并为更多其他语言提供绑定。 Davorin:当然,有很多例子:)

以上是关于CORBA 应用程序必须以与 ORB 相同的语言实现吗?的主要内容,如果未能解决你的问题,请参考以下文章

CORBA ORB 运行时定义本地 IP 接口使用

如何在 Java 上实现 CORBA AMI

CORBA 错误:方法中的 ORB 初始化

org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService") 上的错误;

CORBA orb.resolve_initial_references("ORBPolicyManager");不工作

如何更改标准JDK corba ORB线程池的线程名称