苹果新贵Swift之前世今生

苹果新贵Swift之前世今生

2010 年的夏天,Chris Lattner 接到了一

个不同寻常的任务:为 OS X 和 iOS 平台开发下一代新的程式语言。那时候贾伯斯还在以带病之身掌控着庞大的苹果帝国,他是否参与了这个研发计划,我们不得而知,不过我想他至少应该知道此事,因为这个计划是高度机密的,只有极少数人知道,最初的执行者也只有一个人,那就是 Chris Lattner。

从 2010 年的 7 月起,Chris 就开始了无休止的思考、设计、编纂程式和除错,他用了近一年的时间实现了大部分基础语言结构,之后另一些语言专家加入进来持续改进。到了 2013 年,该专案成为了苹果开发工具组的重中之重, Chris 带领着他的团队逐步完成了一门全新语言的语法设计、编译器、运行时、框架、IDE 和文档等相关工作,并在 2014 年的 WWDC 大会上首次登台亮相便震惊了世界,这门语言的名字叫做:「Swift」。

根据 Chris 个人部落格 对 Swift 的描述,这门语言几乎是他凭藉一己之力完成的。这位着名的 70 后工程师同时还是 LLVM 专案的主要发起人与作者之一、Clang 编译器的作者,可以说 Swift 语言和 Chris 之前的软体作品有着千丝万缕的联繫。

苹果新贵Swift之前世今生
关于作者

Chris 可以说是天才少年和好学生的代名词,他在 2000 年本科毕业之后,继续攻读电脑硕士和博士。但 Chris 并不是宅男,学习之余他手捧「龙书」游历世界,成为德智体美劳全面发展的好学生。之后就是一篇又一篇的发表论文,硕士毕业论文即提出了一套完整的运行时编译思想,奠定了 LLVM 的发展基础,就读博士期间 LLVM 编译框架在他的领导下得到了长足的发展,已经可以基于 GCC 前端编译器的语义分析结果进行编译优化和程式生成,所以 Chris 在 2005 年毕业的时候已经是业界知名的编译器专家了。

Chris 毕业的时候正是苹果为了编译器焦头烂额的时候,因为苹果之前的软体产品都依赖于整条 GCC 编译链,而开源界的拥护者并不买苹果的帐,他们不愿意专门为了苹果公司的要求优化和改进 GCC 程式,所以苹果一怒之下将编译器后端直接替换为 LLVM,并且把 Chris 招入麾下。 Chris 进入了苹果之后如鱼得水,不仅大幅度优化和改进 LLVM 以适应 Objective-C 的语法变革和性能要求,同时发起了 CLang 专案,旨在全面替换 GCC。这个目标目前已经实现了,从 OS X10.9 和 XCode 5 开始,LLVM+GCC 已经被替换成了 LLVM+Clang。

Swift 是 Chris 在 LLVM 和 Clang 之后第三个伟大的专案!

关于语言

2007 年之前,Objective-C 一直是苹果自家院落的小众语言,但是 iOS 行动装置的爆发让这门语言的普及率获得了火箭一般的窜升速度,截止到今天,Objective-C 在程式语言排行榜上排名第三,江湖人称三哥,大哥二哥分别是 C 和 Java 这样的老牌语言。同时,苹果在 2012 年和 2013 年分别对 Objective-C 进行了大规模的优化和升级改进,增加了各种现代语言的特性,让编写 App 更加容易,更多的工程师投入到了 App Store 的生态圈里……

在这种情况下,苹果公司为什幺会发布一门新语言呢?

这个问题没有标準答案,不过我们可以试着去分析一下,谈谈苹果的心路历程……

Objective-C 是 80 年代初 Brad Cox 和 Tom Love 发明的,1988 年贾伯斯的 Next 公司获得了这门程式语言语言的授权,并开发出了 Objective-C 的语言库和 NEXTSTEP 的开发环境。后来 Next 被苹果收购,Objective-C 阴差阳错成了苹果的当家语言。掐指一算,三十年倏忽而过,OC 也成长为爷爷辈的程式语言了。

为了伺候好这位「爷爷」,苹果煞费苦心,把 GCC 的编译链先替换成 LLVM +GCC,又替换成 LLVM+Clang,做语法简化、自动引用计数、增加 Blocks 和 GCD 多线程异步处理技术……终于,OC 在 30 年后重新焕发出勃勃生机,并佔据了兵器谱排名第三的位置。但是,苹果却有点烦了,OC 改进了这幺多年,怎幺看都像是在修修补补,用 Blocks 去实现一个类似 Python 的 lambda 闭包功能,看起来总是那幺彆扭。好吧,既然已经全盘掌握了 LLVM 和 Clang,为什幺我们不去基于现在的编译器设计一门全新的语言呢?一门属于苹果的语言!你看,邻居 Google 家里叫做 Go 的孩子不是玩耍正酣吗?

