$30 off During Our Annual Pro Sale. View Details »

今だからこそ語れる Swift の魅力

サポーターズ
January 31, 2017
170

今だからこそ語れる Swift の魅力

サポーターズ

January 31, 2017
Tweet

Transcript

  1. 今だからこそ語れる Swift の魅力 2017/1/31 サポーターズ勉強会@京都 漆原 明博 (@U_Akihir0)

  2. 自己紹介 • 社会人三年目 – サーバーエンジニア@京都 • Java with Spring boot

    – 趣味で iOS アプリの開発 • TheWorld for iOS (Twitter クライアント) • Binder (SNS アプリ like 2ch) – 電気通信大学大学院卒 (‘14) • 研究 : JavaScript AOT JIT Compiler (with LLVM) – 就活ではサポーターズさんのお世話に! @U_Akihir0 uakihir0
  3. 何故今 Swift なのか? • 非常にポテンシャルの高い言語 – 記述力、実行速度、堅牢性等 • 破壊的な言語仕様の変更が一段落 –

    2016/9 に Swift 3.0 がリリース • 勉強がしやすい環境が整っている – Web、書籍 等様々なコンテンツが存在 – 年末のアドベントカレンダーを終えてさらに充実!
  4. Swift の記述力 • スクリプト言語のような簡潔な記述が可能

  5. Swift の記述力 • スクリプト言語のような簡潔な記述が可能 – 型推論 • 案外これが様々な箇所に効いてくる • 変数定義の際に右辺の型は推論される

  6. Swift の記述力 • スクリプト言語のような簡潔な記述が可能 – クロージャ • 簡潔な記述が可能で見通しの良いコードに 参考 :

    Objective-C (Blocks)
  7. Swift の記述力 • スクリプト言語のような簡潔な記述が可能 – 型推論+クロージャ

  8. Swift の記述力 • スクリプト言語のような簡潔な記述が可能 – 型推論+クロージャ

  9. Swift の記述力 • スクリプト言語のような簡潔な記述が可能 – 型推論+クロージャ

  10. Swift の記述力 • スクリプト言語のような簡潔な記述が可能 – 型推論+クロージャ

  11. Swift の記述力 • スクリプト言語のような簡潔な記述が可能 – 型推論+クロージャ

  12. Swift の記述力 • スクリプト言語のような簡潔な記述が可能 – 演算子オーバーロード • 演算をカプセル化してコードをシンプルに e.g., 後置演算子を定義する例

  13. Swift の記述力 • スクリプト言語のような簡潔な記述が可能 – エクステンション • 自然な形で欲しい機能の拡張が可能 e.g., 配列から特定の要素を削除

  14. Swift の実行速度 • Swift は正しく書けば非常に高速に動作 – コンパイラバックエンドに LLVM を採用 (ObjC

    も同様) • 様々な既存の最適化技術を適用可能 (例)
  15. Link Time Optimization • リンク時に不要コードを検出して排除 – プログラム全体の最適化が可能に

  16. Link Time Optimization • リンク時に不要コードを検出して排除 – プログラム全体の最適化が可能に

  17. Link Time Optimization • リンク時に不要コードを検出して排除 – プログラム全体の最適化が可能に

  18. Link Time Optimization • リンク時に不要コードを検出して排除 – プログラム全体の最適化が可能に

  19. Profile Guided Optimization • 実行結果をもとに最適な制御グラフを構築 – 無駄な実行を減らすことができる

  20. Profile Guided Optimization • 実行結果をもとに最適な制御グラフを構築 – 無駄な実行を減らすことができる

  21. LLVM • 任意の言語に対応可能なコンパイラ基盤 (‘04) – Swift の作者が以前に作成していたもの • 現在は Apple

    からテスラモーターズに転職 • LLVM-IR という中間内部表現 – Single Static Assignment (SSA) : 静的単一代入 – 多様で高度な様々な最適化パス
  22. Swift のコンパイラアーキテクチャ • Swift コードは多段階にコンパイルされる Swift SIL LLVM-IR Objective-C Binary

  23. SIL と LLVM-IR • SIL : Swift コンパイラにおける中間言語表現 – LLVM-IR

    と非常に似ている言語仕様 • LLVM-IR + Swift の構文要素という雰囲気 • 多段階の最適化を実施 – SIL : Swift の言語に依存する最適化 – LLVM-IR : プログラミング言語全般における最適化
  24. Swift の堅牢性 • Swift は正しく書けばバグが出にくい言語

  25. Swift の堅牢性 • Swift は正しく書けばバグが出にくい言語 – Null 安全 • Null

    が言語仕様上基本的に許容されていない • 近年 Null 安全の言語が急激に増えている – Swift, Kotlin, TypeScript (2.0), Hack, Rust ... • 様々な記事が出ているのでそこを参照 – null安全でない言語はもはやレガシー言語だ (2016/11) • http://qiita.com/koher/items/e4835bd429b88809ab33
  26. Swift の堅牢性 • Swift は正しく書けばバグが出にくい言語 – 型に非常に厳密 • 型の暗黙的変換が存在せず意識的に記述する必要 –

    変数がどの型かを意識してコーディングする必要
  27. Swift 3.0 • 最後の大規模破壊的変更として 2016/9 に公開 – Swift らしい記述へ各種 API

    の インターフェースが変更 – 各種文法的記法について変化が見られる箇所がある
  28. Swift の勉強環境 • コミュニティの充実 – 京都でももっとこういう機会があればいいな • 書籍やネットの情報も充実 – アドベントカレンダーは良い情報共有の機会

    – 詳解 Swift 第3版 が昨年末 に出たので読もう
  29. しかし. . .

  30. 導入の前に • Swift は銀の弾丸ではない – 現状採用を見送っている会社も多い • ではまだ Objective-C が現役

    • 仕様の不安定さが主な理由?
  31. 導入の前に • Swift は銀の弾丸ではない – 現状採用を見送っている会社も多い • ではまだ Objective-C が現役

    • 仕様の不安定さが主な理由? Swift 3.0 の登場により状況は好転
  32. Swift の学習コスト • 学習コストは決して安くない (私見) – プログラミング言語切り替えの丁度最中にいる • Swift のような言語仕様が今後もっと一般的になる?

    – 他言語に慣れている故の難しさもある – 他言語からの移植コストも安くはない
  33. Swift の学習コスト • 学習コストは決して安くない (私見) – プログラミング言語切り替えの丁度最中にいる • Swift のような言語仕様が今後もっと一般的になる?

    – 他言語に慣れている故の難しさもある – 他言語からの移植コストも安くはない 場合によっては導入しない決断も必要
  34. ここがツラいよ Swift さん • Null 安全 – Null 安全のプログラムを書くこと ≒

    Null の可能性を全部考慮したものを書く → しっかりこなすことが案外簡単ではない – 副次的なイニシャライザについての制約 • プロパティーの変数をすべて埋めないといけない
  35. ここがツラいよ Swift さん • プロトコル指向 – 機能面からオブジェクトを特徴付けする – 適当に言えば Java

    の Interface で特徴付けする – これ自体は習得に時間がかかるものではないが. . .
  36. ここがツラいよ Swift さん • プロトコル指向 – 機能面からオブジェクトを特徴付けする – 適当に言えば Java

    の Interface で特徴付けする – これ自体は習得に時間がかかるものではないが. . . UIKit と一緒に使うとパラダイムが混同 (iOS 開発だと避けられない宿命)
  37. ここがツラいよ Swift さん • コンパイラへのヒント – コンパイル、実行速度の面からプログラム中に コンパイラへのヒントを追加するパターンが多い • Xcode

    でエラーになるし一見不要にも見える – let, var ぐらいは自動で判定して欲しい? – mutating、@escape、convenience . . .
  38. ここがツラいよ Swift さん • GC への理解 – Swift ではメモリ管理の仕組みを知ることが必須 •

    Java とかではそこまで強く意識する必要はない • Objective-C でも同様なので Swift 固有の話ではない – 参照カウント GC • 循環参照にならないように弱い参照を使う必要 – プログラマが意識的に使用する必要がある – どんなパターンで起こるかを知っておく必要
  39. Swift の実装スタイル問題 • 自由ゆえに実装者によってスタイルが異なる – データ定義に クラス? 構造体? 列挙体?

  40. Swift の実装スタイル問題 • 自由ゆえに実装者によってスタイルが異なる – データ定義に クラス? 構造体? 列挙体? –

    複数の値の返り値に タプル? 構造体?
  41. Swift の実装スタイル問題 • 自由ゆえに実装者によってスタイルが異なる – データ定義に クラス? 構造体? 列挙体? –

    複数の値の返り値に タプル? 構造体? – オブジェクト指向? プロトコル指向?
  42. Swift の実装スタイル問題 • 自由ゆえに実装者によってスタイルが異なる – データ定義に クラス? 構造体? 列挙体? –

    複数の値の返り値に タプル? 構造体? – オブジェクト指向? プロトコル指向? – どこまで機能拡張を許容する? • エクステンション、演算子オーバーロード
  43. Swift の実装スタイル問題 • 自由ゆえに実装者によってスタイルが異なる – データ定義に クラス? 構造体? 列挙体? –

    複数の値の返り値に タプル? 構造体? – オブジェクト指向? プロトコル指向? – どこまで機能拡張を許容する? • エクステンション、演算子オーバーロード チーム開発の場合はまずルール作りを!
  44. Swift の未来

  45. 広がる Swift の世界 • Swift はシステム言語を目指している – 決して Apple デバイス専用言語ではない!

    – オープンソース化 (2015/12) • Mac だけでなく Linux でも動作をサポート • IBM が率先的に Swift で新しい試みを実施
  46. サーバーサイド Swift • 色々な実装が出てきており戦国状態 – Rails みたいなコレだというものはまだない – Kitura (IBM)

    – Vapor – Perfect – Swift 公式から上記の実装者集め公式に SS Swift の実装を進めていこうとする動きもある
  47. まとめ • Swift はまだ発展途上だが、モダンで魅力的な 機能を多様に備えた勉強する価値のある言語 – みんなで Swift を盛り上げていきましょう!