https://www.youtube.com/watch?v=odIedt8V1g0
今回は Swift.org の About Swift
から オープンソース
について記述されているところを眺めていきます。Apple はこれまでもソースを公開したりしてましたけれど、GitHub を使ったコミュニティーとして Swift を公開した転換点とも言えそうな大きなポイント。そんなところを感じつつ見ていけたらいいなって思ってます。よろしくお願いいたしますね。
——————————————————————————— 熊谷さんのやさしい Swift 勉強会 #11
00:00 開始 00:34 Swift.org とオープンソース 01:21 オープンソース 03:31 バグレポート 05:45 スタートアップガイド 07:16 プロジェクトの運営 09:19 Swift の構成 10:10 標準ライブラリー 12:27 コアライブラリー 12:45 LLDB デバッガー 13:34 エコシステム 15:48 構成における所管 19:25 コアライブラリーの詳細 21:02 コアライブラリーの機能 27:43 コアライブラリーの構成 29:21 Foundation 35:27 Dispatch 37:30 Darwin プラットフォーム 41:09 XCTest 43:43 実行環境 44:27 About Swift の所感と談笑タイム 47:53 About Swift の見どころ 51:42 オープンソース上の技術文書 56:31 クロージング ———————————————————————————
Transcription & Summarize : 熊谷さんのやさしい Swift 勉強会 #11
はい、じゃあ始めますね。前回まで、新機能やヌル安全など、技術的な部分についてお話ししてきましたが、今回からは「About Swift」というセクションに移ります。ここでは、Swiftの概要とオープンソースとしての側面についてお話しします。
まず、Swiftがオープンソースとして公開されていることについてです。SwiftはApache 2.0ライセンスに基づいて公開されていますが、これにはランタイムライブラリー例外が含まれています。このライセンスについて詳しく知ることは重要です。2015年12月3日から適用されており、Swift言語のコンパイラーやサポートライブラリ、デバッガー、パッケージマネージャーなどが含まれています。これは、今どきのプログラミング言語ではOpen Sourceが主流になっている中で、Appleが完全にオープンな姿勢を取るという大きな転換点でした。この時期にSwiftがオープンソースになったことで、大きな盛り上がりがあったのを覚えている方も多いでしょう。
バグレポートも大歓迎されています。実際にバグを見つけることは意外と多く、特にこういった勉強会で言語仕様を詳しく見ていると、バグに遭遇することもあります。バグを見つけた場合、GitHubにプルリクエストを送るなどして貢献するのも良いでしょう。
続いて、Swift.orgサイトに提供されている「スタートアップガイド」についてです。「The Swift Programming Language」という資料がリンクされていますが、これは非常に詳しく書かれており、Swiftを始めたばかりの方や、一通り理解した上で再度読み返すと新たな発見がある良い資料です。この勉強会でも、このガイドを題材にして、初心者から詳しい方まで一緒に学んでいけたらと思います。
また、Swiftの運営形態についても少し触れておきます。Swiftはコアチームとコミュニティーが協調して運営されており、基本的にはコアチームが主導していますが、コミュニティーとの共同作業が進められています。Appleの方針とコミュニティーの方針がうまく混ざり合いながら進化していくスタイルを取っています。
さらに、Swiftコミュニティーに貢献した人がコアチームに入ることもあるようです。日本の方でも林太郎さんがコミュニティーに貢献してAppleに入社したという話があります。こういった事例もあり、いろいろと夢の広がるところだと思います。
質問やコメントがあれば、参加者の皆さんで補足し合いながら進めていきましょう。 じゃあ、次にプロジェクト、このSwiftのプロジェクトの構成について見ていこうかなと思います。まず、Swift言語というのは複数のプロジェクトで構成されています。例えば、Swiftコンパイラーやコマンドラインから実行するswiftc
というコマンドなどです。それだけではなく、多くの要素があります。
コンパイラー本体のほかに、標準ライブラリというのがあります。これは言語仕様として組み込まれているライブラリで、明示的にコーディングする際にimport Swift
と書くものです。実際には書かなくても自動的にインポートされるものですので、これが標準ライブラリに該当します。この標準ライブラリの中には、基本的な機能が揃っています。
標準ライブラリには、たとえばArray
型やString
型などの馴染みの深いものも含まれています。これらがすべて標準ライブラリとして揃っているのです。それらを使ってSwiftの基本的な部分を組み上げていく感じですね。これらを見ると、標準ライブラリーが非常に膨大なものであることが理解できるでしょう。暇な時に眺めてみると、結構勉強になって面白いですよ。Swiftらしい感じを掴むためにも、標準ライブラリの定義を眺めてみるのがおすすめです。
また、標準ライブラリのほかに、コアライブラリというものがあります。これは標準ライブラリよりもさらに高度な機能を提供する目的のものです。他にも、LLDBデバッガーやSwiftのREPL(リアルタイムに評価・実行して結果を得られるもの)も含まれます。Playgroundを考えてもらうと大体合っているでしょう。
これらもSwiftプロジェクトの一環となっています。他にも、最近お世話になっているSwiftパッケージマネージャーや、XcodeでPlaygroundを実現するものなどもあります。REPLをXcodeに持ってくるような感じですね。
Swiftはこういった複数のプロジェクトで構成されています。この勉強会の中でも、こういった全体的なエコシステムについて話すことがありました。エコシステムという表現が適切だと思います。幅広くなっている言語で、それぞれ得意な分野があると思います。
例えば、コンパイラーが好きな人や、標準ライブラリが好きな人、コアライブラリが好きな人、デバッガーが好きな人など、それぞれの興味に応じて貢献できるのがいいところです。パッケージマネージャーはエコシステムを活用していく上で大事なポイントになってきますし、Playgroundもその特徴があって面白いです。
将来的にどれかに貢献したいという夢があるなら、焦点を絞ってがっつり取り組んでみるのも面白いかもしれません。Swiftコンパイラーをいじるためには、今のところC++が必要ですので、C++の知識がない人にとっては少し手強いかもしれません。しかし、Swiftの前提知識を持ってC++に触れられるため、C++の勉強としては良い題材かもしれません。高度な技術を学ぶ一環としても良いでしょう。
標準ライブラリはピュアなSwiftの中でほぼ完結している世界ですので、Swiftの経験があまりない人でも触りやすい部分です。 なので、それだけ前提知識があって積み込んでいけるので、この標準ライブラリーを狙ってみるのも面白いかもしれません。Coreライブラリーになってくると、OSの違いをクッションするというのかな、互換性とかも考慮しないといけなくなってきます。しかし、一応標準ライブラリーの上にCoreライブラリーがあることを考えると、そこまでハードルは高くないのかなと思います。
LLDBデバッガー周りは、自分にとっては神秘的な領域というか、なかなか派手なことをしていそうなイメージを持ちます。しかし、もしかするとプロセス周りの制御の仕方などに詳しい人であれば、結構やっていけるのかなと思います。パッケージマネージャーあたりは、求められる技術、というか言語知識が少なそうですが、その代わりに幅広いエコシステムを円滑に広げていく視野が求められそうです。そういったことを構築していく人にとっては面白いかもしれません。全部妄想ですが、今話しているのは。
他にも、Xcodeのプレイグラウンドサポートあたりは、この勉強会でもお世話になっているように、プレイグラウンドってなかなか有意義なツールだったりしますし、まだまだ可能性っていろいろあるような気がします。そのあたりを未来に向けて作っていく感じで関わってみたりとか。
こんなふうにいろんなプロジェクトがあるので、興味があったらぜひ続けてみてください。基本的には、ここまででAboutSwiftを全部見てこれたことになりますが、もうちょっと踏み込んで見ていっても面白いかと思います。そのあたりがSwift ORGの中に普通に書いてあるんですが、AboutSwiftの外側にあったので、ちょっと引っ張ってきました。そのあたりを見ていきましょう。
まず、コアライブラリの目的が書いてありました。標準ライブラリよりも高レベルの機能を提供するというのが大きな目的の一つです。それに加えて、Swiftがサポートするすべてのプラットフォームで利用可能なライブラリを目標にしているようです。おそらく結構実現されているんじゃないかと思います。
こういったところがポイントです。すべてのプラットフォームというのは、Swiftが目指している、前回お話したところですけど、LinuxとかWindowsとか、そういったところすべてで安心して使えるというのがコアライブラリです。
どんな機能を提供していくかというと、一般的に必要とされる型、データ型、URL型、文字セット、空白文字などです。あと特別なコレクション、いったい何でしょうね。例えば、Foundationあたりにあるコレクション以外に特別なコレクションはあまりなさそうな気がしますが、こういったあたりが一般に求められているものとしてコアライブラリに提供されています。
ただ、このあたりを見て思うんですけど、なんでデータ型がコアライブラリに所属して、配列型が標準ライブラリに入っているんだろうとか、URL型も、あくまで自分の感覚ではコアライブラリかなと思ったりします。文字セットもそうかなとか。色々と自分の主観ではしゃべれるんですが、どういったところがコアライブラリで、どういったところが標準ライブラリなのか、ちょっと曖昧かなと思います。
特にデータ型はOSに依存するかなと思いますが、例えば文字セットも同様です。現在の標準ライブラリにはString型が含まれていて、文字という文化にかなり近いところまで対応しています。具体的にはユニコードにかなり近いものです。プロパティも多く持っていたりするので、文字セットも標準ライブラリでいいんじゃないかとか、色々思うところはありますが、このあたりを厳密に区別する必要はないのかもしれません。とはいえ、このあたりの区別がきちんとしている方がいらっしゃったら、ぜひ教えてほしいです。Apple的にはきっと判断基準があるのでしょう。
そんなふうに、標準ライブラリよりも高レベルな、かつ一般的に必要とされる型が揃えられているとか、あと他にも日付型とか、Foundationコアライブラリによって提供されるものが挙げられます。
他にも単体テストや、ネットワークの機能のあくまでも原始的なところ、スレッドとかキュー通知(NSNotificationCenterという名称で呼ばれていたもの)、スケジューリングの機能、そして永続化もコアライブラリに含まれます。例えば、Codableは標準ライブラリに入っていますが。 あとは、日付や時刻のカレンダーは高度な機能なので、こちらに配置するのが適切だと思います。また、コアライブラリの重要な目的の一つに、OS固有の動作を抽象化するという点があります。現在は基本的にiOSやAppleプラットフォームを想定して利用されることが一般的ですが、将来的にはJavaのような立ち位置になることを目指しています。すなわち、コアライブラリを使用することでどのOSでも同じように動作することを保証するという点が、一番重要な役割だと考えています。
また、Swift.org内ではコアライブラリの目的として「ユーザープリファレンス」と記載されていますが、具体的に何を指しているのかははっきりしません。おそらく、ユーザーデフォルトのことを指しているのかもしれません。いずれにせよ、OSに寄り添いながらも、OSの抽象化を図り、どのOSでも動作可能なライブラリを目指しています。これがコアライブラリの本質です。これを理解しておくと、コアライブラリをインポートする際にその価値や重要性をより感じられると思います。
具体的にどのようなライブラリが提供されているかというと、Swiftのコアライブラリではこの3つが提供されています。最初のユーザープリファレンスのところですが、Androidだとシェアードプリファレンスがあるので、おそらく似たような機能を目指しているのでしょう。現在の状況は明確ではありませんが、Androidでコアライブラリを使用してユーザ設定を変更する場合、ユーザーデフォルトを介してシェアードプリファレンスにアクセスする、といったことが考えられます。それでは、コアライブラリの構成を見ていきましょう。この3つです。それぞれを簡単に見ていきます。
まず、Foundation
ですが、これは主にCocoaアプリケーションを作っている人やObjective-Cから開発をしている人には馴染みのある機能だと思います。ほぼすべてのアプリケーションに必要な基本機能を提供するために作られているものです。言語仕様には含まれていない機能や、標準ライブラリでは提供されていないパラダイムを導入することが目的です。パラダイムという言葉は大げさに感じるかもしれませんが、ノーティフィケーションセンターのような機能やデリゲートといった、Foundation
らしい書き方を指しているのかもしれません。
例えば、通知を投げてそれをどこかで監視する、またはデリゲートパターンのようなものです。これらの書き方が提供されることで、import Foundation
と書くだけで、特定のほぼ共通のコードの書き方になっていきます。Foundation
はOSを超えた互換性を持ち、コードの雰囲気も含めて助けになるフレームワークです。
面白かったのは、Objective-C
ランタイムから独立した機能として提供されているという点です。最近のFoundation
を見ていると、Objective-Cランタイムから独立していることが感じられます。このことは、特にObjective-CやSwift登場前からiOSやMacOSアプリを作成していた人には重要かもしれません。以前は、Foundation
といえばObjective-Cというのが普通でしたが、SwiftのFoundation
はOSや余計なランタイムからの依存を排除するアプローチを取っています。
実際に、Foundation
がオープンソースとしてSwiftのオープンソースプロジェクトに組み込まれたときから、既にObjective-Cランタイムではなく、Swift標準ライブラリ上でFoundation
を再実現するというコンセプトで進められています。これが、新しいFoundation
、いわば「ネオFoundation
」です。同じAPIをSwiftで実現しようという形で作られているため、過去と同じ名前がついていますが、全く新しいものであることに留意する必要があります。この点を考慮すると、Foundation
の捉え方がまた変わってくるかもしれません。 Foundationがなかったときには、Objective-Cは存在し得ないというか、NSObject
を継承するためにもFoundationが必要だったりして重要なライブラリだったからです。だからなおさら注意が必要です。Pure Swiftを目指すためにimport Foundation
を禁じる方法はSwift 1とか2の頃にはありがちでしたけど、今はそういう時代ではないですね。ここが個人的に面白いポイントでした。
他にも、Foundationにはローカライズ機能もあり、国際化(インターナショナリゼーション)や地域化(ローカライゼーション)など、アプリケーションには欠かせない機能を提供します。これでFoundationについては十分だと思います。
次に、グランドセントラルディスパッチ(GCD)についてです。これもObjective-Cから使っていた人にとっては非常に思い入れのあるライブラリですね。これもObjective-Cだけでなく、すべてのSwiftプラットフォームで動くようにリニューアルされました。もともとGCDはそこまでObjective-Cに依存していなかったかもしれません。いずれにせよ、SwiftではなるべくC言語のオープンな実装を使って、移植性の高いものを目指してGCDが作られました。そして並行処理が提供されています。
ただ、Swiftにasync
などの機能が言語仕様として組み込まれてくると、GCDもいらなくなってくるかもしれません。でも、しばらくはGCDのコードを見る機会は多いと思います。長い間活躍してきたライブラリなので、大事な存在であり続けると思います。
面白かったのは、GCDがすべてのDarwinプラットフォームで利用可能と書かれていたことです。その他にもLinuxやWindowsなどでも動作するのが目標とされています。この"Darwinプラットフォームで利用可能"という点に関しては、SwiftでCライブラリだけを使いたい時にimport Darwin.C
を行うなど、何かとDarwinという言葉が出てきます。DarwinはAppleが開発するUNIX系のOSです。macOSやiOS、watchOS、tvOSの基礎になっています。Darwin単体でIntel PCにOSをインストールすることもできるらしいです。興味のある方は試してみると面白いかもしれません。
LibDispatchについてはこのくらいにして、次はXCTestについてです。これはほぼおなじみですよね。Swiftで単体テストを書くための共通フレームワークです。もともとはXcode独自の機能のように捉えられていましたが、Xcode独自のテスト機能をSwiftに同じAPIで実現したものです。 なので、もうXcodeだからとか、そういう話ではなくて、すべてのSwiftプロジェクト、どんなOSのSwiftプロジェクトであってもこのXCTestというスタイルでテストを書いていけるというコンセプトのコアライブラリです。実際、このコアライブラリを使ってSwiftパッケージマネージャーはテスト機能を実現しています。
こんな感じでコアライブラリがざっと3つ挙げられました。特にXcodeの古いバージョン、例えばXcode 5や6などの頃からやっている人にとっては、何気なく延長線上にあるような感じがします。しかし、Swiftになってからコンセプトそのものが見直されて、新しい形で実装されているところがなかなか面白いところでした。
自分の中で、こんな感じで3つのコアライブラリが存在しています。実行環境については以前の勉強会で話しましたので、詳しく知りたい方はアーカイブを見ていただければと思います。とりあえず、複数の様々なプラットフォームでの実行を目標にしていて、OSを超えた互換性、ソースレベルでの互換性を目標としています。
これで一通り「About Swift」について見ていきました。なかなか長かったですね。個人的には「About Swift」をゆっくり見ていて、Swiftが大体どんな感じなのかがとても捉えやすく書かれている印象がありました。今回の勉強会を振り返るときに、もう一度自分で「About Swift」のページを見てみると、新たな発見があるかもしれません。特にSwiftをこれからやっていかなければならない方は、一度眺めてみるといいのではないかと思います。
みなさん、ここまで「About Swift」を見てきましたが、感想などはありますか?Swiftの印象がどう変わったとか、何か思ったことがあればぜひ教えてください。自分自身も話した通り、今改めて見てもいろんなことが見えてきて面白かったです。このような勉強会の場を作ってもらえて、とてもありがたく思っています。個人で繰り返し見るのは難しいこともありますが、こういう勉強会を通してやれると、自分にとってもみんなにとっても良いきっかけになるなーと思っています。
ぜひ、他にも感じたことがあればいつでも話したりコメントしたりしてください。「About Swift」には、いろんなことが書かれていて面白いですね。「Safe」「Fast」「Expressive」といったキーワードも懐かしいです。またコンパイラーのアーキテクチャについても、パースや意味解析、C言語インポーター、Swift Intermediate Language (SIL) ジェネレーション、ガランティードトランスフォーメーションズ、オプティマイゼーションズなどについて書かれていて、非常に興味深いです。
コンパイラー好きな人にとっては特に面白い内容だと思います。さらに、パッケージマネージャーのコンセプトや仕様例なども書かれていて、入門的なところを知るのに非常に便利です。 他にもドキュメンテーションとして、まず「The Swift Programming Language」があります。これがこの勉強会でじっくり見ていこうと予定している文章ですね。
その他に「API Design Guidelines」がありますが、その前にこれを見ておくと、Swiftを書くのがより簡単になるような速攻性のある内容も含まれている気がします。次回からこちらを見ていこうと予定しています。例えば、どのようにメソッドの名前を付けるべきかとか、どのようなルールで書くべきかなどがまとめられています。このガイドラインに目を通すことで、Swiftの書き方に自信が持てるようになるはずです。
また、この勉強会では「About Swift」しか取り上げていませんが、他にもいろいろなことが書かれているので、一通り流し読みでも良いので見ていただけると良いかと思います。さらに高度な内容を知りたい場合は、オープンソースの方、つまりGitHubのApple Swiftのリポジトリを見ると良いでしょう。この中にはドキュメントやABI(アプリケーションバイナリインターフェース)について詳しく書かれているものがあります。
例えば、Androidに関するドキュメントもあり、SwiftでAndroidアプリを開発するための内容が含まれています。昨今、SwiftでAndroidの開発が可能になりつつあり、それがどれほど動くのか非常に興味深いです。将来的にSwiftで書いたコードがAndroidでも動くようになれば、開発の幅が広がります。SwiftでAndroidの開発ができるようになるのは楽しい時代ですよね。また、SwiftのCoreライブラリやFoundationがAndroidでも利用できるようになれば、さらに便利です。
他には、async/await
やSwiftUIについても触れておきます。SwiftUIがAndroidでも使えるようになれば、iOSプログラマーにとっても嬉しいことでしょう。ただし、SwiftUIはAppleのHuman Interface Guidelineに従って作られているので、Material Designにどれだけ適用できるかが気になるところです。独自のUIガイドラインを作る必要があるのか、同じコードで両方のプラットフォームに対応できるのかを見極める必要があります。
SwiftUIのデザインは完全にAppleのHuman Interface Guidelineに従っており、タブの下にナビゲーションがあり、ナビゲーションにはプッシュ遷移やポップ遷移、その他必要になったモードの遷移が含まれています。これがAndroidや他のフロントエンドにどの程度適用できるかが興味深い点です。
なお、残念ながらSwiftUIは現在オープンソースではありません。オープンソースになるのを待ち望みつつ、技術力を高めておくと良いかもしれません。SwiftUIもそうですし、Combineなどもオープンソースになってほしいですね。もしかすると、もう少し落ち着いたタイミングでオープンソースにする計画があるのかもしれません。
他にも、古い資料が多いですね。例えば、6年前や7年前のものもあります。配列の基礎など、昔に確定した情報が含まれています。他のディレクトリにもドキュメントがあり、興味深い情報が得られるかもしれません。
以上でオープンソースやSwiftORGの面白い部分を見てきましたが、ちょうど良い時間になったので、今日の勉強会はこれで終わりにしようと思います。皆さん、お疲れ様でした。