ruby - 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 版本可能指的是什么。
这些术语是什么意思?
解决方案
我们先来看看API和ABI是什么意思。
应用程序编程接口是由其他人提供给您的一组类型、约束、协议、模块、函数、类、特征、方法、过程等(取决于编程语言)。然后,您可以利用这些提供的“事物”在上面构建新的“事物”。
API 总是在编译时、源代码级别定义的。例如,对于 C,API 将根据函数名称、参数类型等进行定义,并以(一组).h
头文件的形式提供。
应用程序二进制接口定义了构成 API 的所有位的确切运行时内存布局。
这是一个简单的例子:
- POSIX 定义了一个API。因此,它定义了,例如,
gethostid
返回一个long
. - Linux Standard Base定义了(除其他外) POSIX的ABI。因此,它定义了,例如,在 AMD64 上,a
long
是 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。
推荐阅读
- flutter - Graphql_flutter runMutation 的 QueryResult 返回 null,尽管突变正在正确执行
- javascript - 如何从具有“复杂”信息的 JSON 文件中获取数据到数据表?
- ios - Cordova iOS 6.1.1 白色闪屏
- ruby - 添加 gem 'rails-controller-testing' 的替代方法
- python - 如何在 linux ubuntu 上安装 CUDA 10.1?
- javascript - 在 react.js 中将 prop 数据存储在本地存储中
- python - Pandas 合并列中的行
- python - 使用 Pandas 查询函数并测试字符串是否在包含列表的列中
- java - 如何从android中的xml获取图像的大小
- c++ - QString::QString(QString &&other) 是做什么用的?