写点什么

Swift 内存所有权宣言

2017 年 3 月 07 日

根据 Chris Lattner 介绍,Swift 4 的主要目标之一就是要定义一个类似于 Rust/Cyclone 的内存所有权模型(Memory Ownership Model)。Chris Lattner 是 Swift 的创建者,在跳槽到Tesla 之前曾担任Swift 团队负责人。在Swift 4 当前已进入第二阶段的情况下,Swift 团队发布了一个宣言,详细阐明了Swift 内存所有权的工作方式。

Swift 编译器为确定所有权转换的时机,已实现了一种自己的不透明所有权模型(即 ARC )。虽然所有权在一些情况下是很明晰的,但是编译器也会在一些情况下做出错误假设,进而导致不必要的复制。简而言之,Swift 的新内存所有权模型使得内存复制尽可能地处于开发人员的控制之下。定义该模型在于尽量克服当前写时复制(copy-on-write)在引用计数方法上的不足之处,包括:引用计数的开销及性能偶尔无法预测,以及为实现随时可复制的需求而笼统地分配堆内存。

虽然这些缺点通常对于应用编程并不会构成问题,但是对于那些需要一定性能保证的系统编程而言却不受欢迎。此外,更灵活的内存管理模型具有显著优点,这些优点同样适用于应用编程,去解决特定瓶颈问题的优化。基于上述原因,与 ARC 相比,选取 Swift 的新内存所有权模型无疑会更具优势,只有那些对更细化控制有需求的开发人员才需要承担模型的复杂性代价。

“独占性原则”(Law of Exclusivity)会影响到所有的 Swift 开发人员,这一更改并非可选择添加的。它强制变量不能以冲突的方式同时访问,典型情况包括变量作为inout参数传入两个不同函数,以及方法所接收的回调访问了方法所调用的同一变量。这两种情况当前在 Swift 中是允许的,移除他们无疑将会影响到所有的开发人员。此外,独占性原则会更改对参数所做的保证,进而影响到语言的应用二进制接口(ABI),因此它会成为被率先采用的特性之一。

除了独占性原则之外,Swift 还将引入新的标注和语言特性,允许传递共享值以及表达无法隐式复制的类型。宣言的作者指出。在独占性、显示控制共享值传递和不可复制类型这三种机制的共同作用下,编译器可以对代码做更好的优化。

简而言之,可以将新 Swift 所有权模型的高层愿景概括如下:

  • 如上所述,编译器将会标注所有非独占性使用的inout参数,无论是显式的还是隐式的。
  • 开发人员将可以定义一个变量是具有所有权的还是共享的,以避免在进入或离开词法作用域时引用计数和做不必要的拷贝 / 销毁。
  • 开发人员将可以定义moveonly(即不可拷贝)类型,该类型对编译器不可复制,也不能用于创建更多的引用。moveonly类型具有 move 语义,被认为是一种高级特性。除此以外,所有类型将默认是可复制的。

宣言中为这一所有权模型定义所赋予 Swift 的全部特性给出了长篇的和详细的分析,宣言的细节内容仍非最终版本。Swift 开发人员 Alexis Beingessner发布了一篇更简短的文档,扼要地概括了宣言的要点。

查看英文原文: Swift Memory Ownership Manifesto


感谢张卫滨对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2017 年 3 月 07 日 18:001405
用户头像

发布了 226 篇内容, 共 59.6 次阅读, 收获喜欢 14 次。

关注

评论

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

架构师训练营第二周课后作业

天涯若海

极客大学架构师训练营

小白学算法:买卖股票的最佳时机!

王磊

Java 算法

狼人杀背后的秘密,实时语音你不知道的那些事

anyRTC开发者

音视频 WebRTC 语音 RTC 安卓

第6周作业

饭桶

企业级RPC框架zRPC

Kevin Wan

go RPC microser

Netty源码解析 -- 零拷贝机制与ByteBuf

binecy

Netty 源码剖析

天呐!价值2980元Java成神面试题竟在Github开源了

996小迁

Java 学习 架构 面试

极客大学 - 架构师训练营 第六周

9527

零基础IM开发入门(三):什么是IM系统的可靠性?

JackJiang

网络编程 即时通讯 IM

真香!天天996进不去阿里?看5年苦逼程序猿怎么逆袭阿里P7

小Q

Java 学习 架构 面试 程序猿

频繁操作本地缓存导致YGC耗时过长

AI乔治

Java 架构 JVM GC

在阿里内部,做Java到金字塔顶端的人平时都如何学习源码?

小Q

Java 学习 架构 面试 程序猿

Vidyo独特的互联网适应性

dwqcmo

音视频会议 集成架构 解决方案 智能硬件

数字货币交易所系统开发解决方案,撮合交易平台搭建

WX13823153201

数字货币交易所系统开发

数字“异化”生存

脑极体

阿里内部首发1000页涨薪面试宝典:Spring+SpringMVC+MyBatis框架整合开发实战

Java架构追梦

Java 源码 架构 面试 SSM框架

gRPC服务注册发现及负载均衡的实现方案与源码解析

网管

go 负载均衡 gRPC etcd 服务注册与发现

DeFi流动性挖矿系统开发技术方案

薇電13242772558

区块链 defi

深度对比Apache CarbonData、Hudi和Open Delta三大开源数据湖方案

华为云开发者社区

hadoop 开源 数据处理

如何获取变量token的值

测试人生路

软件测试 接口测试

JAVA稳定底层,快速开发首选,XJR智能化客户关系管理

Marilyn

敏捷开发 快速开发 软件架构 客户关系管理

极客大学 - 架构师训练营 第六周作业

9527

直播带货大战在即:账号交易灰产猖獗

石头IT视角

为产业AI去障:联想的边缘突破

脑极体

解惑“高深”的Kafka时间轮原理,原来也就这么回事!

华为云开发者社区

中间件 消息队列

码农会锁,synchronized 对象头结构(mark-word、Klass Pointer)、指针压缩、锁竞争,源码解毒、深度分析!

小傅哥

小傅哥 虚拟机 synchronized mark-word Klass Pointer

ConcurrentHashMap核心原理,彻底给整明白了

AI乔治

Java 架构 分布式 线程

第6周学习总结

饭桶

当 TiDB 与 Flink 相结合:高效、易用的实时数仓

Apache Flink

flink #TiDB

技术实践丨PostgreSQL开启Huge Page场景分析

华为云开发者社区

数据库 管理 内存

web worker的介绍和使用

程序那些事

多线程 Web Worker 异步模型 异步编程 web技术

Swift内存所有权宣言-InfoQ