写点什么

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:275262

评论

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

一张图进阶 RocketMQ - 消费者这个大冤种

三此君

RocketMQ 消息队列 消费者consumer 签约计划第三季

极狐 GitLab 冷知识:Quick Actions 快速操作 Issue

郭旭东

极狐GitLab JIHULAB 101

【云原生】Docker入门 -- 阿里云服务器环境下安装Docker

Bug终结者

Docker 阿里云 云原生 服务器 8月月更

构建在Findora上的Forlend,具备隐私特性的借贷协议

BlockChain先知

C++继承的基本语法与三种继承方式

CtrlX

c c++ 面向对象 继承 8月月更

史上最全的Java并发系列之Java多线程

自然

多线程 并发 8月月更

开源一夏 |Aeraki --- 管理 Istio 服务网格中任何 7 层协议

叶秋学长

开源 云原生 8月月更

开源一夏 | JS超集对TypeScript的Map对象以及联合类型的深入实战

恒山其若陋兮

开源 8月月更

Redis 多机

武师叔

8月月更

RT-Thread记录(六、IPC机制之信号量、互斥量和事件集)

矜辰所致

RT-Thread 8月月更 IPC机制

极狐 GitLab 冷知识:使用 Email 也可以创建 Issue?

郭旭东

极狐GitLab JIHULAB 101

开源一夏 | 使用 JavaScript 和 CSS 的随机颜色生成器

海拥(haiyong.site)

开源 8月月更

构建在Findora上的Forlend,具备隐私特性的借贷协议

小哈区块

构建在Findora上的Forlend,具备隐私特性的借贷协议

西柚子

再也不敢精通Java了——get/set篇

4ye

Java Jackson lombok 签约计划第三季

如何成为一名合格的文案:需要具备哪些技能

石头IT视角

RxJS实现“搜索”功能

掘金安东尼

前端 函数式编程 8月月更

types-paddle: 为Paddle增加Tensor类型注释特性

吴京

Python paddle machine-learning

被忽略的一点:Docker的单进程模型

董哥的黑板报

Docker Kubernetes 容器 云原生 进程

史上最全的Java并发系列之Java多线程(二)

自然

多线程 并发 8月月更

JAVA开源商城系统

源字节1号

后端开发

何为项目

尚影嫣

项目管理 8月月更

自智网络简介

俞凡

网络 自智网络

深入了解JAVA篇之内存分析

邱学喆

JVM 堆内存 内存结构 MAT

一篇文章和你从Java1聊到Java18

瀛洲骇客

Java core

【LeetCode】分割字符串的最大得分Java题解

Albert

LeetCode 8月月更

他居然发邮件请我去吃饭——邮件伪造那些事儿

Regan Yue

网络安全 8月日更 8月月更 邮件伪造

selenium脚本编写注意点(二)

Xd

投研报告 -野心勃勃的meme项目 Lovely Inu($ lovely)

鳄鱼视界

如何应对核心员工提离职?

石云升

员工离职 职场经验 8月月更

史上最全的Java并发系列之Java内存模型

自然

多线程 并发 8月月更

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