ABI是什么? Swift ABI稳定有什么好处?
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中.
**好处: **
- App尺寸会变小: Apple会根据iOS操作系统创建不同的下载包. 对于iOS12.2的系统, 因为它预装了swift5 runtime, 所以不再需要Swift的库, 它们被从app bundle中删除掉. 对于iOS12.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稳定有什么好处?的更多相关文章
- ABI与编译器:ABI是由内核和工具链定义和实现的
http://book.51cto.com/art/201412/460857.htm <Linux系统编程(第2版)>第1章入门和基本概念,这一章着眼于Linux系统编程的基础概念并从程 ...
- Swift库二进制接口(ABI)兼容性研究
前言 阿里云APP组件化过程中,我们拆分出了若干基础组件库和业务代码库,由于代码是采用Swift编写的,所以这些库都是动态库形式.在上一个正式版本,组件化达到了完全形态,主工程只剩下一个壳,所有代码都 ...
- API、ABI区别
http://blog.csdn.net/xinghun_4/article/details/7905298 应用程序二进制接口(ABI-Application Binary Interface)定义 ...
- Clang与libc++abi库安装
系统ubuntu64位 Clang4.0 参考: 1 https://github.com/yangyangwithgnu/use_vim_as_ide#0.1 其中 第7章 工具链集成 2. htt ...
- 初识ELF格式 ABI,EABI,OABI
尽管每天都在调用linux的elf文件做各种事,但却很少去了解他,最近尝试在orangepi上编译个elf到android手机上运行,因为两个CPU都是ARMv8的.结果运行失败了.遂查找原因.结果挖 ...
- 深入以太坊智能合约 ABI
开发 DApp 时要调用在区块链上的以太坊智能合约,就需要智能合约的 ABI.本文希望更多了解 ABI,如为什么需要 ABI?如何解读 Ethereum 的智能合约 ABI?以及如何取得合约的 ABI ...
- GCC编译器ABI
ABI与EABI 1)ABI(Application Binary Interface for the ARM Architecture),描述了应用程序与cpu内核的低级接口. ABI允许编译好的目 ...
- ABI and ISA
ABI定义了如何使用ISA. ISA定义了机器码的使用规则. http://www.delorie.com/gnu/docs/gmp/gmp_6.html ABI and ISA ABI (Appli ...
- ABI 管理
https://developer.android.google.cn/ndk/guides/abis.html 不同 Android 手机使用不同的 CPU,因此支持不同的指令集.CPU 与指令集的 ...
随机推荐
- spring cglib 与 jdk 动态代理
1. 概述 JDK动态代理是利用java反射机制 生成一个实现接口的匿名类, 在调用具体方法前调用InvocationHandler来处理 Cglib动态代理是 利用asm开源包 把被代理类的clas ...
- Android常用的图片加载库
Android常用的图片加载库 前言:图片加载涉及到图片的缓存.图片的处理.图片的显示等.四种常用的图片加载框架,分别是Fresco.ImageLoader. Picasso. Glide. Uni ...
- TextView的跑马灯效果(AS开发实战第二章学习笔记)
TextView的跑马灯效果跑马灯用到的属性与方法说明singleLine 指定文本是否单行显示ellipsize 指定文本超出范围后的省略方式focusable 指定是否获得焦点,跑马灯效果要求设置 ...
- Java 多线程使用
工作中遇到的问题,记录下解决的思路 问题: 对磁盘进行碎片化测试(比如说,磁盘空间是16G),从64K开始写文件,写满后删除一半,然后写32K 的数据,写满后删除一半...直到4K写满删除一般算是结束 ...
- push本地代码到github发生错误的解决办法
有一天,我在github上编写好了README.md这个文件,接着发现本地有段代码忘记上传了,于是熟练的输入git add . git commit -m "modify",以 ...
- Mac下终端自动补全功能
记录一下终端的一些使用命令,跟自动补全的配置,主要怕以后忘记了. 1.终端自动补全的配置 打开终端,输入 : nano .inputrc 在文件里面写上: set completion-ignore- ...
- shp文件导入mysql5.6.15
百度了一下 方法大致相同,就是提供的资源都缺斤短两还在细节上有差异.所以上传一份正确的. 0.将cygwin1.dll拷贝到system32目录下面1.将shp以及shp的相关文件和DOShere的d ...
- 使用github参与到开源项目的维护
参与到开源项目的维护工作一般分两种,一种是由项目建立者拉入到贡献者列表中,拥有对项目的读写权限,而普通用户对项目仅有读取权限,另一种是fork项目到自己仓库,然后把修改后的内容发送给项目管理者者请求合 ...
- linux系统参数
vm.swappiness = 清理掉cache给新的程序用当然可以, 但也带来了新的问题, 也就是如果这些(原来cache里的)数据还要使用, 又得重新cache. 产生了新的IO, 新的wait. ...
- jQuery插件开发精品教程,让你的jQuery提升一个台阶(转)
原文:http://www.cnblogs.com/Wayou/p/jquery_plugin_tutorial.html 要说jQuery 最成功的地方,我认为是它的可扩展性吸引了众多开发者为其开发 ...