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. csharp:Optical Character Recognition

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...

  2. ntp时钟服务器

    NTP服务器时钟校准的基本流程: (1):NTP客户端向NTP服务器发出一个时间请求包(UDP包),其中包含了该包离开客户端时的时间戳. (2):当服务器接收到该包时.填入包到达时的时间戳.包离开时的 ...

  3. eclipse遇到的异常

    1.  Widget disposed too early for part com.kompakar.ehealth.ui.emr.mstr.medicaldocumentaudit.Medical ...

  4. Python爬虫教程-20-xml 简介

    本篇简单介绍 xml 在python爬虫方面的使用,想要具体学习 xml 可以到 w3school 查看 xml 文档 xml 文档链接:http://www.w3school.com.cn/xmld ...

  5. JS是单线程的吗?

    Javascript是单线程的深入分析 首先一个引子:为什么JavaScript是单线程的却能让AJAX异步发送和回调请求,还有setTimeout也看起来像是多线程的? 先看例子1: functio ...

  6. 什么是shell? bash和shell有什么关系?

    什么是Shell?      shell是你(用户)和Linux(或者更准确的说,是你和Linux内核)之间的接口程序.你在提示符下输入的每个命令都由shell先解释然后传给Linux内核.      ...

  7. 并发包Semaphore实现信号灯

    /** * * @描述: Semaphore实现信号灯 . * Semaphore可以维护当前访问自身的线程个数,并提供了同步机制,使用Semaphore可以控制同时访问资源的线程个数,例如实现一个文 ...

  8. bootstrap colorscheme以及theme自动生成

    http://paintstrap.com/ 是一个根据adobe kuler color scheme自动生成theme 的工具,比较直观好用,对于调整前端theme有一定参考意义

  9. leetcode-distinct sequences

    Solution: when see question about two strings , DP should be considered first. We can abstract this ...

  10. linux(centos)设置tomcat开机启动

    方法一: linux 下tomcat开机自启动修改Tomcat/bin/startup.sh 为: export JAVA_HOME=/usr/java/j2sdk1.4.2_08 export CL ...