HarmonyOS开发者限时福利来啦!最高10w+现金激励等你拿~ 了解详情
写点什么

Swift 2023:所有权、宏和 C++ 互操作

作者:Sergio De Simone

  • 2022-12-22
    北京
  • 本文字数:2223 字

    阅读完需:约 7 分钟

Swift 2023:所有权、宏和C++互操作

Swift 语言工作组已经详细说明了 2023 年及以后 Swift 重点发展的主要领域,其中包括定义内存管理的所有权模型、不可复制类型、宏系统和 C++ 互操作。


所有权是一种内存管理方法,最近由于 Rust 而变得流行起来。它是 Rust 最具有决定性的语言特征之一,是其提供内存安全保证的基础。


Rust 使用了第三种方法:内存是通过一个所有权系统来管理的,该系统有一套编译器检查规则。如果违反了任何规则,程序就不会编译。所有权的所有特性都不会拖慢程序运行时的速度。


关于在 Swift 中引入所有权的讨论始于 2017 年,并最终定义了所有权宣言。


虽然关于所有权的工作没有取得任何进展,但 Swift 语言工作组将其带回来,目的是为了让程序员对内存中的值有更多的控制权。这可以包括禁止隐式复制、允许所有权转移以及在不进行复制的情况下借用值。此外,Swift 可以支持不可复制类型,以限制临界值的生命周期。


这些控制将实现在内存中处理数据的新方法,将当前“不安全”结构的性能与 Swift 标准库功能的安全性相结合。


Swift 另一个有前途的领域是创建一个过程宏系统,以创建高级库和 DSL。宏是一种代码生成机制,可以在词法、句法或语义层面对源代码进行转换。Swift 中现有的一些功能可以实现为宏,如 Codable 协议、字符串插值、属性封装器和结果构建器。根据 Swift 语言团队的说法,使用宏来构建像上面列出的那些新特性,可以释放出更多的资源,用于语言及其工具相关的其他工作。


虽然 Swift 宏的相关工作仍处于非常早期的阶段,但关于它们在 Swift 中应该是什么样子,人们已经有一些想法。下面是一个可能的 stringify 宏的例子:


macro(contexts: [.expression, .parameter], external: "MyMacros.Stringify")func stringify(_ value: T) -> (T, String)
复制代码


C++ 互操作旨在实现从 Swift 调用 C++ 代码,以及从 C++ 调用 Swift 代码。由于这个特性的相关工作进展得比较快,所以它有可能会首先出现在 Swift 官方版本中。根据 Swift 语言团队的说法,当前的 C++ 互操作实现已经支持自有值类型、普通值类型、外部引用类型和迭代器,并为方法、指针、l- 值和 r- 值引用有关的基本问题提供了答案。


虽然上述三个领域最具创新性,但 Swift 的演进也将专注于改进现有的功能,比如并发和泛型。


特别是在并发方面,其目标将是改善 Sendable 和 actors 提供的数据隔离,而泛型方面的工作将带来对变量泛型的支持,即拥有不同数量占位符类型的泛型。


重写 Foundation 框架


Swift 团队已着手开始 Foundation 框架的一个新的开源实现。新的实现完全采用 Swift 编写,旨在通过消除 Objective-C 和 Swift 之间的转换成本来提升性能,并对其进行模块化和清理。


因为采用了原生的 Swift 实现,Foundation 框架不再需要在 C 和 Swift 之间进行转换,从而获得更高的性能。


正如苹果工程师 Tony Parker 在 Swift 论坛上所解释的那样,性能方面带来的好处是非常显著的。


使用 Swift 重新实现的日历应用的速度是 C 的 1.5 到 18 倍(在创建、日期计算等各种测试基准中调用 Swift)。


Foundation 框架是大多数 macOS 和 iOS 应用程序的基石,提供了大量的抽象,包括 NSObject、NSString、NSArray 和 NSDictionary 等等。


Foundation 最初是用 Objective-C 编写的,很大程度上利用了它的动态特性,由于 Swift 与 Objective-C 运行时的互操作性,Foundation 目前可以用于运行苹果操作系统上的 Swift 应用程序。不过,对于其他支持 Swift 但只有原始 GNUstep Objective-C 运行时的平台(如 Linux)来说就不是这样了。为了规避这一限制,苹果在开源 Swift 时推出了 swift-corelibs-foundation,一个 Core Foundation 的 Swift 包装器,一个位于 Foundation 核心的底层 C API,并提供了映射到 Foundation 的“桥接”抽象,包括 CFString、CFDictionary 等。


如前所述,使用 Swift 重写将是一个重构 Foundation 框架的机会。目前,有五个不同的包进行了重新设计,包括 FoundationEssentials、FoundationInternationalization、FoundationNetworking、FoundationXML 和 FoundationObjCCompatibility。开发者可以只引入特定应用程序实际需要的依赖项。例如,一个从头开始开发应用程序并且想要切断与 Darwin Foundation 层所有联系的开发者,可以完全跳过 Obj-C 兼容层。