于是 Swift 诞生了……

当然,事实的真相也可能是行动缓慢的贾伯斯把 Chris 拉到一边说:

「I want to be swift to……」

「行了,您别说了,不就是想要 swift 吗,我这就给您做一个去」

于是 Swift 诞生了……

语法

Swift 是一门博採众长的现代语言,在设计的过程中, Chris 参考了 Objective-C、Rust、Haskell、Ruby、Python、C# 等优秀语言的特点,最终形成了目前 Swift 的语法特性。我在阅读了官方教程和做了些程式实验之后,自我感觉会喜欢上这门语言,在这里简单谈点感想,更深入的内容需要你们自己去深入学习。

1. Swift 是针对 Cocoa 和 Cocoa Touch 的程式语言、编译型语言,生产环境的程式都需要 LLVM 编译成本地程式才能执行,但是 Swift 又具备很多动态语言的语法特性和互动方式。

2. Swift 是一门类型安全的语言,可以帮助开发者清楚的掌控程式片段中的值类型。如果你期望输入的是字符串,类型安全的特性会阻止开发者错误地为其传递一个整数。这一切使得开发者能够更早的发现和修复错误。

3. 支援各种高级语言特性,包括闭包、泛型、物件导向、多返回值、类型接口、元组、集合等。

4. Swift 能与 Objective-C 进行混合程式,但程式分属不同的文件。

5. 全面的 Unicode 支持,你甚至可以用一只「狗」作为变量名,实现以下操作:

控制台会输出「大狗菠萝」四个字。

6. 程式语句取消了大部分语言使用的「;」分隔符,只有一行写多条语句时才需要分号。

7. 很多人简单阅读了 Swift 的数据类型,就认为 Swift 没有类似 Set、List 这样的数据结构,其实 Swift 提供了两种 Collection 的数据类型:Array 和 Dictionary,两个数据类型的表达式都用中括号标识。其中数组可以存储任意类型的变量,也可以强制声明存储同一种类型的变量。同时数组提供了类似 Set 功能,你可以修改、追加、替换和删除数据的元素。另外,Swift 还提供了 Tuple 的功能支援函数多返回值。

8. Swift 没有提供显式的指针,参数传递根据数据类型的不同分为值类型和引用类型,值传递进行内存拷贝,引用传递最终传递的是一个指向原有对象的指针。这一点和 Java 的参数传递是类似的。需要注意的一点是,Swift 里的数组和字典虽然都是结构体,但在参数传递过程中处理方式却不一样,默认 Array 是引用传递,Dictionary 是值传递。而在 Java 中,由于数组和 Map 都是对象,所以传递的都是指针。

在 Swift 中,如果你不想传递数组引用,可以用 copy 方法先複製一份出来,另外,也可以用 unshare 表示,本变量不传递指针。

9. 闭包,Swift 终于提供了一种优雅的闭包解决方案,比如在排序函数 sort 中进行函数传递:

事实上更简单的写法是:

10. 可选变量的引入主要是为了应对一个变量可能存在也可能是 nil 的情况,这种情况在很多高级语言里都存在。比如你想使用 String 的 toInt 方法将 String 转化为 Int 类型,但是你并不知道这个转化是否正常,这时候系统会返回一个可选变量,如果转换成功就返回正常值,转换失败就返回 nil,如下:

这是 nn 就是可选变量,想得到 nn 的值,可以通过 if 进行判断并藉着追加惊歎号获取变量值,如下:

可选变量的引入解决了大部分需要显式处理的异常,这部分工作也扔给编译器去做了。想了解更多可选变量的用法,请阅读苹果的官方文档。

11. Swift 中的 nil 和 Objective-C 中的 nil 不同。在 Objective-C 中,nil 是指向不存在对象的指针,而在 Swift 里,nil 不是指针,它表示特定类型的值不存在。所有类型的可选值都可以被设置为 nil,不只是对像类型。

12. Swift 没有从语言层面支持异步和多核,不过可以直接在 Swift 中复用 GCD 的 API 实践异步功能。另外没看到 Swift 的异常处理机制,可能有了可选变量,异常的使用会非常少吧。

关于语法相关的内容,先写这幺几点吧。

给大家推荐一篇王巍写的「行走于 Swift 的世界中」,深入阅读必有收穫。

基本上,Swift 绝对不是玩具语言,而是一门可以被大众接受的工业级程式语言。相信假以时日,Swift 必将在 App 开发领域大放异彩。

性能

