cover_image

苹果新贵Swift之前世今生

Cocoa开发者社区
2014年06月12日 00:02

转自池建强微信分享


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

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

根据克里斯个人博客 Swift 的描述,这门语言几乎是他凭借一己之力完成的。这位著名的70后程序员同时还是 LLVM 项目的主要发起人与作者之一、Clang 编译器的作者,可以说 Swift 语言和克里斯之前的软件作品有着千丝万缕的联系。

同样是70后程序员,差别怎么那么大呢?

关于作者

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

注:很多计算机专业的大学生经常问我在大学里学点什么好,看看克里斯就行了。以目前的科技信息开放程度,如果你在自己感兴趣的领域里用心耕耘,再加上那么一点点天分,毕业时成为某一个专有领域的专家应该不是问题。那时就不是你满世界去找工作了,而是工作满世界来找你!

克里斯毕业的时候正是苹果为了编译器焦头烂额的时候,因为苹果之前的软件产品都依赖于整条 GCC 编译链,而开源界的这帮大爷并不买苹果的帐,他们不愿意专门为了苹果公司的要求优化和改进 GCC 代码,所以苹果一怒之下将编译器后端直接替换为 LLVM,并且把克里斯招入麾下。


克里斯进入了苹果之后如鱼得水,不仅大幅度优化和改进 LLVM 以适应 Objective-C 的语法变革和性能要求,同时发起了 CLang 项目,旨在全面替换 GCC。这个目标目前已经实现了,从 OS X10.9 XCode 5开始,LLVM+GCC 已经被替换成了 LLVM+Clang

Swift 是克里斯在 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,为什么我们不去基于现在的编译器设计一门全新的语言呢?一门属于苹果的语言!你看,邻居谷歌家里叫做 Go 的孩子不是玩耍正酣么?

于是 Swift 诞生了……

当然,事实的真相也可能是行动缓慢的乔老爷子把克里斯拉到一边说:

I want to be swift to……

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

于是 Swift 诞生了……

语法

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

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

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

3、支持各种高级语言特性,包括闭包、泛型、面向对象、多返回值、类型接口、元组、集合等。

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

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

  1. let ???? = "大狗菠萝"

  2. for n in ????{

  3. println( n )

  4. }

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

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

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

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

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

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

  1. let names = ["D", "B", "R", "C", "A"]

  2. func backwards(s1: String, s2: String) -> Bool {

  3. return s1 > s2

  4. }

  5. var rnames = sort(names, backwards)

事实上更简单的写法是:

var rnames = sort(["D", "B", "R", "C", "A"] ) {$0 > $1 }

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

  1. let str = "123A"

  2. let nn = str.toInt()

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

  1. if nn {

  2. println(nn!)

  3. }

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

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

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

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

给大家推荐一篇王巍 (@onevcat)写的「行走于 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 还是差那么一点点的(http://www.splasmata.com/?p=2798 )。

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

所码即所得(Playground

图片

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

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

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

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

1、学习:通过 Playground 学习 Swift,制作 Swift 教程实现交互式学习,同时还可以培训其他初学者。

2、代码开发:执行算法程序,迅速看到算法结果,跟踪变量;执行绘图程序,即时看到图像结果,及时调整。执行通用代码,查看变量的改变情况。

3、实验性代码:无需创建项目,直接打开一个独立的Playground文件即可编写代码,尝试调用新的 API

对于 Playground,设计者克里斯是这样描述的: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 语言的定位有关,作为一门系统级的服务器端语言,开发者的可选余地太大了,如果谷歌推出 Go 是用来取代 Java 开发 Android App,那可能情况就完全不一样了。

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

--------------------------------------

如果这篇文章对您或您的朋友有所帮助,您可以点击右上角的更多按钮 图片

分享给您的朋友们~ 图片

CocoaChina是全球最大的苹果开发中文社区,它的官方微信每日定时推送各种精彩的研发教程资源和工具,介绍app推广营销经验,最新企业招聘和外包信息,以及cocos2d引擎、cocostudio开发工具包的最新动态及培训信息。关注微信可以第一时间了解最新产品和服务动态!

请搜索微信号“CocoaChina”关注我们图片

继续滑动看下一个
Cocoa开发者社区
向上滑动看下一个