在Ruby中编写C接口如何比在Perl中编写更容易?

在Ruby中编写C接口如何比在Perl中编写更容易?,ruby,perl,cextension,Ruby,Perl,Cextension,根据协议,用C扩展Ruby比用Perl更容易。我不是一个(perl)XS的家伙,但我发现用它快速简单地编写一些东西非常简单,那么为什么在Ruby中更容易呢 在Ruby中编写C扩展比在Perl或Python中更容易,有一个非常优雅的API用于从C调用Ruby。这包括在软件中嵌入Ruby的调用,以用作脚本语言。SWIG接口也可用 对于那些进行更多C扩展的人,任何进一步的解释都是有用的。使用FFI,用C扩展Ruby是非常容易的 您不需要在上安装编译器 您的系统必须能够运行FFI 扩展。在linux上,

根据协议,用C扩展Ruby比用Perl更容易。我不是一个(perl)XS的家伙,但我发现用它快速简单地编写一些东西非常简单,那么为什么在Ruby中更容易呢

在Ruby中编写C扩展比在Perl或Python中更容易,有一个非常优雅的API用于从C调用Ruby。这包括在软件中嵌入Ruby的调用,以用作脚本语言。SWIG接口也可用


对于那些进行更多C扩展的人,任何进一步的解释都是有用的。

使用FFI,用C扩展Ruby是非常容易的

您不需要在上安装编译器 您的系统必须能够运行FFI 扩展。在linux上,您也不需要 需要安装开发工具吗 库的版本,只是 运行时版本。当然是 您所链接的库将需要 在某个时候被编译过, 但很可能你不必这么做 它

(完全公开,我是一名Perl程序员)

这家当然比那家好看多了。它看起来像一个普通的C库,其中包含与Ruby代码对应的函数。Perl的API是一堆宏中的宏和神奇的线程标志。在Perl核心之外使用Perl API当然是次要问题。鲁比肯定会赢,因为他不会让人感到可怕

虽然Ruby有更好的C API,但Perl有更好的教程介绍如何使用它。生成的Ruby文档缺少任何类型的内聚教程,或者通常根本没有任何描述性文本。我可能找错地方了。相反,PerlAPI文档是手工编写的散文,包含关于每个函数的功能的有用信息。此外我要说Perl在文档上获胜

外国金融机构看起来相当令人印象深刻。Perl最接近FFI的地方是它是一个围绕着混乱的XS的包装器。它的主要用途是,但你也可以用它来

下面是一个与nash的getpid示例类似的简单示例

use Inline
  C             => Config       =>
  ENABLE        => "AUTOWRAP";

use Inline C => q{ int getpid(); };

print getpid();
现在,我作弊是因为从技术上讲,getpid在我的系统上返回pid\u t,但这只是一个整数。FFI似乎有很多用于getpid的特殊情况代码,所以我怀疑它的易用性将直接对应于FFI是否已经处理好了它。琐碎的例子是琐碎的。当出现典型的复杂情况时会发生什么,比如返回预分配内存、具有奇数类型和抛出结构的函数,这将是一件有趣的事情

虽然FFI和Inline::C可以用来做同样的事情,但它们的方式看起来非常非常不同。内联::C实际上是编译和缓存C代码。FFI不知何故没有进行任何编译。我不确定这是真的,还是在安装公共库时为您完成了编译


此外,FFI平滑了各种Ruby实现及其调用本机API的不同方式之间的可移植性问题。这是内联::C不必做的事情,坦率地说,如果它真的能工作,那真是太棒了。一个好处是FFI接口比内联::C平滑得多。有了内联::C,很明显你在编写C编译器的包装器。

我认为这很有可能会演变成一场极客之争,没有什么比极客之争更琐碎和毫无意义的了。还有,顺便说一句,>>vi>emacs,Linux>FreeBSD,等等。目前还没有一个单一的答案——不需要你分心的负面猜测。如果你想让这完全不是主观的,你就必须提供比营销页面上的陈述更多的结构。也许可以重新表述这个问题?“提供易于使用Ruby编写的C扩展示例”?或者更简单。。。“用C扩展Ruby的好教程是什么?”为什么?我不想隐瞒这个问题。。当然,它的表面上有一些价值。。价值是多少?在编写C扩展时,为什么Ruby比Python和Perl更好?先发制人投票重新开始。我想看到有人比较Ruby和Perl.AFAIK中的编写扩展,Perl也有类似的模块。我一直看到有人说FFI非常有用,但他们如何处理现实世界中的复杂数据类型?整数和浮点值的包装函数用途有限。什么复杂类型,孩子,对于一个不愿接受这个问题的人来说,这正是我想要的答案。谢谢纳什的回答提供了缺失的结构,他说:“如果没有比这更可怕的消息,我几天后就会接受。”。FFI也引起了我的好奇心。这里有一些针对Perl的FFI项目now@JoelBerger知道他们的名字吗?@Schwern一直在研究这个问题,特别是与PDL的整合。事实上,我耽误了他一点时间,因为他想在我的项目中分发一些库,而我的项目仍在进行中。请注意,我说的项目,因为我不知道他们是否完成(并因此发布),但我知道他正在取得一些成功。
use Inline
  C             => Config       =>
  ENABLE        => "AUTOWRAP";

use Inline C => q{ int getpid(); };

print getpid();