跨平台替代COM的方案

9
我一直钟情于基于组件的编程(无论是使用COM、其他系统还是仅在纯C++中使用该范例)。如果一个人通常使用“传统”的面向对象模型,那么这需要一点时间来适应,但它绝对是值得的。它使我的代码更易于维护和扩展。
我目前正在开发的项目使用这种范例,但没有设置系统。然而,我真的想找到一些我可以使用的系统,并具有以下要求。虽然从现在的系统转换到新系统需要一些时间,但我会节省更多的时间。
要求如下:
1.跨平台 2.快速 3.与C++良好兼容 4.支持跨进程封送
让我详细说明这些要求:
跨平台
基本上,我需要它在Windows和Mac上运行。Linux也不错,但不是必需的。此外,它确实需要为所有平台满足其他要求。有一个适用于Mac的COM,这将是理想的,但它不支持第四个要求。此外,它必须支持GCC和MSVC。
快速
这就是CORBA不幸失去的地方,尽管它满足其他三个要求。进程内方法调用需要尽可能快(理想情况下,像COM一样),因为其中一些例程也可能从音频中断调用。
与C++良好兼容
......我想这个要求大多是显而易见的。我不介意不使用C++类来实现组件,尽管这肯定会有所帮助,而且替代方案必须仍然易于使用,特别是因为最终我打算发布第三方扩展的API。
支持跨进程封送
我的意思是至少能够序列化调用。如果通过从IDL生成的代码来完成这项工作,那对我来说完全没问题,我也不介意实现跨进程通信本身。
COM很棒,但它不能完全满足第一要求。CORBA也很棒,但它不满足第二要求(即使使用最快的ORB)。XPCOM可能无法满足第二要求,并且无法与MSVC一起使用,因此也无法满足第一要求。
还有其他什么想法吗?我的下一步将是使用protobufs或类似的东西来自己开发,但当然我想避免这样做。

更详细地说,在这种情况下,音频中断可以低至2-3毫秒。那个时间甚至没有全部可用于我,因为其他组件需要在那段时间内进行处理,而我的软件本身也需要包装另一段需要在那段时间内进行处理的软件。这就是为什么无论是进程内还是跨进程的封送都需要非常快速的原因。


据我所知,XPCOM应该可以与MSVC一起使用。如果不行的话,你可以考虑使用MinGW,不是吗? - Zifre
我可以使用MinGW,但首先,我的整个工具链都是与MSVC集成的,虽然我也可以将MinGW集成到其中,但我无法使用MSVC中的出色调试器。 - Chris Walton
我认为如果你构建这个,你会赚很多钱。进程内、进程外、PC、Mac、Linux、飞快的速度。大量的金钱。 :) - JP Alioto
9个回答

3

为了最大限度地增加广度,我建议您使用 Web 服务。面向服务的方法非常接近于面向组件的方法,因为只有服务契约(接口)被公开,而不需要客户端知道服务的内部工作细节。


他的性能要求可能排除了这个选项(尽管我同意,任何类型的基于HTTP的服务都是一个不错的开始)。 - Tom
1
事实上,虽然原则上听起来不错,但要求在音频中断中运行这个程序是不可行的,很遗憾。 - Chris Walton
没有看到中断的要求。听到有一个可以处理这个的COM实现,感到惊讶。 - John Saunders
1
In-Proc COM 调用只是虚拟函数调用,因此非常快。跨进程的 COM 调用被序列化为二进制流,并使用窗口消息发送,这些消息被优化到极致(因为 Win32 基本上围绕着窗口消息)。 - Chris Walton
@arke:谢谢,我知道这些东西,而且很惊讶有一个COM的实现可以轻松地从硬件中断中进行,在内核模式下。我相信有一些Windows内核调用可以进行,但不确定是否称之为“容易”。 - John Saunders
哦,我明白你的意思了。抱歉,这是我的术语错误 - 我并不是指内核模式下的字面音频中断,而是在用户模式下触发的,通常是由ASIO驱动程序触发的。只是一些旧时代的术语遗留问题 :) - Chris Walton

