Upgrade to Pro — share decks privately, control downloads, hide ads and more …

GMTC 2019 - 在分歧中发展,2019 我们能用 Swift 做什么

GMTC 2019 - 在分歧中发展,2019 我们能用 Swift 做什么

Wei Wang

June 21, 2019
Tweet

More Decks by Wei Wang

Other Decks in Technology

Transcript

  1. 在分歧中发展
    2019,我们能⽤用 Swift 做什什么
    王 巍 (@onevcat)
    LINE ⾼高级软件⼯工程师

    View full-size slide

  2. ⾃自我介绍
    王 巍,@onevcat

    iOS Developer - 2010~

    Swift - 2014~

    Kingfisher,ObjC 中国组织

    LINE Corp ⾼高级软件开发⼯工程师

    负责开发者关系及开源事业相关 (私下是全栈⼲干⼯工程师)

    View full-size slide

  3. LLVM
    Chris Lattner

    View full-size slide

  4. Objective-C = iOS/macOS

    View full-size slide

  5. Swift = iOS/macOS?

    View full-size slide

  6. ⽬目录 为什什么是⼀一⻔门好语⾔言

    当前的处境和变化

    在 Apple 平台以外的使⽤用

    未来啊,你在哪⾥里里

    View full-size slide

  7. ⽬目录 为什什么是⼀一⻔门好语⾔言

    当前的处境和变化

    在 Apple 平台以外的使⽤用

    未来啊,你在哪⾥里里

    View full-size slide

  8. Fast Modern Safe

    View full-size slide

  9. 快速、现代、安全,但…为什什么?
    知其然,更更要知其所以然

    View full-size slide

  10. 最主要原因:有个好爹
    软件开发,特别是编程语⾔言开发,已经进⼊入了了拼爹时代

    View full-size slide

  11. 专⻔门的编译优化
    词法分析 语义分析
    AST
    Objective-C 编译器器
    LLVM
    IR

    View full-size slide

  12. 专⻔门的编译优化
    词法分析 语义分析 SIL ⽣生成
    AST
    Swift 编译器器
    SIL
    未加⼯工
    SIL
    标准型
    LLVM
    IR
    Swift Intermediate Language
    快速

    View full-size slide

  13. 专⻔门的编译优化
    SIL ⽣生成 SIL
    未加⼯工
    SIL
    标准型
    Swift Intermediate Language
    • 强制内联 (mandatory inline)

    • 基于 protocol 的泛型特化 (specification)

    • class 和 protocol 的去虚拟化 (devirtualization)

    • 编译时的边界检查

    • ….
    快速

    View full-size slide

  14. Value Type 和 Immutable 安全

    View full-size slide

  15. Copy on Write 快速
    friends

    View full-size slide

  16. Copy on Write 快速
    sayHello(to: friends)
    friends
    guests

    View full-size slide

  17. Copy on Write 快速
    sayHello(to: friends)
    friends
    guests

    View full-size slide

  18. Copy on Write 快速
    sayHello(to: friends)
    friends
    guests
    Copy

    View full-size slide

  19. 现代
    ⾼高效的函数式编程

    View full-size slide

  20. 现代
    ⾼高效的函数式编程
    运⾏行行时间 (s)
    0 0.375 0.75 1.125 1.5
    函数式
    命令式
    上⻚页代码以及等同的命令式程序对⽐比,循环 100,000 次,-O 编译

    View full-size slide

  21. 图⽚片来源:知乎⽤用户 题叶

    View full-size slide

  22. 完全避免 nil 崩溃 安全

    View full-size slide

  23. 完全避免 nil 崩溃 安全
    It was the invention of the null reference in 1965.

    I call it my billion-dollar mistake.
    查尔斯·安东尼·理理查德·霍尔爵⼠士:

    View full-size slide

  24. Swift 是⼀一⻔门优秀的语⾔言吗?
    毫⽆无疑问

    View full-size slide

  25. ⽬目录 为什什么是⼀一⻔门好语⾔言

    当前的处境和变化

    在 Apple 平台以外的使⽤用

    未来啊,你在哪⾥里里

    View full-size slide

  26. 我这⼏几年年每年年都学了了⼀一⻔门新语⾔言,它们分别是

    Swift 1,Swift 2,Swift 3,Swift 4…

    View full-size slide

  27. Swift 版本变迁
    2014
    Swift ß
    2015 2016 2017 2018 2019
    Swift 1 Swift 2 Swift 3 Swift 4 Swift 5
    ! ⼆二进制不不兼容 = 需要重新编译才能运⾏行行
    源码不不兼容 = 需要修改源码才能编译
    ! ! ! !
    公开

    View full-size slide

  28. Swift 5 ABI 稳定
    Application Binary Interface
    不不再会改动

    View full-size slide

  29. Swift 5 ABI 稳定
    iOS 12.1 或以前 iOS 12.2 或以后
    App Size 改善 ~10MB

    View full-size slide

  30. Apple ⾃自⼰己可以使⽤用 Swift 开发系统框架

    第三⽅方开发者可以发布⼆二进制框架 (Swift 5.1)

    App 下载尺⼨寸减⼩小

    加载速度变快…
    ABI 稳定的意义

    View full-size slide

  31. 数据来源: https://www.benfrederickson.com/ranking-programming-languages-by-github-users/
    GitHub Swift vs Objective-C

    View full-size slide

  32. 虽然⽤用的是 Swift
    但写出来的是 Objective-C

    View full-size slide

  33. Swift 的编程范式应该是怎样的

    View full-size slide

  34. Swift 的编程范式应该是怎样的

    View full-size slide

  35. 完全区别于 UIKit 的全新范式
    UIKit SwiftUI
    基本思维 命令式 声明式
    数据流 Target-Action
    Notification
    Binding
    Reactive
    基础类型 UIView class View protocol
    常⻅见架构 MVC DSL 描述

    View full-size slide

  36. Swift in LINE
    年年度 2018/05 2019/05
    语⾔言 40% Swift

    60% Objective-C
    60% Swift

    40% Objective-C
    Commit 12 万 14 万
    代码⾏行行数 120 万 150 万
    开发者⼈人数 ~100 ~100
    * 以上数据均为概算

    View full-size slide

  37. Swift in App
    Idea Demo Believer Application

    View full-size slide

  38. Swift in App
    Idea Demo Believer Application

    View full-size slide

  39. ⽬目录 为什什么是⼀一⻔门好语⾔言

    当前的处境和变化

    在 Apple 平台以外的使⽤用

    未来啊,你在哪⾥里里

    View full-size slide

  40. Swift on Server

    View full-size slide

  41. Swift ⼜又快⼜又安全,
    只做客户端是不不是太浪费?

    View full-size slide

  42. Swift Server Work Group (SSWG)
    SoS 项⽬目组

    View full-size slide

  43. 项⽬目 负责
    SwiftNIO Apple
    Logging API Apple
    Metrics API Apple
    Postgres Client Vapor
    Redis Client N/A
    HTTP Client SSWG
    APNS Clinet Vapor
    SoS 官⽅方筹划项⽬目

    View full-size slide

  44. SwiftNIO
    Netty for Swift
    • 异步事件驱动

    • ⾮非阻塞 IO

    • 基础的⽹网络底层协议实现

    • Apple 开源

    View full-size slide

  45. 基于 SwiftNIO 的⽹网络框架
    SwiftNIO
    Kitura-NIO
    Perfect-NIO

    View full-size slide

  46. Real World SoS
    objc.io

    View full-size slide

  47. Real World SoS
    vapor.code

    View full-size slide

  48. Real World SoS
    mxcl/Canopy

    View full-size slide

  49. 开发效率
    重构信⼼心
    内存占⽤用
    崩溃率
    周边⽣生态
    部署⼯工具
    开发者数
    现象级 app
    SoS 与其他⽅方案的优劣对⽐比

    View full-size slide

  50. Swift on Server
    Idea Demo Believer Application

    View full-size slide

  51. Swift on Web

    View full-size slide

  52. ⼩小孩⼦子才做选择,
    前端后端
    我全都要

    View full-size slide

  53. 任何可以使⽤用 JavaScript 来编写的应⽤用

    最终会由 JavaScript 编写
    — Atwood 定律律, 2007

    View full-size slide

  54. 将 Swift 编译成 JavaScript 有任何优势吗?

    View full-size slide

  55. Swift → JavaScript
    词法分析 语义分析 SIL ⽣生成
    AST
    Swift 编译器器
    SIL
    未加⼯工
    SIL
    标准型
    LLVM
    IR
    Swift Intermediate Language

    View full-size slide

  56. Swift → JavaScript
    词法分析 语义分析 SIL ⽣生成
    AST
    Swift 编译器器
    SIL
    未加⼯工
    SIL
    标准型
    JS
    Swift Intermediate Language

    View full-size slide

  57. • 已有成熟类似⽅方案 (TypeScript 等)

    • 运⾏行行速度难堪重任

    • 难以利利⽤用编译器器优化

    • 缺乏 Swift 标准库
    可⾏行行,但是...

    View full-size slide

  58. 软件开发也进⼊入了了拼爹时代

    View full-size slide

  59. Apple Microsoft Google Mozilla

    View full-size slide

  60. WebAssembly
    Apple
    Microsoft
    Google
    Mozilla

    View full-size slide

  61. WebAssembly 是什什么
    Binary instruction format for a stack-based virtual machine
    Portable target for high-level languages (C/C++/Rust)
    Enabling deployment on the web for client and server

    View full-size slide

  62. WebAssembly 是什什么
    C
    C++
    Rust
    Binary Web

    View full-size slide

  63. WebAssembly 驱动的⾼高性能项⽬目

    View full-size slide

  64. WebAssembly 驱动的⾼高性能项⽬目

    View full-size slide

  65. WebAssembly 驱动的⾼高性能项⽬目
    3D 游戏 在线编译 ⾳音视频处理理 加密/解密 AR/VR

    View full-size slide

  66. WebAssembly 驱动的⾼高性能项⽬目
    3D 游戏
    在线编译
    ⾳音视频处理理
    加密/解密
    AR/VR
    Windows/macOS/Linux

    View full-size slide

  67. WebAssembly 是什什么
    C
    C++
    Rust
    Binary Web

    View full-size slide

  68. 将 LLVM bitcode 编译为
    WebAssembly (.wasm)

    View full-size slide

  69. 词法分析 语义分析
    AST LLVM
    IR
    C/C++ Emscripten wasm
    Clang 前端
    LLVM
    BC
    emscripten 后端

    View full-size slide

  70. WebAssembly 是什什么
    C
    C++
    Rust
    Binary Web

    View full-size slide

  71. WebAssembly 是什什么
    Binary Web

    View full-size slide

  72. Swift → WebAssembly
    词法分析 语义分析 SIL ⽣生成
    AST
    Swift 前端
    SIL
    未加⼯工
    SIL
    标准型
    LLVM
    IR
    Swift Intermediate Language

    View full-size slide

  73. Swift → WebAssembly
    词法分析 AST
    Swift 前端
    LLVM
    IR
    Emscripten wasm
    LLVM
    BC
    emscripten 后端
    ……

    View full-size slide

  74. Swift → WebAssembly
    https://bugs.swift.org/browse/SR-9307 Build Swift packages targeting WASM
    https://reviews.llvm.org/D56188 Adopt SwiftABIInfo for WebAssembly
    https://github.com/apple/swift/pull/20684 Add minimal support … wasm
    在 Swift ⼯工具链中集成 emscripten?
    1. 为⼯工具链后端添加 WASM target

    2. 禁⽤用不不⽀支持的⽅方法

    3. WASM 版的 Swift 标准库

    4. 构建正确的 LLVM bitcode

    View full-size slide

  75. https://github.com/apple/swift/pull/24684
    [Swift+WASM] initial support for compiling Swift to WebAssembly
    swiftwasm.org

    View full-size slide

  76. ⽤用 Swift 操作 DOM?

    View full-size slide

  77. Swift DSL on HTML

    View full-size slide

  78. Swift on Web
    Idea Demo Believer Application

    View full-size slide

  79. 灵活易易学,⽣生态丰富
    动态解释,难以优化

    View full-size slide

  80. 灵活易易学,“⽣生态丰富”
    静态编译,“深层优化”

    View full-size slide

  81. Python 协作

    View full-size slide

  82. Call xxx from Swift
    @dynamicMemberLookup
    @dynamicCallable
    C API
    (Python, Ruby,
    etc…)
    .
    .
    .

    View full-size slide

  83. 性能考虑
    Graph Program Extraction

    Cloud TPU

    Google Colab Swift ⽀支持

    View full-size slide

  84. Swift on AI
    Idea Demo Believer Application

    View full-size slide

  85. Swift on IoT

    View full-size slide

  86. Swift on ARM, Linux
    https://github.com/uraimo/buildSwiftOnARM

    View full-size slide

  87. CPU:Cortex-A53 1.4GHz

    内存:1GB

    存储:SDCard 16GB+

    系统:Linux
    价格:¥300
    86x54 mm

    View full-size slide

  88. nRF9160 Cortex-M33 64MHz
    256 KB RAM
    1 MB Flash
    LTE, GPS, CryptoCell…
    ¥100
    10x16mm
    CC2640 Cortex-M3 48MHz
    20 KB RAM
    128KB Flash
    蓝⽛牙, AES-128
    ¥25
    7x7mm

    View full-size slide

  89. - Swift 编译器器“应该”是不不可能的

    - Swift 标准库也需要极度简化

    - Swift 业务代码在 LLVM IR 后

    与 C (Clang) 得到的驱动 link 后进⾏行行部署
    Swift on IoT
    Ref: Swifty Things: Programming the Internet of Things with Swift

    View full-size slide

  90. Swift on IoT

    View full-size slide

  91. Swift on IoT
    Idea Demo Believer Application

    View full-size slide

  92. ⽬目录 为什什么是是⼀一⻔门好语⾔言

    当前的处境和变化

    在 Apple 平台以外的使⽤用

    未来啊,你在哪⾥里里

    View full-size slide

  93. Swift 是⼀一⻔门通⽤用语⾔言
    App 开发
    新特性
    SwiftUI
    ABI 稳定
    周边⽣生态

    View full-size slide

  94. Swift 在分歧中发展
    脚本
    IoT
    AI
    ⽹网⻚页
    服务器器 …
    App 开发

    View full-size slide

  95. 道路路千万条,app 第⼀一条

    ⻋车道请选好,逆⾏行行两⾏行行泪

    View full-size slide

  96. THANKS!
    THANKS!
    THANKS

    View full-size slide