gpt4 book ai didi

ruby - 在 Ruby 中编写 C 接口(interface)比在 Perl 中更容易吗?

转载 作者:数据小太阳 更新时间:2023-10-29 06:52:14 24 4
gpt4 key购买 nike

根据official ruby About page用 C 扩展 Ruby 比用 Perl 更容易。我不是 (perl) XS 专家,但我发现使用 Inline::C 快速简单地编写一些东西非常简单,那么为什么在 Ruby 中更容易呢?

Writing C extensions in Ruby is easier than in Perl or Python, with a very elegant API for calling Ruby from C. This includes calls for embedding Ruby in software, for use as a scripting language. A SWIG interface is also available.

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

最佳答案

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

Ruby C API肯定比 Perl 好看多了的。它看起来像一个常规的 C 库,具有与 Ruby 代码相对应的功能。 Perl 的 API 是宏中宏中的宏和魔术线程标志的困惑。在 Perl 核心之外使用 Perl API 当然是次要问题。 Ruby 绝对是赢家,因为它没有令人毛骨悚然的恐惧。

虽然 Ruby 有更好的 C API,但 Perl 有更好的教程来教你如何用它做任何事情。生成的 Ruby 文档缺少任何类型的连贯教程,通常根本没有任何描述性文本。可能我找错地方了 but that's all that was offered .相比之下,Perl API 文档是手写的散文,其中包含有关每个函数的作用的有用信息。此外,there's over a dozen documents in the core docs about using Perl and C .我会说 Perl 在文档上胜出。

FFI 看起来相当令人印象深刻。 Perl 最接近 FFI 的是 Inline::C这是 XS 困惑的包装。它的主要用途是 inline C code into your Perl program , 但你也可以用它来 access C library functions .

这是一个类似于 nash 的 getpid 示例的简单示例。

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

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

print getpid();

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

虽然 FFI 和 Inline::C 可以用来做同样的事情,但它们的工作方式看起来非常非常不同。 Inline::C 其实就是编译和缓存 C 代码。 FFI 不知何故不进行任何编译。我不确定这是否是真的,或者是否在安装公共(public)库时为您完成了编译。

此外,FFI 解决了各种 Ruby 实现及其调用 native API 的不同方式之间的可移植性问题。这是 Inline::C 不必做的事情,坦率地说,如果它真的有效,那就太棒了。一个好处是 FFI 接口(interface)比 Inline::C 更流畅。使用 Inline::C,很明显您正在围绕 C 编译器编写包装器。

关于ruby - 在 Ruby 中编写 C 接口(interface)比在 Perl 中更容易吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5608701/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com