ABI是什么?

在软件开发中, 应用程序机器二元码界面(Application Binary Interface 简称ABI)指两个程序模块间的接口; 通常其中一个车还给你徐模块会是库或者操作系统提供的服务, 而另一边的模块则是用户所运行的程序.

一个ABI定义了机器代码如何访问数据结构与运算程序, 此处所定义的界面相当地基并且相依于硬件. 而类似概念的API则在源代码定义这些, 较为高端, 并不直接依赖于硬件, 通常会是人类可阅读的代码. 一个ABI常见的样貌即是调用约定: 数据怎么称为计算程序的输入或者从中得到输出;x86的调用约定即是一个ABI的例子.

决定要不要采用既定的ABI, 通常由编译器, 操作系统或库的开发者来决定; 然而, 如果编写一个混合多个语言的应用程序, 就必须直接处理ABI, 采用外部函数调用来达成此目的.

调用约定: https://zh.wikipedia.org/wiki/调用约定

ABI: https://zh.wikipedia.org/wiki/应用二进制接口

Swift ABI稳定对我们意味着什么?

ABI稳定就是binary接口稳定, 也就是在运行的时候只要是通过Swift5或者以上的编译器编译出来的binary, 就可以泡在任意的swift5及以上的runtime上. 这样, 我们就不需要像以前那样在app里面放一个swift runtime了, Apple会把相应的ABI整合到iOS或者macOS中.

**好处: **

  1. App尺寸会变小: Apple会根据iOS操作系统创建不同的下载包. 对于iOS12.2的系统, 因为它预装了swift5 runtime, 所以不再需要Swift的库, 它们被从app bundle中删除掉. 对于iOS12.2以下的系统, 照旧.
  2. 因为系统集成了Swift, 所以大家都用同一个Swift了, app启动时候也就不需要额外加载Swift, 所以在新的系统中会更加节省内存. 另外, 对于Apple的工程师来说, 他们可以在系统的框架中使用swift, 这样很多东西不必通过oc wrap一遍, 这会让代码运行效率提高很多.

代价:

swift版本被放到了iOS系统中, 所以想要升级就没那么容易了, 除非升级操作系统. 在ABI稳定之前, swift runtime作为开发工具的一部分, 背作为库打包到了app中. 这样, 在开发时候, 我们可以随意使用新版本的swift特性, 因为他们的版本是开发者自己决定的. 不过当ABI稳定后, swift runtime变成用户系统的一部分, 它从开发工具变成了运行环境, 不再由开发者唯一决定.

这和我们一直以来适配新系统的 API 时候的情况差不多,在 Swift 5 以后,我们需要等到 deploy target 升级到对应的版本,才能开始使用对应的 Swift 特性。这意味着,我们可能会需要写一些这样的兼容代码:

// 假如 Swift 6.0 是 iOS 13.0 的 Swift 版本
if #available(iOS 13.0, *) {
// Swift 6.0 标准库中存在 A
let a = A()} else {
// 不存在 A 时的处理
}

有什么方法能够让我们无视系统版本, 去使用swift新特性吗?

方法还是有的, 但是相对比较麻烦, 很大程度上依赖于苹果是否愿意提供支持. 就像但是iOS5.0引入ARC时候, Apple为了让iOS4.3和之前的系统也能使用ARC的代码, 在deployment target选到iOS4.3或之前时候, 回采用static link的方法打包一个叫做libarclite的库, 其中包含了ARC所需的一些runtime方法. 对于ABI稳定后的swift, 也许可以采用类似的做法. 全看Apple是否愿意提供支持.

总结

ABI稳定最大的受益者应该是Apple, 这让Apple在自己的生态系统中, 特别是系统框架中, 可以使用Swift来进行实现. Swift ABI稳定为Apple开发平台的一场戈丁奠定了基础. 在未来的几年里, 如果你还想要关注Apple平台, 可能下面几件事情特别重要:

  • Apple 什么时候发布第一个 Swift 写的系统框架
  • Apple 什么时候开始提供第一个 Swift only 的 API
  • Apple 什么时候开始“锁定” Objective-C 的 SDK,不再为它增加新的 API
  • Apple 什么时候开始用 Swift 特性更新现有的 Objective-C SDK

Swift ABI稳定对我们到底意味着什么: http://www.cocoachina.com/cms/wap.php?action=article&id=26388

