【问题标题】:What is the difference between a wrapper, a binding, and a port?包装器、绑定和端口之间有什么区别?
【发布时间】:2012-01-27 12:54:30
【问题描述】:

在软件可移植性上下文中,这三个概念有什么区别?

比如我想用ncurses库,原来的ncurses库是用C写的,但是我的应用是用C++写的,然后我发现“ncurses wrapper”,“bindings to ncurses”,和“诅咒端口”。我应该使用哪一个?

各有什么优缺点?

【问题讨论】:

  • 除非您提供更多上下文,否则无法说出您在说什么。

标签: binding port wrapper portability


【解决方案1】:

wrapper 是位于其他代码之上的一段代码,用于回收其功能,但具有不同的界面。这通常意味着使用相同语言编写的界面。还应该注意的是,有时人们会说 wrapper,而他们在技术上的意思是绑定(包括我自己)。

优点:

  • 与原版语言相同
  • 包装器无需完全重写即可增强或重用功能。
  • 相对较快完成
  • 源库更改时的简单更新。您可能只需要绑定新函数,除非它们通过更改函数/类的预期输入/输出而破坏了向后兼容性。

缺点:

  • 包装整个库可能非常重复

binding 是位于其他代码之上的另一段代码,用于回收其功能,但这次绑定是用与其绑定的语言不同的语言编写的。一个值得注意的例子是 PyQt,它是 QT 的 python 绑定。

优点:

  • 将功能从另一种语言转换为您选择的语言。
  • 与端口相比相对较快
  • 需要与包装相同级别的琐碎更改 - 您可能只需要包装新函数/类,除非它们通过更改函数/类的预期输入/输出破坏了向后兼容性。

缺点:

  • 就像包装一样重复
  • 您可能会受到相当大的性能影响,尤其是任何两端都涉及解释语言的包装器

Port 是当您翻译一些代码以在不同的环境中工作时。常见的类比包括游戏,例如... XBox,后来发布到 PS3。

优点:

  • 让您有机会在发现不足之处时改进代码库
  • 您将非常熟悉代码的运行方式,而不仅仅是它的作用。

缺点:

  • 迄今为止最耗时的解决方案/需要完全重写
  • 您需要确保源库在某种语言中所需的任何功能在您的目标端口语言中都可用,否则您最终会封装所需的功能(并可能违背目的。)
  • 每次源库更新时,您都必须通过翻译它们所做的任何更改来进行更新,否则可能会落后。

【讨论】:

  • 包装器是否有显着的性能影响?我应该在性能很重要的基准应用程序中使用包装器吗?
  • 每个包装器都是“性能损失”,因为您实际上是将数据传递给另一个进程并等待它返回。好处是,如果您以更快的速度交付某些东西,则收益可能会抵消打击!想到的一个例子是用 go 编写的 Hekad 项目包括一个 lua 解释器来执行 C 正则表达式包装器....它比 go 的本机正则表达式处理程序 ATM 更快。
  • //您需要确保源库所需的任何功能在您的目标端口语言中都可用,否则您最终会包装所需的功能(并且可能会破坏目的。)//您的意思是绑定对吗?您可能需要为缺少的功能编写绑定。
【解决方案2】:

Which one should I use?

您应该使用bindings to ncurses。绑定是应用程序、库等的特定版本,它与原始版本不同,只是因为您可以将它与另一种语言一起使用。常见的例子包括 Windows 管理器(gtk+ = C,gtkmm = C++;Qt = C++,PyQt = Python;ecc.)。但是,人们经常使用 wrapper 或 port 等其他词来指代绑定,因此很容易让自己感到困惑。

【讨论】:

    猜你喜欢
    • 2012-06-12
    • 2017-04-21
    • 2020-12-21
    • 1970-01-01
    • 2019-01-21
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    • 2017-04-09
    相关资源
    最近更新 更多