Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

自己紹介 ● 社会人三年目 – サーバーエンジニア@京都 ● Java with Spring boot – 趣味で iOS アプリの開発 ● TheWorld for iOS (Twitter クライアント) ● Binder (SNS アプリ like 2ch) – 電気通信大学大学院卒 (‘14) ● 研究 : JavaScript AOT JIT Compiler (with LLVM) – 就活ではサポーターズさんのお世話に! @U_Akihir0 uakihir0

Slide 3

Slide 3 text

何故今 Swift なのか? ● 非常にポテンシャルの高い言語 – 記述力、実行速度、堅牢性等 ● 破壊的な言語仕様の変更が一段落 – 2016/9 に Swift 3.0 がリリース ● 勉強がしやすい環境が整っている – Web、書籍 等様々なコンテンツが存在 – 年末のアドベントカレンダーを終えてさらに充実!

Slide 4

Slide 4 text

Swift の記述力 ● スクリプト言語のような簡潔な記述が可能

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

Swift の記述力 ● スクリプト言語のような簡潔な記述が可能 – クロージャ ● 簡潔な記述が可能で見通しの良いコードに 参考 : Objective-C (Blocks)

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

Swift の実行速度 ● Swift は正しく書けば非常に高速に動作 – コンパイラバックエンドに LLVM を採用 (ObjC も同様) ● 様々な既存の最適化技術を適用可能 (例)

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

LLVM ● 任意の言語に対応可能なコンパイラ基盤 (‘04) – Swift の作者が以前に作成していたもの ● 現在は Apple からテスラモーターズに転職 ● LLVM-IR という中間内部表現 – Single Static Assignment (SSA) : 静的単一代入 – 多様で高度な様々な最適化パス

Slide 22

Slide 22 text

Swift のコンパイラアーキテクチャ ● Swift コードは多段階にコンパイルされる Swift SIL LLVM-IR Objective-C Binary

Slide 23

Slide 23 text

SIL と LLVM-IR ● SIL : Swift コンパイラにおける中間言語表現 – LLVM-IR と非常に似ている言語仕様 ● LLVM-IR + Swift の構文要素という雰囲気 ● 多段階の最適化を実施 – SIL : Swift の言語に依存する最適化 – LLVM-IR : プログラミング言語全般における最適化

Slide 24

Slide 24 text

Swift の堅牢性 ● Swift は正しく書けばバグが出にくい言語

Slide 25

Slide 25 text

Swift の堅牢性 ● Swift は正しく書けばバグが出にくい言語 – Null 安全 ● Null が言語仕様上基本的に許容されていない ● 近年 Null 安全の言語が急激に増えている – Swift, Kotlin, TypeScript (2.0), Hack, Rust ... ● 様々な記事が出ているのでそこを参照 – null安全でない言語はもはやレガシー言語だ (2016/11) ● http://qiita.com/koher/items/e4835bd429b88809ab33

Slide 26

Slide 26 text

Swift の堅牢性 ● Swift は正しく書けばバグが出にくい言語 – 型に非常に厳密 ● 型の暗黙的変換が存在せず意識的に記述する必要 – 変数がどの型かを意識してコーディングする必要

Slide 27

Slide 27 text

Swift 3.0 ● 最後の大規模破壊的変更として 2016/9 に公開 – Swift らしい記述へ各種 API の インターフェースが変更 – 各種文法的記法について変化が見られる箇所がある

Slide 28

Slide 28 text

Swift の勉強環境 ● コミュニティの充実 – 京都でももっとこういう機会があればいいな ● 書籍やネットの情報も充実 – アドベントカレンダーは良い情報共有の機会 – 詳解 Swift 第3版 が昨年末 に出たので読もう

Slide 29

Slide 29 text

しかし. . .

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

導入の前に ● Swift は銀の弾丸ではない – 現状採用を見送っている会社も多い ● ではまだ Objective-C が現役 ● 仕様の不安定さが主な理由? Swift 3.0 の登場により状況は好転

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

ここがツラいよ Swift さん ● Null 安全 – Null 安全のプログラムを書くこと ≒ Null の可能性を全部考慮したものを書く → しっかりこなすことが案外簡単ではない – 副次的なイニシャライザについての制約 ● プロパティーの変数をすべて埋めないといけない

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

ここがツラいよ Swift さん ● プロトコル指向 – 機能面からオブジェクトを特徴付けする – 適当に言えば Java の Interface で特徴付けする – これ自体は習得に時間がかかるものではないが. . . UIKit と一緒に使うとパラダイムが混同 (iOS 開発だと避けられない宿命)

Slide 37

Slide 37 text

ここがツラいよ Swift さん ● コンパイラへのヒント – コンパイル、実行速度の面からプログラム中に コンパイラへのヒントを追加するパターンが多い ● Xcode でエラーになるし一見不要にも見える – let, var ぐらいは自動で判定して欲しい? – mutating、@escape、convenience . . .

Slide 38

Slide 38 text

ここがツラいよ Swift さん ● GC への理解 – Swift ではメモリ管理の仕組みを知ることが必須 ● Java とかではそこまで強く意識する必要はない ● Objective-C でも同様なので Swift 固有の話ではない – 参照カウント GC ● 循環参照にならないように弱い参照を使う必要 – プログラマが意識的に使用する必要がある – どんなパターンで起こるかを知っておく必要

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

Swift の未来

Slide 45

Slide 45 text

広がる Swift の世界 ● Swift はシステム言語を目指している – 決して Apple デバイス専用言語ではない! – オープンソース化 (2015/12) ● Mac だけでなく Linux でも動作をサポート ● IBM が率先的に Swift で新しい試みを実施

Slide 46

Slide 46 text

サーバーサイド Swift ● 色々な実装が出てきており戦国状態 – Rails みたいなコレだというものはまだない – Kitura (IBM) – Vapor – Perfect – Swift 公式から上記の実装者集め公式に SS Swift の実装を進めていこうとする動きもある

Slide 47

Slide 47 text

まとめ ● Swift はまだ発展途上だが、モダンで魅力的な 機能を多様に備えた勉強する価値のある言語 – みんなで Swift を盛り上げていきましょう!