Build Insiderオピニオン:小野将之(1)
Swift 3のリリース前に、これまでの進化の変遷をなぞる
Apple発のオープンソースなプログラミング言語「Swift」はこれまでにどのような進化の道のりをたどってきたのか。その道程を追い、その将来に思いはせるコラムが新登場!
本連載では、Swift言語の最新動向中心に述べていくが、その前にこの第1回ではこれまでのSwiftの進化の変遷をなぞっていきたい。Swift 3は2016年9月ごろに正式リリースとなりそうだが、今回はまず現最新版の2.2.1までについて触れていく。
Swiftとは
そもそも、Swiftが当時アップル社(Apple)からどのように発表されたかを今振り返るとなかなか興味深い。Swiftは、2014年6月に開催されたWWDC 2014のKeynoteで、突如発表された(驚くべきことに事前リーク・予想などもなかった)。
2014年に開催されたWWDCでのSwiftの発表
そこで、以下の4つの特徴を持つ言語として紹介された。
- 高速
- モダン(クロージャー、オプショナル型、ジェネリクス、型推論、タプル……)
- 安全
- インタラクティブ(REPL:対話実行環境、Playground)
また、Cocoaフレームワーク・ランタイムをObjective-C言語環境と共有しており、Objective-C言語を使った場合と同様に何の制限もなくアプリ開発が可能で、SwiftコードとObjective-Cコードとの混在もできることなどが強調された。
この発表直後から、Swiftは洗練された言語仕様などから大きな注目を集めたが、そこから現時点で2年ほどの短期間で大きな進化を遂げている。
Swift 2.2までの進化の変遷
これまで短いスパンでSwiftにはさまざまな改善が繰り返されてきたが、その説明のためにも、現時点での正式版最新の2.2.1までの進化の変遷をざっと見ておこう。
Swiftリリース以前
WWDC 2014での発表前に水面下でSwiftの開発がなされていた。
- 2010年半ば: Swiftの開発開始
- 2010年7月17日: Swiftリポジトリへのファーストコミット
- 2013年7月にSwiftの開発が、Apple開発ツールチームの主要目標となる(個人的なプロジェクトからアップル社公式のものに)
Lattner氏が2010年にファーストコミットした記録が残っている。Lattner氏のブログには、初めは1~数人程度の小規模で開発が進められ、Objective-C・Rust・Haskell・Ruby・Python・C#・CLUなどの言語が参考にされたことなどが記載されている。
2014年6月2日: WWDC 2014でSwiftの発表、ベータ版公開
そうして、WWDC 2014でSwiftのベータ版が発表された。同時に丁寧なドキュメントが、アップルのサイトやiBooksなどで公開され、Keynoteやセッションでは紹介されなかった細かい仕様も把握できたことで、素晴らしい言語仕様などが評判を集めた(Objective-Cへの不満が多かった反動も大きい)。この発表の時点で、すぐにでも実際のアプリを書き始められる状態であったものの、当時は少し書くだけでコンパイラーやXcodeがクラッシュしてしまうようなことも頻発しており、開発者はかなり苦労させられた。
この時期、9月の正式リリースまでは、バグ修正や言語仕様の細かい調整などがなされた。
以下に示すkoher氏の記事などからは、地味ながらドラスティックな調整がなされた経緯が見受けられ、今振り返っても興味深い。
- SwiftのArrayがヤバイ(ベータ2の段階)
- SwiftのArrayが実はすばらしかった(ベータ3の段階)
また、ベータ4でアクセス修飾子が導入されたことも印象に強く残っている。当初はこの仕様が欠けていたため、Swiftはこれを不要と見なしたのかと筆者は推測したが、単に間に合わなかっただけのようである。このことから、Swiftはまだまだ発展途中の言語であるとあらためて認識させられ、その成長に付き合う必要があり、またそれが楽しみと思うようになった。
2014年9月15日: Swift 1.0/Xcode 6の正式版リリース
そうしてベータ版のバージョンアップが重なるにつれて、段々とまともに動くよう(=「安定」といえないまでも開発に耐えられる状況)になってきた。そうした中で毎年恒例(9月)のアップル主催イベントでは正式版のリリースが発表され、9月15日に晴れてSwift 1.0正式版がリリースされた。
同年10月15日にはSwift 1.1/Xcode 6.1がリリースされた。Failable Initializer(初期化失敗時にnil
が返る)の導入など細かい改善はあったものの、Swift 1.1も安定性の向上がメインのアップデートで、言語仕様の目立った変更は少なめとなっていた(とはいえ特にオプショナル型周りの細かい調整などの破壊的変更は繰り返されていたが)。
2015年4月8日: Swift 1.2/Xcode 6.3の正式版リリース
Swift 1.1系までで、動作がかなり安定してきたこともあり、1.2以降は盛んに仕様改善・機能改善が行われるようになってきた。メジャーアップデートでないにもかかわらず、Swift 1.2ではたくさんの改善が施された。主要なものを以下に示す。
- ビルドの高速化:
- ビルドの遅さはSwiftへの不満点として、安定性の次に挙げられていたが、Swift 1.2では差分ビルドの導入などによってかなり改善された if-let
構文で、複数のオプショナル型の値のアンラップがサポート:
-それまでは値の個数分if-let
のネストが必要だった- ダウンキャストの結果がオプショナル型になった
let
で宣言した値のセットが、利用の直前まで許容されるようになったNSString
型からString
型などへの暗黙キャストの廃止- Objective-Cで
nullable
(Swiftから見たときにオプショナル型になる)などを宣言可能に - クラスのメソッドやプロパティを、
static
で宣言可能に @noescape
属性の追加Set
データ型の追加:
-セット(集合)を扱う場合、それまではNSSet
型を使ってしのいできたが、Set
型ではジェネリクス機能を使って型パラメーターに要素の型を指定することでセットをよりSwiftらしく扱えるようになった
ここではSwift 1.2での改善点を列挙したが、これは個々の項目を把握してほしいというよりは、主要なものをかいつまんだだけでもこれほどのボリュームになることをお分かりいただくためのものだ(詳細については今後の連載で補足していく予定である)。
2015年9月15日: Swift 2.0/Xcode 7の正式版リリース
2015年6月には、WWDC 2015でSwift 2.0が発表された。同時にオープンソース化(後述)を年末に予定していることもアナウンスされた。そうしてSwift 2.0は、Swift 1のときと同じく同年9月に正式リリースされた。ちょうど1年で初のメジャーアップと、かなり速いスピードで進化を遂げていることが分かる。
Swift 2.0での主な改善は以下の通りである。
try
、throw
、catch
によるエラーハンドリング:
-それまではこの仕様なしで済んでおり、エラーハンドリングはオプショナル型を利用したいわゆるEither
型などで補うのでは? と思われていたので意外な仕様追加であった。「Swift 2.0 のtry
、catch
ファーストインプレッション」に詳しい考察がある#available
ステートメント:
-OSやそのバージョンでの条件分岐をコンパイラーレベルで確実に行えるようにrepeat-while
ステートメント:
-C言語などでおなじみのdo-while
と同様の構文- Protocol extension:
-それまではプロトコルには必要なプロパティ/メソッドの羅列しかできなかったが、デフォルト実装を与えられるようになった。
-標準ライブラリもその影響を受け、変更があった defer
ステートメント:
-Go言語などでおなじみの「スコープを抜ける時に確実に実行される処理」を記述できるようにする構文guard
ステートメント:
-オプショナル型をアンラップしつつ、nil
だった時に早期return
をする構文- パターンマッチングの強化
Enum
型のジェネリクス対応
そして、同年10月20日には細かい変更を含んだSwift 2.1およびXcode 7.1の正式版がリリースされた。
2015年12月3日: GitHubでSwiftをオープンソースとして公開
WWDC 2015年で年末と予告されていた通り、同年12月3日にSwiftがオープンソースとして公開された(ライセンスはApache License 2.0)。Swiftリポジトリへのスターが1日で1万個を超えるなど、大変高い注目を集めた。
Swift 2.0は主に次のリポジトリから構成されていて、多くの機能が含まれていることが分かる。
- コンパイラー(clang + llvm):
-参考: Compiler Architecture - 標準ライブラリ:
-SourceKitというIDE機能用のフレームワークなども含まれる - コアライブラリ(Foundation + XCTest + libdispatch)
- Swift Evolution:
-今後のSwift言語の変更・提案などをまとめる場(議論はメーリングリストで行われる) - Swift Package Manager(SPM)
その他、細かいことはオープンソース化と同時に公開されたswift.orgに掲載されている。
オープンソース化されたことでmacOS以外でのプラットフォームでのSwiftの動作も可能となり、まずはLinux(Ubuntu)上で動くバイナリが提供された。さらに実際に、2016年2月22日、IBMがクラウドサービス「Bluemix」のSwift対応と、SwiftベースのWebフレームワーク「Kitura」を発表・公開し、実際にその成果が活用されつつある。
2016年3月21日: Swift 2.2/Xcode 7.2の正式版リリース
そして2016年3月21日、オープンソース化後、初となるバージョンアップが行われ、Swift 2.2がリリースされた。その中でも分かりやすいものとしては以下のような変更があった。
#selector
式の導入:
-Selector指定が文字列ではなくタイプセーフに行えるように- Swiftバージョンによるビルド切り替えオプションの導入
++
/--
記法が非推奨に- Cスタイルの
for
ステートメントが非推奨に __FILE__
識別子などが非推奨に(#file
識別子などに変更)
全てにGitHubのProposalへのリンクを張ってある通り、実際にGitHubを通じたバグ修正・機能追加が反映されていることが分かる。Swiftの開発への貢献の仕方はswift.orgのContributingの章(英語)に詳しく記載されている。
また目立つのが、非推奨になった仕様である。これまでは、バージョンアップのたびにコンパイルエラーが発生するような変更が多かったが、2.2ではバージョン3で予定されている仕様変更の前に緩やかに警告で追従を促すように変わり、Swiftが安定へ向かっていることが伺える。
その後マイナーアップデートがあり、2.2.1が2016年7月現在の最新である。
まとめ
と、ここまでで実質2年ほどにわたるSwiftの変遷を見てきた。紹介しきれなかった細かい変更点はCHANGELOG(英語)に全て載っている。
オープンソース化以前は、Swiftの言語仕様は素晴らしいものの、バージョンアップごとの変更点がありすぎることや、その開発フローがブラックボックスであることなど、Swiftの将来がどうなっていくのか見えにくいところがあった。オープンソース化で期待以上に多くのリソースが公開され、メーリングリストやGitHubを介したオープンな議論が見えるようになったことで、調べさえすればSwiftの今も未来も把握できるようになった。
オープンソース化のタイミングでSwift 3のロードマップが公開され、現在は2016年9月ごろのリリースに向けて着々と開発が進んでいる。第2回ではそのあたりの動向を分かりやすく紹介していく。
また、最後にお知らせとして、8月20日に「iOSDC Japan 2016」というiOSとその周辺技術に関するエンジニアのためのカンファレンス(400人規模)が開催される。3月に渋谷で開催されて世界中から著名なiOS/Swiftエンジニアが集結した「try!Swif」と同規模のカンファレンスであり、Swiftをきっかけに盛り上がりを見せていることが伺える。筆者も、本連載と関連した内容のSwiftのこれまでの動向のまとめと今後のさらなる発展の期待と題した15分のトークをするので、期待してほしい。
小野 将之(おの まさゆき)
学生時代から情報系の専攻、プログラミングのアルバイトなどでコンピューターに親しむ。
その後、大手SIerを経て、4年ほど前から複数のベンチャー企業でiOSアプリ開発をメインとするようになった。
SwiftはWWDC 2014年にベータ版が発表された直後から、ずっと触り続けている。
2015年からQiitaで多数の記事を書き、好評を集めている(http://qiita.com/mono0926)。
現在は株式会社Vikonaのエンジニアとして、JOIN USのiOS版アプリ開発に加えて、Ruby on RailsによるサーバーAPI開発もこなしている。
※以下では、本稿の前後を合わせて5回分(第1回~第5回)のみ表示しています。
連載の全タイトルを参照するには、[この記事の連載 INDEX]を参照してください。
1. 【現在、表示中】≫ Swift 3のリリース前に、これまでの進化の変遷をなぞる
Apple発のオープンソースなプログラミング言語「Swift」はこれまでにどのような進化の道のりをたどってきたのか。その道程を追い、その将来に思いはせるコラムが新登場!
2. Swiftは3.0で安定するのか? リリース予定日と新機能リスト
2016年後半のリリースが予定されているSwift 3。そのリリースに先駆けて、どんな変更点があるのか、懸案となっている互換性はどうなるのかなどを見ていく。
3. Swiftの開発体制、swift.org/Swift Evolutionリポジトリとは?
次期Swiftに搭載予定の新機能といった最新情報はどこで入手できるのか。Swiftについての情報を常にキャッチアップするために見ておくべきサイトを紹介する。
4. Swift 3.0でなぜ「Cスタイルのforループ」「++/--演算子」などの仕様が廃止されたのか
大規模な破壊的変更が行われる最終的なバージョンといわれているSwift 3.0がついに正式リリース。多数の変更から「廃止」となった言語仕様にフォーカスを当て説明する。
5. Swift 3.1のリリースプロセスおよびそれに含まれる変更内容の紹介(前編)
Swift 3.1のリリースが2017年春に迫ってきた。今回は前後編に分けて、そのリリースプロセスや変更内容を解説する。前編ではリリースプロセス/互換性/開発版のSwiftを利用する方法を取り上げる。