非 Windows 世界中的 COM?

2024-03-29

希望这个问题不会太含糊。通读 COM 规范和 Don Box 的 Essential COM 书,有很多关于“COM 解决的问题”的讨论 - 它们听起来都很重要、相关且重要。current https://stackoverflow.com/questions/19470053/component-object-model.

那么 COM 解决的问题在其他系统(linux、unix、OSX、android)上是如何处理的呢?我在想这样的事情:

  • 跨编译器和编译器版本的二进制兼容性
  • 二进制组件重用
  • 编译应用程序,使其具有运行时依赖项而不是加载时依赖项(以便即使缺少依赖项也能运行)
  • 通过图书馆自己的语言以外的语言访问图书馆功能
  • 对加载到不同进程的地址空间中的组件进行相当低开销的远程过程调用
  • 等等(我确信这个清单还在继续)

我基本上只是想理解为什么在 Linux 上 CORBA 不像 Windows 上的 COM 那样(如果这有意义的话)。 Linux 上的软件开发是否遵循与 COM 提出的基于组件的模型不同的理念?

最后,COM 是 C/C++ 的东西吗?我多次看到有人评论说 COM 已被 .NET 变得“过时”,但并没有真正解释他们的意思。


在本文的其余部分中,我将使用 Linux 作为开源软件的示例。在我提到“Linux”的地方,它主要是一种简短/简单的方式来指代一般的开源软件,而不是特定于 Linux 的任何东西。

COM 与 .NET

COM 实际上并不局限于 C 和 C++,.NET 实际上也没有取代 COM。然而,在某些情况下,.NET 确实提供了 COM 的替代方案。 COM 的一种常见用途是提供控件(ActiveX 控件)。 .NET 提供/支持自己的控件协议,允许某人用一种 .NET 语言编写控件,并使用任何其他 .NET 语言的该控件 - 或多或少与 COM 在 .NET 之外提供的东西相同。世界。

同样,.NET 提供 Windows Communication Foundation (WCF)。 WCF 实现了 SOAP(简单对象访问协议)——一开始它可能很简单,但后来发展到最不简单的程度。无论如何,WCF 提供了许多与 COM 相同的功能。尽管 WCF 本身特定于 .NET,但它实现了 SOAP,并且使用 WCF 构建的 SOAP 服务器可以与不使用 WCF 实现的服务器进行通信(反之亦然)。既然您提到了开销,那么可能值得一提的是,WCF/SOAP 往往会比 COM 增加更多的开销(我在任何地方都看到过几乎等于大约两倍的开销,具体取决于具体情况)。

要求差异

对于Linux,前两点往往相关性相对较低。大多数软件都是开源的,并且许多用户无论如何都习惯于从源代码构建。对于此类用户来说,二进制兼容性/重用影响很小或根本没有影响(事实上,相当多的用户可能会拒绝所有不以源代码形式分发的软件)。尽管二进制文件通常是分布式的(例如,使用 apt-get、yum 等),但它们基本上只是缓存为特定系统构建的二进制文件。也就是说,在 Windows 上,您可能有一个二进制文件可用于从 Windows XP 到 Windows 10 的任何操作系统,但如果您在 Ubuntu 18.02 上使用 apt-get,那么您正在安装专门为 Ubuntu 18.02 构建的二进制文件,而不是尝试与 Ubuntu 10(或其他)的所有内容兼容。

当组件丢失时能够加载和运行(功能减少)也是最常见的闭源问题。闭源软件通常有多个版本,具有不同的功能以支持不同的价格。对于供应商来说,能够构建主应用程序的一个版本,并根据提供/省略的其他组件提供不同级别的功能是很方便的。

但这主要是为了支持不同的价格水平。当软件免费时,只有一种价格和一种版本:很棒的版本 http://www.codinghorror.com/blog/2009/07/oh-you-wanted-awesome-edition.html.

语言之间对库功能的访问往往更多地基于源代码而不是二进制接口,例如使用SWIG http://www.swig.org/允许使用 Python 和 Ruby 等语言的 C 或 C++ 源代码。同样,COM 基本上解决了主要由于缺乏源代码而引起的问题;当使用开源软件时,问题根本就不会出现。

在其他进程中进行编码的低开销 RPC 似乎主要源于闭源软件。当/如果您希望 Microsoft Excel 能够使用 Adob​​e Photoshop 等内部“东西”时,您可以使用 COM 让它们进行通信。这增加了运行时开销and额外的复杂性,但是当其中一段代码由 Microsoft 所有,另一段由 Adob​​e 所有时,这几乎就是您所面临的困境。

源代码级共享

然而,在开源软件中,如果项目 A 具有某些在项目 B 中有用的功能,那么您可能看到(至多)项目 A 的一个分支,将该功能转换为一个库,然后将其链接到两个项目项目 A 的其余部分并进入项目 B,很可能还有项目 C、D 和 E——所有这些都不会增加 COM、跨过程 RPC 等的开销。

现在,请不要误会我的意思:我并不是想充当开源软件的代言人,也不是说闭源很糟糕,而开源总是非常优越。我什么am据说COM主要是在二进制级别定义的,但是对于开源软件,人们倾向于更多地处理源代码。

当然,SWIG 只是支持源代码级别跨语言开发的多种工具之一。虽然 SWIG 被广泛使用,但 COM 在一个相当关键的方面与它不同:使用 COM,您可以用单一的中性语言定义一个接口,然后生成一组适合该接口的语言绑定(代理和存根)。这与 SWIG 相当不同,在 SWIG 中,您直接从一种源语言匹配到一种目标语言(例如,绑定以使用 Python 中的 C 库)。

二进制通信

在某些情况下,至少拥有一些与 COM 提供的功能类似的功能仍然很有用。这些导致了开源系统在很大程度上类似于 COM。例如,许多开源桌面环境使用/实现 D-bus。 COM 主要是一种 RPC 类型的东西,而 D-bus 主要是一种在组件之间发送消息的商定方式。

然而,D-bus 确实指定了它称为对象的东西。它的对象可以有方法,您可以向其发送信号。尽管 D-bus 本身主要根据消息传递协议来定义这一点,但编写代理对象使得调用远程对象上的方法看起来非常像调用本地对象上的方法是相当简单的。最大的区别是 COM 有一个“编译器”,它可以采用协议规范,并自动为您生成这些代理(以及远端的相应存根以接收消息,并根据消息调用适当的函数)已收到)。这不是 D-bus 本身的一部分,但人们已经编写了工具来获取(例如)接口规范并根据该规范自动生成代理/存根。

因此,尽管两者并不完全相同,但 D-bus 具有足够的相似性,可以(并且经常)用于许多与 COM 相同的事物。

类似于 DCOM 的系统

COM还允许您使用DCOM(分布式COM)构建分布式系统。也就是说,您在一台计算机上调用一个方法,但(至少可能)在另一台计算机上执行该调用的方法的系统。这会增加更多的开销,但由于(正如上面针对 D-bus 所指出的)RPC 基本上是与连接到末端的代理/存根进行通信,因此以分布式方式执行相同的操作非常容易。然而,开销的差异往往会导致系统需要如何设计才能正常工作方面存在差异,因此对于分布式系统使用与本地系统完全相同的系统的实际优势往往相当小。

因此,开源世界提供了用于执行分布式 RPC 的工具,但通常不会努力使它们看起来与非分布式系统相同。 CORBA 众所周知,但通常被视为庞大且复杂,因此(至少根据我的经验)当前的使用相当少。阿帕奇节俭 http://thrift.apache.org/提供一些相同的通用类型的功能,但以一种更简单、更轻量的方式。特别是,当 CORBA 试图为分布式计算提供一整套工具(包括从身份验证到分布式计时的所有工具)时,Thrift 更紧密地遵循 Unix 哲学,试图准确满足一个需求:从接口定义(用中性语言编写)。如果你want使用 Thrift 做那些类似 CORBA 的事情,您毫无疑问可以,但是在构建调用者和被调用者相互信任的内部基础设施的更典型的情况下,您可以避免大量开销并继续处理手头的业务。同样地,谷歌远程过程调用 https://grpc.io/提供与 Thrift 大致相同类型的功能。

OS X 特定

可可提供分布式对象 https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/DistrObjects/Concepts/AboutDistributedObjects.html与 COM 非常相似。不过,这是基于 Objective-C 的,我相信它现在已被弃用。

苹果还提供XPC https://developer.apple.com/documentation/xpc。与 RPC 相比,XPC 更多的是关于进程间通信,因此我认为它更直接地与 D-bus 相比较,而不是与 COM 相比较。但是,很像 D-bus,它具有许多与 COM 相同的基本功能,但形式不同,更强调通信,而不是让事情看起来像本地函数调用(无论如何,许多人现在更喜欢消息传递而不是 RPC) )。

Summary

开源软件的设计中有足够多的不同因素,因此对提供与 Microsoft COM 在 Windows 上提供的功能相同的组合的需求较少。 COM 在很大程度上是一个试图满足所有需求的单一工具。在开源世界中,人们不太愿意提供单一的、包罗万象的解决方案,而更倾向于提供一套工具,每个工具都能很好地完成一件事,然后可以将它们组合成一个满足特定需求的解决方案。

由于更加商业化,Apple OS X 可能(至少可以说)比大多数更纯粹的开源世界更接近 COM。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

非 Windows 世界中的 COM? 的相关文章

