我是一名新的 Ruby 程序员,并且一直在阅读一些编写 Ruby 语言的 C 代码扩展的教程,我想知道:这样做有什么好处?我个人正在研究这个,因为我将来必须为我所在的课程做一个团队项目,我很确定我是唯一一个做 Ruby 开发的人,但大多数人都知道 C,所以我可以让他们编写理论上我可以在我自己的 Ruby 开发项目中使用的 C 代码。但通常,这是这样做的主要原因还是我不知道?另外,您认为我的想法是否可行(在我将 C 开发集成到 Ruby 中以进行整个项目时,让某人进行 C 开发)?你能用其他语言做类似的事情吗(例如,你能在 Ruby 项目、Python 代码等中使用 Java 代码)吗?
1 回答
这样做的主要原因是速度和现有功能的重用。
第一,速度。C 通常比 Ruby 快得多,因为您避免使用 Ruby VM 并且可以进行手动内存管理。在应用程序的性能关键部分(例如数据库驱动程序)中,这可能意味着整个应用程序运行时的显着改进,主要是因为您没有生成大量 Ruby 对象来包装原语,并且不必调用垃圾收集器进行清理。
其次,通过编写 C 扩展,您可以与 C 库中已经存在的代码进行交互。Linux 生态系统充斥着强大的、经过良好测试的 C 库,可提供许多常用功能。例如,Nokogiri使用libxml进行解析,这让它可以使用经过实战考验的快速解析器,然后它只是在上面添加了漂亮的 Ruby 糖。在这种情况下,C 扩展的主要目的是提供一个 Ruby API,它调用 C 代码并将数据与 C-Ruby 数据类型相互转换(因此您可以传入一个rb_string
作为参数,它必须被转换为char*
供某些 C 库使用,然后将结果转换回 anrb_string
以传递回 Ruby,例如)。
使用 MRI(普通 Ruby)时,通常仅限于 C 代码,尽管有一些方法可以在 Ruby 中运行 Python 等等,但它不是同一类型的接口。如果你使用 JRuby,你可以直接使用 Java 包——不需要特殊的扩展!
也就是说,如果您希望将 Ruby 与现有的 C 库接口,请查看ruby-ffi。它提供了许多功能,使编写 C 库的接口变得非常容易,并且可以让您快速轻松地启动和运行。