3

ICE来自ZeroC http://www.zeroc.com/,是另一种选择。

对于那些CORBA老手来说,Michi Henning是当时的大师之一。他现在加入了ZeroC。它是一个开源、跨平台的系统,包括所有目标(包括Linux)。

C++只是其中一种语言,而ICE的C++绑定比CORBA的C++绑定要好得多。


2
CORBA肯定是一个答案-在基于速度的情况下排除它之前,您应该进行测试。
明确的替代方案将是XPCOM http://en.wikipedia.org/wiki/XPCOM - 缺少MSVC并不意味着不跨平台。
祝好运!

1
你能推荐一个ORB实现吗?我尝试找到一个网页来比较不同ORB的速度,看看是否有足够快的ORB,但是我没有找到。 - Chris Walton
1
如果可能的话,你真的不想使用CORBA - 相信我。 - anon
1
TAO,“ACE Orb”是一个非常受尊敬的实现,网址为http://www.cs.wustl.edu/~schmidt/TAO.html。 - sdg
如果你想要进程内速度,我认为CORBA不是一个好的选择。 - Tim

2

Qt不应该是一种选择吗?

http://qt.io

据我所知,至少可以在以下操作系统上使用它: Windows | Mac | Linux/X11 | Solaris | 嵌入式Linux | Windows嵌入式 | Green Hills Software INTEGRITY | QNX | VxWorks

在我看来,这已经很多了。


1

你为什么认为CORBA不够快?最近有进行过测量吗?

现代的CORBA实现可以在少于150微秒内进行远程调用,远低于你的2毫秒预算。现代的CORBA实现可以优化进程内调用,基本上只需要两个虚函数调用,尽管这通常需要应用程序放弃一些功能(例如拦截器)。即使在最坏的情况下,一个完整的本地调用也只需要几个查找和一些虚拟调用,我没有手头的数字,但我确定它低于50微秒。

请查看以下性能数据:

http://www.dre.vanderbilt.edu/Stats/performance.shtml


1

你说CORBA很棒,我只能假设你从未使用过它。它是一个编程噩梦,并没有提供它所声称的可移植性。我只会在现有应用程序已经实现它的情况下使用它。然而,我不会因为性能问题而放弃它 - 我从未遇到过任何CORBA实现的性能问题。


1

看看D-Bus(是的,也适用于Windows),它是各种组件框架(CORBA、Gnome Bonobo、KDE的DCOM)的现代精神继承者。

如果跨进程封送转换证明是性能问题,请考虑将重负载移至共享内存(boost.interprocess将有助于保持跨平台)。


0

看一下AF Architecture

“Af-Arch是一个完整的库和工具集,允许开发分布式系统,特别是针对业务应用程序问题而设计。”

我知道它可以在Linux和Windows上运行。我还知道它有非常快速的C API和C#绑定。


起初看起来很有吸引力,但这让我有些却步:“Af-Arch编程模型由基于BEEP核心协议的XML格式消息交换的TCP客户端-服务器系统组成。” 我担心这不能满足我的速度要求。 :/ - Chris Walton

0

我认为你应该看一下VortexLibrary

它是一个完整的BEEP实现,为开发任何对等应用程序协议提供了良好的基础。 它已经集成了身份验证(使用SASL)和安全连接(使用TLS),两者都是可选的。

Vortex还包括XML-RPC配置文件的实现,带有IDL编译器,这应该为您提供足够的基础来进行编排处理...最好的是,您可以稍后在同一会话上提供更具体的协议,以进行二进制传输而不受XML-RPC的限制。

它是用C编写的,但也适用于c ++。 目前正在运行,在Linux,Windows和MAC下进行回归测试以确保其功能。

干杯!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接