在做出重写 Foundation 决定的同时,苹果正在调整 C、Objective-C 和 Swift 层之间的顺序,并让 Swift 层成为 Foundation 的基础。这将有机会删除一些目前可以直接由 Swift 语言和标准库提供的特性,如 NSCoding 和 NSKeyedArchiver,取而代之的是 Codable,或者 Lock、OperationQueue,以及其他被 Swift 结构化并发取代的并发原语。不过,这些特性将由 Darwin 平台上的一个单独包提供,以确保与现有代码兼容。


这一声明在 Swift 论坛上引发了许多评论,其中大多数都暗示重新考虑现有的几个 API 的便利性,确保 Swift 类型(如 Codable)或结构化并发足够强大,以便在核心基础层完全取代 Obj-C 类型。


可以预见的是,Foundation 重写是一项中期的努力,目前还没有宣布具体的时间表,苹果正在邀请 Swift 社区加入讨论,一起定义它的未来。


对于 Swift 的发展,InfoQ 将继续跟踪报道。


参考链接:

https://www.infoq.com/news/2022/12/apple-swift-foundation-rewrite/

https://www.infoq.com/news/2022/12/swift-ownership-macros-cpp-api/

相关阅读:

C++ 开发,这些 GUI 库一定不要错过!

学 C++ 的以后都能从事哪些岗位?

现代化工具链在大规模 C++ 项目中的技术实践

C/C++ 的类型转换

2022-12-22 18:275228

评论

发布
暂无评论
发现更多内容

MySQL进阶(一)主外键讲解

No Silver Bullet

MySQL 数据库 7月月更 主外键

营销玩法多变,搞懂规则是关键!

CRMEB

龙芯高级工程师直播:视频编解码基础知识入门 | 第 31 期

OpenAnolis小助手

直播 基础 视频编解码 龙蜥大讲堂 龙芯中科

Java基本概念详解

五分钟学大数据

Java 7月月更

Hexo在github上构建的博客

沃德

程序员 Hexo 博客 7月月更

Qt|QWT绘制柱状图一类多种颜色

中国好公民st

qt 7月月更

语音直播app源码

开源直播系统源码

直播系统源码 开源源码 语音直播系统源码

微软 Edge 浏览器 Tracking Prevention 的强制措施的一个例子

汪子熙

JavaScript microsoft 浏览器 前端开发 7月月更

数据仓库分层——DWD DWS ADS傻傻分不清楚

怀瑾握瑜的嘉与嘉

数据仓库 7月月更

会用redis吗?那还不快来了解下redis protocol

冉然学Java

Java 分布式 构架 Redis 数据结构

双目立体匹配之视差优化

秃头小苏

7月月更 双目立体匹配

为什么说企业需要具备企业知识管理的能力?

Baklib

面试突击65:为什么要用HTTPS?它有什么优点?

王磊

Java 面试题

不习惯的 Vue3 起步五 のapiHooks封装

空城机

Vue3 7月月更

基于Qt设计的课堂考勤系统(采用RDS for MySQL云数据库 )

DS小龙哥

7月月更

CSS神奇的卡片悬停交互效果

南城FE

CSS 前端 动画 鼠标悬浮 7月月更

解决浏览器回退表单重复提交问题

沃德

程序员 javaWeb 7月月更

多链多币种钱包系统开发跨链技术

薇電13242772558

钱包 跨链技术

某易跟帖频道,接口溯源分析,反爬新技巧,必掌握一下

梦想橡皮擦

Python 爬虫 Python爬虫 7月月更

硅谷来信:Google、Facebook员工的“成长型思维”

博文视点Broadview

Java 在Word文档中查找和高亮文本

在下毛毛雨

Java word文档 查找与高亮

全面打通 DevOps 数据链的研发效能度量平台

思码逸研发效能

开源 DevOps 研发效能 效能度量

【LeetCode】数组美丽值求和Java题解

Albert

LeetCode 7月月更

java培训之Java8 Stream 代码简化是如何实现的

@零度

stream JAVA开发

《高绩效教练》:如何用提问激发潜能?

郭明

读书笔记

Qt | 读取文件内容并删除文件 QFile

YOLO.

File 文件操作 qt 7月月更

使用ServiceWorker提高性能

devpoint

JavaScript Service Worker 7月月更

基于SpringBoot 的MCMS系统,完全开源,直接商用太爽了

冉然学Java

Java 源码 springboot 构架

Redis 过期的数据会被立马删除么?大有玄机

码哥字节

redis 底层原理 7月月更

FAQ制作工具推荐

Baklib

企事业单位该如何建设知识管理体系

Baklib

Swift 2023:所有权、宏和C++互操作_开源_InfoQ精选文章