随机推荐

  • 1-2 秒后暂停 YouTube 视频

    我正在使用 Youtube Player api 在我的应用程序中播放 YouTube 视频 视频开始播放并在 1 2 秒后暂停 我创建了视频片段和视图组 随后我创建了一些 youtobe 视频视图 视频片段 public static f
  • OpenCV 中 minEnclosureCircle 的意外结果

    我最近使用了 OpenCV 2 4 2 的函数 minEnendingCircle 因为我需要测量一团点的直径 一段时间后 我意识到结果不正确 因此我决定编写一个小例程来计算一组非常小的点的直径 我测试了该函数 1个单点 连续2 4分 仅由
  • 保留一个新对象而无需获取关联

    我在广告实体中有以下映射 class Ad Id Column name id unique true nullable false GeneratedValue strategy GenerationType SEQUENCE gener
  • 实现 ActiveRecord before_find

    我正在使用缓存在表中的关键字构建搜索 在表中查找用户输入的关键字之前 它会被标准化 例如 删除了一些标点符号 如 并对大小写进行了标准化 然后使用规范化的关键字来查找获取搜索结果 我目前正在使用 before filter 处理控制器中的标
  • 导入 React-Router-Dom 后 React App 变为空白

    导入前react router一切正常 现在它构建成功但显示空白页面 这是我的代码 App js import ReactDOM from react dom client import BrowserRouter Routes Route
  • 如何调查 imp.load_module 上的 python2 段错误

    我正在尝试安装和使用dolfin https aur archlinux org packages dolfin bzr 在 Arch Linux 上 使用 Python 2 7 3 找出导致分段的原因的最佳方法是什么 诸如此类的故障 py
  • 无法获取在Firebase存储中上传的图像的实际下载网址[重复]

    这个问题在这里已经有答案了 我正在尝试获取上传到 firebase 数据库的图像的下载网址 但任务Uri imageURL storageReference getDownloadUrl 没有给出存储在 firebase 存储中的图像的实际
  • 实体框架 4 Single() vs First() vs FirstOrDefault()

    我花了很长时间寻找查询单个项目的不同方法的比较 以及何时使用每种方法 有谁有一个比较所有这些的链接 或者一个关于为什么你会使用其中一个而不是另一个的快速解释 还有更多我不知道的运营商吗 谢谢 以下是不同方法的概述 Find 当您想通过主键获
  • 如何对 Flask 应用程序进行守护进程?

    我有一个使用 Flask 用 Python 编写的小应用程序 现在我正在 nohup 下运行它 但我想将它守护进程化 这样做的正确方法是什么 部署 Flask 项目有多种方式 http flask pocoo org docs deploy
  • 在 Mac OS X Lion 上设置环境变量

    当有人说 编辑你的 plist 文件 或 你的 profile 或 bash profile 等时 这让我很困惑 我不知道这些文件在哪里 如果必须这样做的话如何创建它们等等 也不知道为什么似乎有这么多不同的文件 为什么 它们做不同的事情吗
  • 实现 PushKit 并测试开发行为

    我想在我的应用程序 Voip 应用程序 中实现 PushKit 服务 但我有以下疑问 我看到我只能生成生产 voip 证书 如果我尝试在开发设备上测试 voip 推送通知服务 它可以工作吗 这是我的实施测试 通过这 3 行代码 我可以在 d
  • 将 Shapes.Path 项目绑定到 ItemsControl

    我一直在试图弄清楚如何绑定ObservableCollection
  • 超越比较忽略所有文件中不重要的差异

    我正在使用Beyond Compare 3 3 4 我想比较大量文件并忽略不重要的差异 In Session gt Session Settings gt Comparison tab 需要打开文件 部分有一个 比较内容 基于规则的比较 当
  • IE 11 中的 VueJS - 的模板包装器不工作,但在 Edge 和 Chrome 中工作

    这是在 IE 11 中使用 Vue 2 5 16 假设datasetapp data 中的数组 以下内容在 Chrome 中运行良好 并且代码已简化 tbody tbody
  • 如何在 iOS 应用程序中创建自定义委托

    在 iPhone 中 每个 UIContrrol 都有预定义的委托方法 但是我们如何创建自己的自定义委托方法 在你的头文件中 之前 interface insert protocol YourDelegate
  • 按数组中的多个属性对对象进行分组,然后对它们的值求和

    按多个属性对数组中的元素进行分组 https codereview stackexchange com questions 37028 grouping elements in array by multiple properties是与我
  • React-Native-Table-Component 冻结可滚动表中的第一列和第一行

    期望状态 我正在使用react native table component 这是一个在 React Native 中渲染表格的基本组件 我需要冻结表中的第一列和第一行 以便滚动时它们保持在视图中 具体来说 我需要在水平滚动时第一列保持固定
  • gradle 1.10 内部 Maven 存储库在 intellij 13 中永远索引

    我有两个项目 一个 Maven 和一个 Gradle 该公司还有一个内部 Maven 存储库 我正在尝试设置 Gradle 以使用内部存储库 使用 Intellij 13 当我将像这样的存储库添加到 build gradle 中的 Grad
  • Maven 依赖项:树未显示所有传递依赖项

    我无法理解该人的行为依赖 树输出 当在更高的模块上运行插件时 我丢失了它所依赖的模块的重要信息 但是当我在较低的模块上运行插件时 我可以看到依赖项 这是一个显示问题的示例 名称已更改 mvn pl foo bar application d
  • 非 Windows 世界中的 COM?

    希望这个问题不会太含糊 通读 COM 规范和 Don Box 的 Essential COM 书 有很多关于 COM 解决的问题 的讨论 它们听起来都很重要 相关且重要 current https stackoverflow com que