做者:terhechte,原文连接,原文日期:2018-05-03 译者:BigLuo;校对:Cee,numbbbbb;定稿:Forelaxhtml
我想你们应该都会赞成 Swift 是一门优秀的语言,很好的处理了那些简单与复杂的问题。理论上讲,它将会成为重要的编程语言之一。目前,Swift 的使用仅限于苹果开发领域(外加少许服务端 Swift 以及近期宣布的 Swift 版本的 Tensorflow)。前端
“My goal for Swift has always been and still is total world domination. It’s a modest goal”git
“我一直期待着 Swift 统治世界,这是一个谦虚的目标。”github
- Chris Lattner
随着新的泛型特性在 Swift 4.1 中推出以及 ABI 在 Swift 5 中逐渐稳定,Swift 彷佛逐渐具有了跳出苹果开发领域的条件。本文我会讨论一个我知道的问题,它阻碍着 Swift 普遍的应用,准确的讲,与其它问题同样,该问题也正在被开发社区着手解决。docker
我会简单介绍 Swift 在这个领域的竞争力。就像 C++ 同样,其它编程语言也渴望成为一个跨平台的通用的语言。经过比较 Swift 和其余语言处理相同问题上的方式,可让咱们该如何改进 Swift。数据库
Swift 拥有一个很是健康的开源社区,拥有大量杰出、精心编写且实用的开发框架。可是,这些开发框架多为 iOS(macOS 相对少不少)UI 库,这让 Swift 受限在这个开发领域。这里有不少 UI 动画库、UI 布局库、含有 UI 元素的框架、UI 协做库和 JSON 解析库。由于缺乏 UIKit/AppKit,它们中的大部分没法在 Linux 上运行。固然,这里也有一些相似于 Vapor 或 Kitura 的 Web 框架,致力于在 Web 开发领域推广使用 Swift 语言。编程
然而,与大众观点不一样,在 Linux 平台上,不少公司不只在 Web 服务端,也在 Linux 的其它方面作了大量的工做。先简单举个例子,有些编程语言能够管理系统,掌控系统权限,而且提供相应的开发工具和库。这些内容虽然和 iOS 或者 macOS 应用开发没有相关联,可是对于系统或者 Web 开发来讲极其重要。好比,数据库权限、系统文件管理、进程管理、日志分析与收集、容器管理、部署工具、甚至区块链工具。ubuntu
随着 Swift 4.1 的发布,在 Hacker News 上有一个讨论这门语言的帖子。我完整通读屡次后,以为回复颇有趣。让我感触最深的是下面的评论:swift
“相比 Go 和 Rust 在系统支持和库的量级方面,Swift 的系列库只有一小点儿......若是咱们列出其它编程语言在已发布的应用、数据库后端方面库的贡献,Swift 的数量基本能够忽略不计”后端
让咱们来看看这些竞争对手。
在最近几年,编程语言领域出现了几个新的有力的竞争者。固然,你也许并不一样意这些语言是 Swift 的合格竞争者。这里仅根据我我的的感受列举出几个编程语言,排名不分前后。
这些见解可能并不许确。请不要由于你是某个语言的粉丝,并认为个人说法存在错误,就把他们分享到 Twitter。我只是一个有着某些观点的普通人,而这些观点确实含有一些错误。相反,咱们能够利用这些精力来追问问题起因,并改善或解决问题自己。
Go 的发布时间比 Swift 早不少,它多用于开发系统工具,却不多在图形界面中使用。Go 不支持现代语言特性,如标签联合、泛型,或函数式编程。但它易上手,速度快,并使用了垃圾回收器,生成的二进制文件使得其内存消耗很是低。固然,垃圾回收器也使得 Go 在嵌入式开发和使用 Webassembly 变得有点棘手。
Go 良好的性能,语言的简单性和低内存占用率催生出了大量的系统工具和库。如:Grafana、Kubernetes、CoreOS-etcd、Go-Ethereum、CockroachDB、Hub、Terraform 等等。经过这个列表,咱们能够看到一个问题的多种解法。
简言之,若是你想作基于系统层面的开发,你能找到几乎全部你想要的依赖包。
Kotlin 像是 Android 版本下的 Swift,但其底层却彻底不一样。基于 JVM 的 Kotlin 使得它必须大量使用引用类型,就像 Go 的垃圾回收器使其在嵌入式系统的开发成为一个挑战。然而,Kotlin-Native 的出现让它在将来有了更多的可能性。Kotlin-Native 是基于 LLVM 构建的,支持嵌入式平台开发、Webassembly 等。Kotlin 也能被编译成 Javascript,Kotlin-Native 甚至可用于构建 iOS 应用的框架。
Kotlin 也可能会成为将来的一个主流语言,但和有着相同问题的 Swift 同样,其发展遇到了相似的阻碍。几乎全部可用的开源库集中在 Android 开发领域。而 Kotlin-Native 解决的是一个纯粹 JVM 语言所面临的问题。我不知道一个易于执行且轻量级的 Kotlin-Native 要如何实现(相比于 C++ 或 Swift,尤为是在嵌入式开发、复杂系统开发、或 Webassembly)。
Rust 是一个有趣的语言。事实上它是如此的有趣,我花了几个月的时间慢慢的学习它。这门语言的不少方面与 Swift 类似,但比 Swift 更难(这里咱们暂不作讨论,该部份内容将以主题的形式发布在博客)。彷佛这两种语言一开始就是采用彻底相反的设计思路;Swift 做为一个易学的语言起初是一些容易上手的特性,慢慢的添加复杂的特性。Rust 起初做为一门复杂的语言,它正在慢慢的增添一些更简单的抽象对象或更好的错误调试信息来让初学者容易上手。两种语言语法相似,这点我并不惊讶,直到将来的忽然某天,我意识到两门语言在某些简单和复杂特性上有着高度的类似性。然而,目前而言,在你经历一段复杂学习体验的后,便会发现 Rust 背后有提供了一些很是诱人的特性。
相对于 Swift,Rust 提供了更好的跨平台特性和一个虽难于处理但更高效的内存管理策略(好比在对象的生命周期和全部权方面),幸运的是,Rust 的一部份内存管理的优势将来也会在 Swift 上出现,同时它也支持 Webassembly(你能够用 Rust 写一个前端 App),也提供了很好的基础库让开发者可以快速的构建新项目,虽然它没有提供像 Go 同样数量级的高质量项目,但它也提供了一些有潜力的项目(CoreUtils,RedoxOS,TikV,Vagga,Servo,Parity)。但更重要的,如今已经有大量的 Rust 第三方库供你选择。你能够来看看看下这个列表。
这里还有像 D,Nim、Chrystal、Elixir、TypeScript 等语言,固然也包括 C++ 自身。
目前 Swift 在系统包管理领域有短板,这也是一个先有鸡还有先有蛋的问题。
“由于没有足够多的系统包,致使那些对 Swift 感兴趣的开发者在开发简单 Demo 应用时数据库处理不方便,从而对 Swift 失去兴趣,对 Swift 失去兴趣的开发者更不肯意去改善包管理了。”
对我而言,咱们须要改进咱们的系统包/库。若是咱们能用 Swift 写出 Kubernets 之类的东西,那必定很棒。为了实现这个项目,咱们须要一套好的基础库用于通常性的系统开发。下面我列出了基础的功能库和相关三方服务(此外,下面列出的功能,已经存在部分,不须要咱们重复造轮子)。
我认为,让 Swift 成为一门通用的语言,可以在非苹果操做系统上运行,Swift 须要提供一个健壮的、跨平台的包管理系统。
在你决定写 JSON 解析器,动画库、自定义的开关按钮,或者抽象的集合视图/表格视图的代码以前,考虑写一个跨平台的系统库。若是你不知道怎么作,你能够去看看 Go 和 Rust 提供的那些已有的库。
对于某些场景,Swift 的确提供了库,但那些库底层仍然是 C 的实现。虽然那样也搞定了问题,但在混合的过程当中引入了 C 这门不安全的语言,在那些要求绝对安全的执行案例中,咱们必需要为此作特别处理。固然,若是你想不到你想要写什么,能够用纯 Swift 实现一个你使用过的东西。这也是一个好机会,学习更多的 C 的同时进而爱上 Swift。
我最近用 Vapor 写了一个小应用,须要为它添加几个依赖库(好比:时间计数器)但大部分的现有的库只支持 iOS/macOS。 假如你有处理跨平台(因为没有 UIKit/AppKit 的依赖)的经验,能够尝试在 Linux 上测试编译 Swift。
这比听上去更简单。这里有一个可用的 Swift 4.1 版本的 docker 镜像,你能够直接运行它来测试你的代码,或者选择经过 Virtualbox 虚拟机来运行它。
若是你已经有了一个库,除了支持 CocoaPods 和 Carthage 外,请尝试支持 Swift Package Manager。
另外一件依旧困难的事情是 Swift 在 Linux 的 Foundation 库 是基于 iOS/macOS Foundation 库的二次实现,所以依旧存在些没有实现的特性和(特别棘手)bugs。这意味着也许你写在 Mac 上面的代码在 Xcode 中跑的很好,但因为 Linux Foundation 库的 bug,它运行在 Linux 上时可能会崩溃。为了拓展 Swift 的应用领域,让 Linux 上面的 Fundation 库代码变得更加健壮是一个很好的目标。
最简单的开始方式是去 Swift Jira 的首页搜索 Foundation bugs。
若是你没有时间或者对在 Swift Foundation 上的工做内容不感兴趣。你也能够在 Linux 上使用或者测试 Foundation 库,而且提交 bug 报告。只要有愈来愈多的人使用它,它也将变得更加稳定。
Linux 用户没有 Xcode,因此他们使用 Atom、Emacs、Vim 或 VSCode。这里已经有多个项目来让这些编辑器支持 Swift 语言编辑。但咱们也许可以改进它们。若是你有空闲时间,用你喜欢的编辑器参与到这些项目中来,进行测试提交问题或解决这些问题。
若是你刚好在 San Jose 参加今年的 WWDC。这是一个很好的学习机会。 你会碰见一些有趣的人,尝试参加在 San Jose 举办的 Try Swift 大会。
“你有机会为 Swift 作出贡献。加入一个 Swift 开源贡献者小组,讨论有关 Swift 开源项目的最新消息,而后在社区导师的帮助下为 Swift Evolution 作出本身贡献!”
在过去的一年半里,我没有太多时间作任何关于开源的工做,由于我一直忙于本身的(闭源)项目,但我真想再次为 Swift 开源代码贡献。我真的很喜欢 Swift,这是一个很棒的语言,帮助它成功的那些日子,是我曾感到最美妙的时光,若是你有一样的感受,请分享这篇文章。
若是对文章内容有想法的话,欢迎来 Twitter 上一块儿讨论
本文由 SwiftGG 翻译组翻译,已经得到做者翻译受权,最新文章请访问 swift.gg。