在分歧中发展2019,我们能⽤用 Swift 做什什么王 巍 (@onevcat)LINE ⾼高级软件⼯工程师
View Slide
⾃自我介绍王 巍,@onevcatiOS Developer - 2010~Swift - 2014~Kingfisher,ObjC 中国组织LINE Corp ⾼高级软件开发⼯工程师负责开发者关系及开源事业相关 (私下是全栈⼲干⼯工程师)
WWDC 2014
LLVMChris Lattner
Objective-C = iOS/macOS
Swift = iOS/macOS?
⽬目录 为什什么是⼀一⻔门好语⾔言当前的处境和变化在 Apple 平台以外的使⽤用未来啊,你在哪⾥里里
Fast Modern Safe
快速、现代、安全,但…为什什么?知其然,更更要知其所以然
最主要原因:有个好爹软件开发,特别是编程语⾔言开发,已经进⼊入了了拼爹时代
专⻔门的编译优化词法分析 语义分析ASTObjective-C 编译器器LLVMIR
专⻔门的编译优化词法分析 语义分析 SIL ⽣生成ASTSwift 编译器器SIL未加⼯工SIL标准型LLVMIRSwift Intermediate Language快速
专⻔门的编译优化SIL ⽣生成 SIL未加⼯工SIL标准型Swift Intermediate Language• 强制内联 (mandatory inline)• 基于 protocol 的泛型特化 (specification)• class 和 protocol 的去虚拟化 (devirtualization)• 编译时的边界检查• ….快速
Value Type 和 Immutable 安全
Copy on Write 快速friends
Copy on Write 快速sayHello(to: friends)friendsguests
Copy on Write 快速sayHello(to: friends)friendsguestsCopy
现代⾼高效的函数式编程
现代⾼高效的函数式编程运⾏行行时间 (s)0 0.375 0.75 1.125 1.5函数式命令式上⻚页代码以及等同的命令式程序对⽐比,循环 100,000 次,-O 编译
图⽚片来源:知乎⽤用户 题叶
完全避免 nil 崩溃 安全
完全避免 nil 崩溃 安全It was the invention of the null reference in 1965. I call it my billion-dollar mistake.查尔斯·安东尼·理理查德·霍尔爵⼠士:“
Swift 是⼀一⻔门优秀的语⾔言吗?毫⽆无疑问
我这⼏几年年每年年都学了了⼀一⻔门新语⾔言,它们分别是Swift 1,Swift 2,Swift 3,Swift 4…“
Swift 版本变迁2014Swift ß2015 2016 2017 2018 2019Swift 1 Swift 2 Swift 3 Swift 4 Swift 5! ⼆二进制不不兼容 = 需要重新编译才能运⾏行行源码不不兼容 = 需要修改源码才能编译! ! ! !公开
Swift 5 ABI 稳定Application Binary Interface不不再会改动
Swift 5 ABI 稳定iOS 12.1 或以前 iOS 12.2 或以后App Size 改善 ~10MB
Apple ⾃自⼰己可以使⽤用 Swift 开发系统框架第三⽅方开发者可以发布⼆二进制框架 (Swift 5.1)App 下载尺⼨寸减⼩小加载速度变快…ABI 稳定的意义
数据来源: https://www.benfrederickson.com/ranking-programming-languages-by-github-users/GitHub Swift vs Objective-C
虽然⽤用的是 Swift但写出来的是 Objective-C
Swift 的编程范式应该是怎样的
SwiftUI
UIKit
完全区别于 UIKit 的全新范式UIKit SwiftUI基本思维 命令式 声明式数据流 Target-ActionNotificationBindingReactive基础类型 UIView class View protocol常⻅见架构 MVC DSL 描述
Swift in LINE年年度 2018/05 2019/05语⾔言 40% Swift60% Objective-C60% Swift40% Objective-CCommit 12 万 14 万代码⾏行行数 120 万 150 万开发者⼈人数 ~100 ~100* 以上数据均为概算
Swift in AppIdea Demo Believer Application
Swift on Server
Swift ⼜又快⼜又安全,只做客户端是不不是太浪费?
Swift Server Work Group (SSWG)SoS 项⽬目组
项⽬目 负责SwiftNIO AppleLogging API AppleMetrics API ApplePostgres Client VaporRedis Client N/AHTTP Client SSWGAPNS Clinet VaporSoS 官⽅方筹划项⽬目
SwiftNIONetty for Swift• 异步事件驱动• ⾮非阻塞 IO• 基础的⽹网络底层协议实现• Apple 开源
基于 SwiftNIO 的⽹网络框架SwiftNIOKitura-NIOPerfect-NIO
Real World SoSobjc.io
Real World SoSvapor.code
Real World SoSmxcl/Canopy
开发效率重构信⼼心内存占⽤用崩溃率周边⽣生态部署⼯工具开发者数现象级 appSoS 与其他⽅方案的优劣对⽐比
Swift on ServerIdea Demo Believer Application
Swift on Web
⼩小孩⼦子才做选择,前端后端我全都要
任何可以使⽤用 JavaScript 来编写的应⽤用最终会由 JavaScript 编写— Atwood 定律律, 2007
将 Swift 编译成 JavaScript 有任何优势吗?
Swift → JavaScript词法分析 语义分析 SIL ⽣生成ASTSwift 编译器器SIL未加⼯工SIL标准型LLVMIRSwift Intermediate Language
Swift → JavaScript词法分析 语义分析 SIL ⽣生成ASTSwift 编译器器SIL未加⼯工SIL标准型JSSwift Intermediate Language
• 已有成熟类似⽅方案 (TypeScript 等)• 运⾏行行速度难堪重任• 难以利利⽤用编译器器优化• 缺乏 Swift 标准库可⾏行行,但是...
软件开发也进⼊入了了拼爹时代
Apple Microsoft Google Mozilla
WebAssemblyAppleMicrosoftGoogleMozilla
WebAssembly 是什什么Binary instruction format for a stack-based virtual machinePortable target for high-level languages (C/C++/Rust)Enabling deployment on the web for client and server
WebAssembly 是什什么CC++RustBinary Web
WebAssembly 驱动的⾼高性能项⽬目
WebAssembly 驱动的⾼高性能项⽬目3D 游戏 在线编译 ⾳音视频处理理 加密/解密 AR/VR
WebAssembly 驱动的⾼高性能项⽬目3D 游戏在线编译⾳音视频处理理加密/解密AR/VRWindows/macOS/Linux
将 LLVM bitcode 编译为WebAssembly (.wasm)
词法分析 语义分析AST LLVMIRC/C++ Emscripten wasmClang 前端LLVMBCemscripten 后端
WebAssembly 是什什么Binary Web
Swift → WebAssembly词法分析 语义分析 SIL ⽣生成ASTSwift 前端SIL未加⼯工SIL标准型LLVMIRSwift Intermediate Language
Swift → WebAssembly词法分析 ASTSwift 前端LLVMIREmscripten wasmLLVMBCemscripten 后端……
Swift → WebAssemblyhttps://bugs.swift.org/browse/SR-9307 Build Swift packages targeting WASMhttps://reviews.llvm.org/D56188 Adopt SwiftABIInfo for WebAssemblyhttps://github.com/apple/swift/pull/20684 Add minimal support … wasm在 Swift ⼯工具链中集成 emscripten?1. 为⼯工具链后端添加 WASM target2. 禁⽤用不不⽀支持的⽅方法3. WASM 版的 Swift 标准库4. 构建正确的 LLVM bitcode
https://github.com/apple/swift/pull/24684[Swift+WASM] initial support for compiling Swift to WebAssemblyswiftwasm.org
⽤用 Swift 操作 DOM?
Swift DSL on HTML
Swift on WebIdea Demo Believer Application
Swift on AI
灵活易易学,⽣生态丰富动态解释,难以优化
灵活易易学,“⽣生态丰富”静态编译,“深层优化”
Python 协作
Call xxx from Swift@dynamicMemberLookup@dynamicCallableC API(Python, Ruby,etc…)...
性能考虑Graph Program ExtractionCloud TPUGoogle Colab Swift ⽀支持
Swift on AIIdea Demo Believer Application
Swift on IoT
Swift on ARM, Linuxhttps://github.com/uraimo/buildSwiftOnARM
CPU:Cortex-A53 1.4GHz内存:1GB存储:SDCard 16GB+系统:Linux价格:¥30086x54 mm
nRF9160 Cortex-M33 64MHz256 KB RAM1 MB FlashLTE, GPS, CryptoCell…¥10010x16mmCC2640 Cortex-M3 48MHz20 KB RAM128KB Flash蓝⽛牙, AES-128¥257x7mm
- Swift 编译器器“应该”是不不可能的- Swift 标准库也需要极度简化- Swift 业务代码在 LLVM IR 后与 C (Clang) 得到的驱动 link 后进⾏行行部署Swift on IoTRef: Swifty Things: Programming the Internet of Things with Swift
Swift on IoTIdea Demo Believer Application
⽬目录 为什什么是是⼀一⻔门好语⾔言当前的处境和变化在 Apple 平台以外的使⽤用未来啊,你在哪⾥里里
Swift 是⼀一⻔门通⽤用语⾔言App 开发新特性SwiftUIABI 稳定周边⽣生态
Swift 在分歧中发展脚本IoTAI⽹网⻚页服务器器 …App 开发
道路路千万条,app 第⼀一条⻋车道请选好,逆⾏行行两⾏行行泪
THANKS!THANKS!THANKS