今だからこそ語れるSwift の魅力2017/1/31 サポーターズ勉強会@京都漆原 明博 (@U_Akihir0)
View Slide
自己紹介● 社会人三年目– サーバーエンジニア@京都● Java with Spring boot– 趣味で iOS アプリの開発● TheWorld for iOS (Twitter クライアント)● Binder (SNS アプリ like 2ch)– 電気通信大学大学院卒 (‘14)● 研究 : JavaScript AOT JIT Compiler (with LLVM)– 就活ではサポーターズさんのお世話に!@U_Akihir0 uakihir0
何故今 Swift なのか?● 非常にポテンシャルの高い言語– 記述力、実行速度、堅牢性等● 破壊的な言語仕様の変更が一段落– 2016/9 に Swift 3.0 がリリース● 勉強がしやすい環境が整っている– Web、書籍 等様々なコンテンツが存在– 年末のアドベントカレンダーを終えてさらに充実!
Swift の記述力● スクリプト言語のような簡潔な記述が可能
Swift の記述力● スクリプト言語のような簡潔な記述が可能– 型推論● 案外これが様々な箇所に効いてくる● 変数定義の際に右辺の型は推論される
Swift の記述力● スクリプト言語のような簡潔な記述が可能– クロージャ● 簡潔な記述が可能で見通しの良いコードに参考 : Objective-C (Blocks)
Swift の記述力● スクリプト言語のような簡潔な記述が可能– 型推論+クロージャ
Swift の記述力● スクリプト言語のような簡潔な記述が可能– 演算子オーバーロード● 演算をカプセル化してコードをシンプルにe.g., 後置演算子を定義する例
Swift の記述力● スクリプト言語のような簡潔な記述が可能– エクステンション● 自然な形で欲しい機能の拡張が可能e.g., 配列から特定の要素を削除
Swift の実行速度● Swift は正しく書けば非常に高速に動作– コンパイラバックエンドに LLVM を採用 (ObjC も同様)● 様々な既存の最適化技術を適用可能(例)
Link Time Optimization● リンク時に不要コードを検出して排除– プログラム全体の最適化が可能に
Profile Guided Optimization● 実行結果をもとに最適な制御グラフを構築– 無駄な実行を減らすことができる
LLVM● 任意の言語に対応可能なコンパイラ基盤 (‘04)– Swift の作者が以前に作成していたもの● 現在は Apple からテスラモーターズに転職● LLVM-IR という中間内部表現– Single Static Assignment (SSA) : 静的単一代入– 多様で高度な様々な最適化パス
Swift のコンパイラアーキテクチャ● Swift コードは多段階にコンパイルされるSwiftSILLLVM-IRObjective-CBinary
SIL と LLVM-IR● SIL : Swift コンパイラにおける中間言語表現– LLVM-IR と非常に似ている言語仕様● LLVM-IR + Swift の構文要素という雰囲気● 多段階の最適化を実施– SIL : Swift の言語に依存する最適化– LLVM-IR : プログラミング言語全般における最適化
Swift の堅牢性● Swift は正しく書けばバグが出にくい言語
Swift の堅牢性● Swift は正しく書けばバグが出にくい言語– Null 安全● Null が言語仕様上基本的に許容されていない● 近年 Null 安全の言語が急激に増えている– Swift, Kotlin, TypeScript (2.0), Hack, Rust ...● 様々な記事が出ているのでそこを参照– null安全でない言語はもはやレガシー言語だ (2016/11)● http://qiita.com/koher/items/e4835bd429b88809ab33
Swift の堅牢性● Swift は正しく書けばバグが出にくい言語– 型に非常に厳密● 型の暗黙的変換が存在せず意識的に記述する必要– 変数がどの型かを意識してコーディングする必要
Swift 3.0● 最後の大規模破壊的変更として 2016/9 に公開– Swift らしい記述へ各種 API の インターフェースが変更– 各種文法的記法について変化が見られる箇所がある
Swift の勉強環境● コミュニティの充実– 京都でももっとこういう機会があればいいな● 書籍やネットの情報も充実– アドベントカレンダーは良い情報共有の機会– 詳解 Swift 第3版 が昨年末に出たので読もう
しかし. . .
導入の前に● Swift は銀の弾丸ではない– 現状採用を見送っている会社も多い● ではまだ Objective-C が現役● 仕様の不安定さが主な理由?
導入の前に● Swift は銀の弾丸ではない– 現状採用を見送っている会社も多い● ではまだ Objective-C が現役● 仕様の不安定さが主な理由?Swift 3.0 の登場により状況は好転
Swift の学習コスト● 学習コストは決して安くない (私見)– プログラミング言語切り替えの丁度最中にいる● Swift のような言語仕様が今後もっと一般的になる?– 他言語に慣れている故の難しさもある– 他言語からの移植コストも安くはない
Swift の学習コスト● 学習コストは決して安くない (私見)– プログラミング言語切り替えの丁度最中にいる● Swift のような言語仕様が今後もっと一般的になる?– 他言語に慣れている故の難しさもある– 他言語からの移植コストも安くはない場合によっては導入しない決断も必要
ここがツラいよ Swift さん● Null 安全– Null 安全のプログラムを書くこと≒ Null の可能性を全部考慮したものを書く→ しっかりこなすことが案外簡単ではない– 副次的なイニシャライザについての制約● プロパティーの変数をすべて埋めないといけない
ここがツラいよ Swift さん● プロトコル指向– 機能面からオブジェクトを特徴付けする– 適当に言えば Java の Interface で特徴付けする– これ自体は習得に時間がかかるものではないが. . .
ここがツラいよ Swift さん● プロトコル指向– 機能面からオブジェクトを特徴付けする– 適当に言えば Java の Interface で特徴付けする– これ自体は習得に時間がかかるものではないが. . .UIKit と一緒に使うとパラダイムが混同(iOS 開発だと避けられない宿命)
ここがツラいよ Swift さん● コンパイラへのヒント– コンパイル、実行速度の面からプログラム中にコンパイラへのヒントを追加するパターンが多い● Xcode でエラーになるし一見不要にも見える– let, var ぐらいは自動で判定して欲しい?– mutating、@escape、convenience . . .
ここがツラいよ Swift さん● GC への理解– Swift ではメモリ管理の仕組みを知ることが必須● Java とかではそこまで強く意識する必要はない● Objective-C でも同様なので Swift 固有の話ではない– 参照カウント GC● 循環参照にならないように弱い参照を使う必要– プログラマが意識的に使用する必要がある– どんなパターンで起こるかを知っておく必要
Swift の実装スタイル問題● 自由ゆえに実装者によってスタイルが異なる– データ定義に クラス? 構造体? 列挙体?
Swift の実装スタイル問題● 自由ゆえに実装者によってスタイルが異なる– データ定義に クラス? 構造体? 列挙体?– 複数の値の返り値に タプル? 構造体?
Swift の実装スタイル問題● 自由ゆえに実装者によってスタイルが異なる– データ定義に クラス? 構造体? 列挙体?– 複数の値の返り値に タプル? 構造体?– オブジェクト指向? プロトコル指向?
Swift の実装スタイル問題● 自由ゆえに実装者によってスタイルが異なる– データ定義に クラス? 構造体? 列挙体?– 複数の値の返り値に タプル? 構造体?– オブジェクト指向? プロトコル指向?– どこまで機能拡張を許容する?● エクステンション、演算子オーバーロード
Swift の実装スタイル問題● 自由ゆえに実装者によってスタイルが異なる– データ定義に クラス? 構造体? 列挙体?– 複数の値の返り値に タプル? 構造体?– オブジェクト指向? プロトコル指向?– どこまで機能拡張を許容する?● エクステンション、演算子オーバーロードチーム開発の場合はまずルール作りを!
Swift の未来
広がる Swift の世界● Swift はシステム言語を目指している– 決して Apple デバイス専用言語ではない!– オープンソース化 (2015/12)● Mac だけでなく Linux でも動作をサポート● IBM が率先的に Swift で新しい試みを実施
サーバーサイド Swift● 色々な実装が出てきており戦国状態– Rails みたいなコレだというものはまだない– Kitura (IBM)– Vapor– Perfect– Swift 公式から上記の実装者集め公式に SS Swiftの実装を進めていこうとする動きもある
まとめ● Swift はまだ発展途上だが、モダンで魅力的な機能を多様に備えた勉強する価値のある言語– みんなで Swift を盛り上げていきましょう!