ABI是什么? Swift ABI稳定有什么好处?的更多相关文章

  1. ABI与编译器:ABI是由内核和工具链定义和实现的

    http://book.51cto.com/art/201412/460857.htm <Linux系统编程(第2版)>第1章入门和基本概念,这一章着眼于Linux系统编程的基础概念并从程 ...

  2. Swift库二进制接口(ABI)兼容性研究

    前言 阿里云APP组件化过程中,我们拆分出了若干基础组件库和业务代码库,由于代码是采用Swift编写的,所以这些库都是动态库形式.在上一个正式版本,组件化达到了完全形态,主工程只剩下一个壳,所有代码都 ...

  3. API、ABI区别

    http://blog.csdn.net/xinghun_4/article/details/7905298 应用程序二进制接口(ABI-Application Binary Interface)定义 ...

  4. Clang与libc++abi库安装

    系统ubuntu64位 Clang4.0 参考: 1 https://github.com/yangyangwithgnu/use_vim_as_ide#0.1 其中 第7章 工具链集成 2. htt ...

  5. 初识ELF格式 ABI,EABI,OABI

    尽管每天都在调用linux的elf文件做各种事,但却很少去了解他,最近尝试在orangepi上编译个elf到android手机上运行,因为两个CPU都是ARMv8的.结果运行失败了.遂查找原因.结果挖 ...

  6. 深入以太坊智能合约 ABI

    开发 DApp 时要调用在区块链上的以太坊智能合约,就需要智能合约的 ABI.本文希望更多了解 ABI,如为什么需要 ABI?如何解读 Ethereum 的智能合约 ABI?以及如何取得合约的 ABI ...

  7. GCC编译器ABI

    ABI与EABI 1)ABI(Application Binary Interface for the ARM Architecture),描述了应用程序与cpu内核的低级接口. ABI允许编译好的目 ...

  8. ABI and ISA

    ABI定义了如何使用ISA. ISA定义了机器码的使用规则. http://www.delorie.com/gnu/docs/gmp/gmp_6.html ABI and ISA ABI (Appli ...

  9. ABI 管理

    https://developer.android.google.cn/ndk/guides/abis.html 不同 Android 手机使用不同的 CPU,因此支持不同的指令集.CPU 与指令集的 ...

随机推荐

  1. linux sheel script demo

    demo1 (输入/输出) 1.1. target : 输入姓.名, 输出姓名 1.2. create directory mkdir ~/bin 1.3. create & edit she ...

  2. 解决MFC对话框类不能建立成功的方法(出现unable to open the files XX for class XX)

    原文:http://blog.163.com/wangqi1973_off/blog/static/131034571201011885546230 为新加的对话框资源添加新类,类名取做CColorV ...

  3. 数组sort()方法排序

    sort()方法排序 var arr = ["G","A","C","B","I","H& ...

  4. git 回滚到上个版本命令以及忽略某些文件提交

    1.git回滚到上个版本 git reset --hard FETCH_HEAD 2.git忽略某些文件的提交 以前是用默认的.gitignore 然后再里面默认某些文件不提交.但是有个问题,.git ...

  5. Installing TensorFlow on Ubuntu

    1.安装方法有4种,官方推荐是第一种. virtualenv(官方推荐)    "native" pip    Docker    Anaconda 2.基于virtualenv的 ...

  6. 浏览器环境下的javascript DOM对象继承模型

    这张图是我直接在现代浏览器中通过prototype原型溯源绘制的一张浏览器宿主环境下的javascript DOM对象模型,对于有效学习和使用javascript DOM编程起到高屋建瓴的指导作用, ...

  7. 从传输流收到意外的 EOF 或 0 个字节

    /// <summary> /// 发送POST请求 /// </summary> /// <param name="json"></pa ...

  8. How to alter department in PMS system

    question:How to alter department in PMS system 1.Use  generally method modified department: update e ...

  9. openAI最近推出了一个新的语言模型 "GPT-2"

    [转]openAI最近推出了一个新的语言模型 "GPT-2",由于效果太好(?)几乎可以以假乱真,所以openAI正在犹豫是否把这个project完整release出来.(于是有人 ...

  10. JAVA中commons-collections-3.2.1.jar包是干什么用的?

    类似C++中的Boost库,对Java容器类型和算法的补充