人们为什么将某些库重写为多种编程语言?


13

有一些库,这些库的版本可用许多不同的编程语言编写,例如Lucene,该库是用Java(如他们所说的100%纯Java)编写的,但也具有C ++,C,Perl的版本,Ruby,Lisp和其他一些语言。我说的是这些语言的实现,而不仅仅是FFI接口。

人们为什么这样做?我可以看到一个明显的原因:当项目具有较少的依赖项时,部署和分发(也可能是开发)更加容易。但是还有别的吗?在什么情况下值得?


4
跨越执行环境的自然界限进行通信可能会非常昂贵。

1
@Thor:然而,某些语言/环境积极鼓励跨越自然边界(C是这种情况的常见示例,这是Tcl程序员中的强烈主题)。我怀疑它主要与内存(以及其他资源)管理有关;在同一过程中拥有两个内存管理器确实不是很好,特别是如果它们不是为了共存而设计的。最后,我想这取决于您做出的假设以及他们随后进行的不可接受的操作……
Donal Fellows

Answers:


16

我这样做的一些原因(就我而言,在Haskell中重写C代码):

  • 易于部署:仅一个构建链
  • 更少的依赖(以获得更多的采用)
  • 如果代码是高级语言,则更具移植性(例如,Windows)
  • 添加对在低级别C中不容易实现的并行性的支持
  • 使资源更加安全
  • 使代码更易于信任
  • 惯用的(强类型,更简单的API,更多的重用性)

19

通常,将库重新实现为特定平台的“本机”可以:

  • 简化部署和分发
  • 更容易调试
  • 更多适合您具体平台的惯用API
  • 通常性能更好(平台互操作可能会很痛苦)
  • 修复最初出于兼容性考虑仍然存在的设计问题

例如,我以Joda Time的端口启动了Noda Time项目。直接在.NET中直接使用Joda Time根本不可行...您真的不想只为了启动日期和时间计算以及建立如何在两者之间进行互操作而启动JVM的方法。他们俩。自动端口(la J#)可能是可行的,但最终结果并不是C#中使用的令人愉快且惯用的API。


11

有些人这样做是为了帮助学习一种新语言。他们选择了自己熟悉的语言(使用以前的语言),发现在新版本中需要它,然后开始移植。

移植熟悉的东西是只专注于新语言的语言部分,而不用担心问题域的最佳方法。

它还具有一个额外的好处,即一旦完成,就不会像在书或教程中发现的许多示例项目那样扔掉代码,它实际上可以是社区可以使用,添加,重构,讨论等的东西。


0

有时,您正在开发一个平台,在该平台上,不能选择使用软件编写工具(在Java中为Lucene)。如果您希望功能而不必从头开始重新设计代码,则可以移植代码。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.