首页 > 解决方案 > API 和 ABI 版本在 Ruby 中意味着什么?

问题描述

我在“ Incorrect ruby​​ version when specified target path (--path) #5424 ”中看到了一条我不明白的评论:

我相信由于 API 和 ABI 版本是 2.3.0,这就是目录使用的原因?同样,rubygems 在名为 1.9.1 的目录中安装 1.9.3 的东西。除非这会导致您的设置出现问题,否则我认为这可能更像是一种好奇而不是错误

就上下文而言,该问题中讨论的 Ruby 版本是 2.3.1。显然,Ruby 2.3.1 的“API 和 ABI 版本”都是 2.3.0。我可以接受这一点,但我不明白 API 版本或 ABI 版本可能指的是什么。

这些术语是什么意思?

标签: ruby

解决方案


我们先来看看APIABI是什么意思。

应用程序编程接口是由其他人提供给您的一组类型、约束、协议、模块、函数、类、特征、方法、过程等(取决于编程语言)。然后,您可以利用这些提供的“事物”在上面构建新的“事物”。

API 总是在编译时、源代码级别定义的。例如,对于 C,API 将根据函数名称、参数类型等进行定义,并以(一组).h头文件的形式提供。

应用程序二进制接口定义了构成 API 的所有位的确切运行时内存布局。

这是一个简单的例子:

  • POSIX 定义了一个API。因此,它定义了,例如,gethostid返回一个long.
  • Linux Standard Base定义了(除其他外) POSIX的ABI。因此,它定义了,例如,在 AMD64 上,along是 64 位,但在 x86 上,它是 32 位。

另一个例子是 Linux 内核中的系统调用:系统调用名称是 API 的一部分,但系统调用是 ABI 的一部分。

一个很简单的思考方式是:如果一个API发生了向后不兼容的变化(例如,如果一个系统调用被重命名),你需要对源代码进行更改,即开发者需要主动干预,而如果ABI以向后不兼容的方式更改,您需要对二进制代码进行更改,通常只需重新编译,无需开发人员的任何“创造性”干预。

好的,现在我们知道 API 和 ABI 是什么以及它们有何不同……我们在这里实际讨论的是哪个 API 和 ABI?

好吧,我们正在谈论YARV 的 C 扩展 API/ABI。YARV Ruby 实现公开了一个编程接口,您可以根据该接口编写扩展,就像它们是实现的一部分一样。例如,Ruby 标准库的大部分 YARV 实现是作为 YARV C 扩展编写的,而不是用 Ruby 编写的(例如openssl)。许多 gem 包含 YARV C 扩展,出于性能原因或因为 gem 的目的是提供对某些 C 库的访问权限。

因此,我们在这里讨论的 API 和 ABI 版本与带有 YARV C 扩展的 Gems相关。

只要 ABI 版本不变,您就可以更新 YARV,而无需重新安装 gem。如果 ABI 版本发生变化,您需要重新安装 gem,但不需要更新它们。

如果 API 版本发生变化,gem 作者需要使 gem 适应变化。您需要等待更新 YARV 直到发生这种情况,然后更新到新版本的 gem。


推荐阅读