Swift 在 WWDC 上展示出来的性能还是让人非常吃惊的,在进行複杂对象排序时,OC 的性能是 Python 的 2.8 倍,Swift 是 Python 的 3.9 倍;在实现 RC4 加密算法的时候,OC 的性能是 Python 的 127 倍,Swift 是 Python 的 220 倍。总之 Python 在某一个深坑里膝盖中箭了,OC 也没好到哪去,而 Swift,就是快啊就是快!

对于这一点我并不是很理解,首先是 WWDC 上展示的语言层面的基準测试过于简单了,另外,OC 和 Swift 都是被 LLVM 编译成本地程式执行的,理论上针对 Swift 的优化同样可以应用于 OC,但是 Swift 居然比 OC 快那幺一点点,难道 LLVM 单独针对 Swift 做了优化吗?我表示不明觉厉。

当然,还有更较真的工程师,他在第一时间针对于循环、递增、数组、字符串拼接等功能进行了测试,发现 Swift 的性能比 OC 还是差那幺一点点的。

无论这些测试数据是否準确,我觉得性能是我们最不需要担心的问题,苹果已经全盘掌握了这个语言的方方面面,从底层编译框架到编译器再到语言设计,优化之路才刚刚开始,我们只要给这门新语言一点耐心就可以了。

所码即所得
苹果新贵Swift之前世今生

对于开发者来说,Playground 是本次 WWDC 最大的亮点。能够在编辑程式的同时实时预览输出结果是每个开发人员的梦想,这一次苹果为大家提供了这样的福利。

Playground 不仅实现了很多脚本语言支持的互动式程式,而且提供控制台输出、实时图形图像、时间线变量追蹤等功能,开发者除了可以看到程式的实时运行结果,还能根据时间线阅读某个变量在程式片段中值的变化。这真是太棒了!

最初看到这个功能的时候我甚至以为每个 Swift 文件都可以基于 Playground 进行实时程式变化预览,仔细阅读文档后发现,只能在 XCode 提供的 Playground 文件中实现以上功能。看来 Playground 顾名思义,目前还只是为开发者提供了一个玩耍程式的地方。

当然不只是玩耍,我们可以基于 Playground 做这些事情:

  1. 学习:透过 Playground 学习 Swift,製作 Swift 教程实现互动式学习,同时还可以培训其他初学者。
  2. 程式开发:执行算法程序,迅速看到算法结果,追蹤变量;执行绘图程序,即时看到图像结果,及时调整。执行通用程式,查看变量的改变情况。
  3. 实验性程式:无需创建专案,直接打开一个独立的 Playground 文件即可编写程式,尝试调用新的 API。

对于 Playground,设计者 Chris 是这样描述的:Playground 功能倾注了我个人很多心血和激情,我希望新的程式语言具备更好互动性,更友好和有趣……我们希望通过这门语言重新定义「如何教授电脑科学!」

开始使用 Swift

作为一门新语言,Swift 定位非常明确,就是吸引更多的开发者加入苹果的软体生态圈,为 iOS 和 OS X 开发出更为丰富的 App,如果你是 App Store 的开发者,推荐儘早学习和掌握这门苹果力推的新语言。对于大部分新事物来说,越早介入,获利越多。如果你是一名 Web 相关的开发者,与其等待 Swift 增加 Web 开发的相关特性,还不如去学习一下 Go

语言 Web 程式。

如何开始 Swift 呢?
  1. 下载 Xcode6-Beta 版本。
  2. 下载 苹果官方提供 Swift 程式语言电子书 ,读。
  3. 下载 WWDC Swift 的 Session 影片和 PDF。看。
  4. 基于 Xcode6 创建 Swfit 语言的专案,在专案中创建 Playground,在其中除错玩耍。
  5. 根据官方提供的 GuidedTour.playground 学习 Swift 语法特性。
  6. 熟悉了基本的语法特性、与 OC 的混用、与 Cocoa 和 Cocoa Touch 的互动、除错等功能之后,就可以构建你的第一个 Swift App 了。

可以说 Swift 是我所见过关注度最高的新语言,一经推出即万众瞩目,媒体和开发者在数天之内对 Swift 进行了长篇累牍的报导和讨论,英文手册迅速被翻译成中文,即使是江湖上的另一位大佬谷歌 2009 年推出 Go 语言时也没有如此浩大的声势。当然,这和 Go 语言的定位有关,作为一门系统级的伺服器端语言,开发者的可选余地太大了,如果 Google 推出 Go 是用来取代 Java 开发 Android App,那可能情况就完全不一样了。

经过 WWDC2014,苹果已经完全体现出了一个软体公司的创新能力和技术底蕴,无论是操作系统,程式语言,还是应用开发,苹果都已经準备好了,凝神静气,蓄势待发。作为开发者,我们要做的就是:Write the code, Change the world,然后期待下一个收穫的季节!


上一篇:
下一篇: