Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
今だからこそ語れる Swift の魅力
Search
サポーターズ
January 31, 2017
0
190
今だからこそ語れる Swift の魅力
サポーターズ
January 31, 2017
Tweet
Share
More Decks by サポーターズ
See All by サポーターズ
ざっくり理解するクラウドの基礎
supporterz_kyoto
0
220
Featured
See All Featured
Designing the Hi-DPI Web
ddemaree
278
34k
WebSockets: Embracing the real-time Web
robhawkes
59
7.3k
Rebuilding a faster, lazier Slack
samanthasiow
78
8.6k
What the flash - Photography Introduction
edds
67
11k
The Invisible Customer
myddelton
119
13k
The Cost Of JavaScript in 2023
addyosmani
42
5.2k
No one is an island. Learnings from fostering a developers community.
thoeni
18
2.9k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
28
8.9k
Docker and Python
trallard
39
3k
Git: the NoSQL Database
bkeepers
PRO
425
64k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
363
22k
Making Projects Easy
brettharned
113
5.8k
Transcript
今だからこそ語れる Swift の魅力 2017/1/31 サポーターズ勉強会@京都 漆原 明博 (@U_Akihir0)
自己紹介 • 社会人三年目 – サーバーエンジニア@京都 • 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 の記述力 • スクリプト言語のような簡潔な記述が可能 – 型推論+クロージャ
Swift の記述力 • スクリプト言語のような簡潔な記述が可能 – 型推論+クロージャ
Swift の記述力 • スクリプト言語のような簡潔な記述が可能 – 型推論+クロージャ
Swift の記述力 • スクリプト言語のような簡潔な記述が可能 – 型推論+クロージャ
Swift の記述力 • スクリプト言語のような簡潔な記述が可能 – 演算子オーバーロード • 演算をカプセル化してコードをシンプルに e.g., 後置演算子を定義する例
Swift の記述力 • スクリプト言語のような簡潔な記述が可能 – エクステンション • 自然な形で欲しい機能の拡張が可能 e.g., 配列から特定の要素を削除
Swift の実行速度 • Swift は正しく書けば非常に高速に動作 – コンパイラバックエンドに LLVM を採用 (ObjC
も同様) • 様々な既存の最適化技術を適用可能 (例)
Link Time Optimization • リンク時に不要コードを検出して排除 – プログラム全体の最適化が可能に
Link Time Optimization • リンク時に不要コードを検出して排除 – プログラム全体の最適化が可能に
Link Time Optimization • リンク時に不要コードを検出して排除 – プログラム全体の最適化が可能に
Link Time Optimization • リンク時に不要コードを検出して排除 – プログラム全体の最適化が可能に
Profile Guided Optimization • 実行結果をもとに最適な制御グラフを構築 – 無駄な実行を減らすことができる
Profile Guided Optimization • 実行結果をもとに最適な制御グラフを構築 – 無駄な実行を減らすことができる
LLVM • 任意の言語に対応可能なコンパイラ基盤 (‘04) – Swift の作者が以前に作成していたもの • 現在は Apple
からテスラモーターズに転職 • LLVM-IR という中間内部表現 – Single Static Assignment (SSA) : 静的単一代入 – 多様で高度な様々な最適化パス
Swift のコンパイラアーキテクチャ • Swift コードは多段階にコンパイルされる Swift SIL LLVM-IR Objective-C Binary
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 を盛り上げていきましょう!