一. 背景
ABI(Application Binary Interface),即应用程序二进制接口,描述了应用程序和操作系统之间,一个应用和它的库之间的接口。在 iOS 和 macOS 平台,Swift 编写的二进制程序在运行时通过 ABI 与其他程序库或组件进行交互。程序的编译会产生一个或者多个二进制实体,这些二进制实体必须在一些很底层的细节上达成一致,才能被链接在一起执行。可以说ABI就是一个规范,一种协议。它会规定如何调用函数,如何在内存中表示数据,甚至是如何存储和访问 metadata。Xcode 10.2 集成了 Swift 5.0 编译器,只要使用这个版本以上的编译器,编译出来的二进制就是 ABI 稳定的。
在此示例中,使用 Swift 5.0 构建的应用程序将在安装了 Swift 5 标准库的系统以及 Swift 5.1 或将来的 Swift 6 的系统上运行。
ABI 稳定的好处:
Swift 库和库的 API 以 module 的方式导出,module 文件被编译创建和使用。Swift 5.1 引入了稳定基于文本的 module 接口文件,不同版本的编译器具备兼容性。Module 稳定使我们创建的 Swift framework 能够兼容未来的 Swift 版本。Module 稳定代表着描述模块 API 的信息格式稳定。这个信息会在编译时使用,它表明了这个库所有的类和函数都是什么,如同 C 语言的 header 文件一样。Swift 把这个信息存在一个名为 .swiftmodule 的二进制文件中。由于这个文件在不同编译器间不兼容,这意味着如果应用程序开发人员无法使用其他版本的 Swift 编译器引入该 framework。
Swift 5.1 实现了一个文本的方案来实现 Module 稳定,使用一个名为 .swiftinterface 的文本文件替换二进制的 .swiftmodule 文件,内容类似于 Xcode 中 swift 文件的 generated interface。
例如,你可以使用 Swift 6 构建框架,而该框架的接口将可由 Swift 6 和以后的 Swift 7 编译器读取。
Swift 不同版本的编译器编译出的产物可以互相引用,不会出现以下错误:
“Module compiled with Swift 5.1 cannot be imported by the Swift 5.2 compiler”
Library Evolution 允许二进制组件发生变化时,不用再重新编译其宿主。这样无论是系统框架发生变化时,还是开发者依赖的第三方框架发生变化时,开发者都不需要重新编译自己的应用(或框架)就能直接运行。
在此示例中,应用是基于框架的原始版本(黄色)构建的。由于 Library Evolution,它可以运行在包含黄色版本框架的系统上,也可以直接运行在升级后的红色版本框架的系统上。
Swift 具有的特性 | 支持 | 状态 |
---|---|---|
ABI 稳定 | 应用程序能在更高版本的 Swift 标准库环境下运行 | Swift 5 之后开始支持 |
Module 稳定(并且 ABI 稳定) | 组件能在更高版本的编译器环境下被引用 | Swift 5.1 之后开始支持 |
Library Evolution | 二进制组件在发生改变时,只要 API 向前兼容,引用它的宿主无须重新编译 | Swift 5.1 之后开始支持 |
从图中可以看到,从 2016 年年中开始,github Swift 代码 push 的量已经超过了 OC,Swift 的新活跃开源项目也远超过 OC。开源推动了外部贡献者参与 Swift 生态建设,长期看 OC 三方开源库面临年久失修和新功能不支持的风险。
Apple 已经在开发文档中将 Swift 设置为默认示例语言,2019年 WWDC 发布了4个纯 Swift 的 Framework,不排除后面发布的 Framework 只有 Swift 版本的可能;另外 Apple 也积极开展高校合作,目前在美国已经有 18 所大学和学院将 Swift 纳入教学课程,同时也开发了面向高中和高等院校的《使用 Swift 开发》课程,和面向 4 年级至 8 年级学生的《人人能编程》课程;随着 Swift 语言的普及和编程门槛的降低,我们能做的就是为优秀的 Swift 开发者敞开大门。
另外,OC 和 Swift 也有良好的互操作性。至此,所有准备工作已就绪,对 iOS 开发者来说普及已经是大势所趋了。
Swift 拥有简单而富有表现力的语法,即使你以前没有任何编码经验,也很容易理解。事实上,根据苹果公司的说法,Swift 被设计成第一种供任何人学习的编程语言。Swift 也同时吸收了很多语言的特性, 以至于各种不同语言的开发者写 Swift 的时候都会觉得特别熟悉特别亲切。以下是 Swift 从其他语言借鉴的特性或表示方法:
Dictionaries(或Hash Table):简洁的中括号初始化语法从 JavaScript 而来。
数据类型推断:编译器通过变量的初始值很容易推断变量的数据类型。这个功能最早出现在 Haskell、Scala、Opa、微软也在 .Net 3.0 中引入了这个功能。
泛型数据结构声明:Java 5 引入了泛型,通过尖括号中的数据类型,告诉编译器 HashMap,Array,Collection 等集合类中存储了何种数据类型。同一时间微软把这一功能引入到 C# 中。
字符串模板:从 Cold Fusion、JSP 等语言而来。
程序行尾可选分号:从 JavaScript、Python 而来。
Protocol(或 Interface):从 Java 和 C# 而来。
元组(Tuples):元组是通过逗号分割,小括号括起来的类型列表,可以让一个函数有多个返回值,这种特性从 Lisp 和 Python 而来。
闭包:闭包的概念出现于 60 年代,最早实现闭包的程序语言是 Scheme。之后,闭包被广泛使用于函数式编程语言如 ML 语言和 LISP。
协程(async/await):即将引入的协程,作为取代线程的更优雅的异步模型,来源于 Smalltalk、Ruby、Lua、Julia 和 Go 等语言。(Coming soon)
毕加索:(Good artists borrow, Great artists steal)
Swift 语言的语法鼓励你编写简洁一致的代码,有时甚至会变得严格,同时提供了保护措施以防止错误并提高可读性。
SIL(Swift Intermediate Language):SIL 会对 Swift 进行较高级别的语义分析和优化。包括高级别的语义分析,诊断转换,去虚拟化,特化,引用计数优化,TBAA(Type Based Alias Analysis)等。
WMO:全模块编译优化。首先,编译器了解模块中所有函数的实现,所以它能够执行诸如函数内联和函数特殊化等优化。函数特化主要应该是指通过调用上下文传递的类型来生成一个基于特定类型的版本。但是很多情况下,会导致二级制级别的代码膨胀。有了全模块优化,能够把多处基于相同类型生成的函数优化为一个。
全量工程化和工程改造前,百度App 在 Watch App、各独立 Widget、以及很少一部分 SDK 中使用 Swift。不过百度内部 柠檬爱美、古物潮玩、有噗等创新产品都广泛的使用 Swift 开发。
根据现有公开资料,我们了解到手淘已全面支持 Swift,微信部分使用 Swift,今日头条的飞书(Lark)使用了 Swift。
这篇文章(https://blog.csdn.net/Desgard_Duan/article/details/105872728)统计了国内外使用的 Swift 开发的 Top 100 应用列表,但并不明确各 App Swift 的应用范围,也不明确各 App 已经系统化解决 OC 和 Swift 在大型工程或组件化开发模式下的问题。
对于 iOS 12.2 以下的系统,使用 Swift 编写的代码打包成 App 后需要额外内置 Swift 动态库。而 iOS 12.2 及以上版本,使用 Swift 5.0 以上编写的 Swift 代码,不再需要打包 Swift 运行时,相比之前,减小了 7.9 MB。
在"Swift 的优势"部分,我们已经看到 Swift 在开发效率、安全性、运行性能、内存管理方面的优势,也无明显劣势,所以普及也是顺其自然的事情了。
在单工程源码模式下,我们为 Swift 访问 OC 建立 bridge 文件,Swift 编译时也会生成 *-Swift.h 头文件供 OC 调用;这样就可以实现 OC 和 Swift 混合开发。
在以并行开发,或者以 App 工厂为目标的 App ,都会对工程进行组件化拆分,不仅需要依赖管理工具的支撑,也需要对工程进行改造。百度App 目前使用组件化模式开发,同时兼容 源码、二进制 两种组件形态;因此需要保障组件间互操作性,保障对源码、二进制两种形态下的组件编译、链接过程的完整支撑。
百度App 整体落地步骤如下:
这篇文章介绍了前两部分,Swift 编码规范及约束工具有创新团队同学提供支持。后面两篇文章将重点介绍这里面的两个重点环节,工具链层面系统化支持 OC 和 Swift 混编,以及如何进行工程改造以支撑全面Swift全面应用开发。
本文由哈喽比特于3年以前收录,如有侵权请联系我们。
文章来源:https://mp.weixin.qq.com/s/Vk6KNT_Ca_0se2eckYRuBg
京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。
日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。
据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。
今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。
日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。
近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。
据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。
9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...
9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。
据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。
特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。
据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。
近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。
据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。
9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。
《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。
近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。
社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”
2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。
罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。