Swift 3の開発の振り返りとSwift 4の計画が記されたメールの紹介

2016年7月29日に流れてきた[[swift-evolution] Looking back on Swift 3 and ahead to Swift 4](https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20160725/025676.html)というメーリングリストの内容が興味深かったので、ざっと訳してみました。

Swift 3はオープンソース化されてから初のメジャーアップデートですが、それがどうであったかの振り返り(正式版リリースはまだされていなくて9月頃と見られています)や、次のバージョンであるSwift 4に向けてどのように開発していくのかが詳細に述べられています :eyes: 

Swift開発がオープンソースとしてとても良い感じに進められていて今後とも期待に持てる言語であることや、今後の方向性など知ってもらいたくて日本語記事にしました。

初めはこの呟き & ざっと眺める程度で良いかなと思ってましたが、メモしながら注意深く読むうちに展開したいなと思ってきて、こういう形にしました。

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">Swift 4について色々載ってる👀<br><br>[swift-evolution] Looking back on Swift 3 and ahead to Swift 4 <a href="https://t.co/BFzYDGh6F9">https://t.co/BFzYDGh6F9</a></p>&mdash; M Ono (@_mono) <a href="https://twitter.com/_mono/status/759230066568130560">July 30, 2016</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

一部抜けてたり意訳も多いので、正確なニュアンスを知りたい場合は原文読むことをオススメします。

---

# はじめに

- Swift 3リリースがまもなく(訳注: おそらく9月のAppleイベントのタイミング)なので、これまであったことを振り返り、次の1年に活かすのにちょうど良いタイミングである
- Swift 3は素晴らしいリリースになるだろうし、たくさんのことを含められたことが印象的である
- この実現に貢献したすべての人に、感謝する
- たくさんの新しい提案に闇雲に取り組む前に、今我々がどこにいるか評価して、大局的に見るのが良い
- メタな観点で: このメールはとても長く、たくさんのトピックを扱っているため、このメールに直接返信するのではなく、議論したい内容に合ったそれぞれの新規トピックとして行うのが良いでしょう(`[swift 4]`というタグをタイトルに含みましょう)


# Swift 3開発の振り返り

- オープンソース素晴らしい
	- とても雰囲気良く円滑に開発が行われて素晴らしかった
	- 優秀で熱心な開発者集団とともに取り組むのはファンタスティックだった
- オープンソースは、チャレンジングであった
	- `open design`は`closed design`と比べて予測しにくい
	- ただ、成果はより良くなるし、トレードオフはそれに値する
	- Swiftの発展に貢献してくれたすべての人にとても感謝したい
- ソフトウェア開発スケジュールを予測するのは困難である(オープンソースの場合はなおさら)
	- Swift 3にはとても高いゴールを設定し、その一部は間に合わずカットになってしまった(訳注: ABI安定化などのことを指していると思われる)
	- 高いゴールを設定するのは良いことではあるが、「ゴール(目標)」は「約束」では無いことを誤解無きよう周知したい
- 限られたトピックにフォーカスするのがコミュニティにとって良い
	- とても多くのことが同時進行しており、そのすべてをフォロー出来る者はいない
	- コアチームは、キーとなるディスカッションへの参加にフォーカスすることが重要である
	- Swift 3開発サイクルにおいて、レビュー期間が終わるまでの間にそのスレッドのフォローが間に合わなかった人々がたくさんいたことが問題であった
- 明確なゴールを持つことは、自由をもたらす
	- 特に12月〜1月、Swift 3に向けてのアイディアのスコープがあやふやであり、手に負えないようになったプロジェクトなどがあった
	- Swift 3リリースプロセスの後半では、明確なゴールを設定し(例えば`no additive proposals`など)、それは全員が重要なことにフォーカスすることをとても容易にした
- 全員をハッピーにすることは難しい、特に機能の取捨選択や優先付けにおいては
	- 何かを優先するということは、何かを後回しするということである
	- 1年のリリースサイクルに、すべての面白い試みを取り入れるのは不可能である
	- ただ幸いなことに、今後も何度もリリースがあり、それぞれのリリースは常に大きな改善を含む予定である

# Swiftのリリースプラン

これからの1年、コアチームは2つのメジャーリリースを予定している

- 2017年春: Swift 3.x
- 2017年秋: Swift 4

この2つのメジャーリリースに加えて、バグフィックス・corelibsや[swift.org](http://swift.org/)のプロジェクトに必要なサービスを含むマイナーリリース(Swift 3.0.1など)をしていく

# Swift 4のリリースサイクルプラン

- Swift 3の開発経験から、何に取り組むかをしっかり選ぶ必要があることを学んだ
- Swift 4へのメインのゴールは、3.0のソースへの後方互換性・標準ライブラリのABI安定化である
- コアチームは、2ステージのアプローチを取っていくことに決めた
	- ステージ1
		- ソース・ABI安定化に必要なことにフォーカスする
		- 既存言語のABIに本質的な変更を加えないもの・標準ライブラリのABIの破壊的変更に繋がるものは、このステージでは無視する
		- 例えば、[`conditional conformance`のようなGenerics機能](https://github.com/apple/swift/blob/master/docs/GenericsManifesto.md#conditional-conformances-)は、追加機能であるが、標準ライブラリの立て直しに繋がるので、ステージ1に含める
		- 一方、正規表現の言語サポートは、既存のAPIに影響せず、既存の標準ライブラリの大きな変更も必要ないので、ステージ1に含めない
	- ステージ2
		- ステージ1のためのデザイン・実装は最重要ではあり、その残りの時間で何が出来るかという観点で、その他必要な大きな言語機能を選ぶ
		- 楽観的に見て、今抱えているたくさんの機能リストからいくつか選ぶことは出来ると思っているが、どれくらい開発時間を充てられるかが分かるまでどれくらい出来るか分からない
	- 新しい機能に加えて、Swift 3に含められなかった、破壊的変更を含む受け入れ済みの提案について再評価する必要もある
		- それらの提案は必ずしも保障されたものではなく、Swift 4のゴールと照らし合わせながら、ケースバイケースでSwift 4に含むか評価していく必要がある
	- 最後に、これはswift-evolutionに特に限ったことではないが、品質・パフォーマンス向上への取り組みは大事にしていることを強調する
		- コアチームは、コンパイルバグ修正・エラー・警告メッセージの精度向上なども含む、品質向上を継続したいと思っている
		- パフォーマンスも、大事な開発テーマであるし、バイナリの実行速度向上・標準ライブラリの実装改善・コンパイル速度向上なども必要である
		- これらの作業はそれぞれのステージの中で必要になってくるだろう


## Swift 4のステージ1のゴール

ソースの後方互換・ABI安定化にむけて、コアチームはステージ1にまず必要なことを議論した。以下は、ステージ1の優先事項である。

- ソースの互換性: これは比較的小さいが、大事なことである
	- 例えば、`-std=swift3`というコンパイラーフラグが必要である
	- その他色々取組中だが、まだまだ途中である
- `Resilience`: 公開APIが長い間進化していくために必要である(ABI安定化があったとしても)
	- 例えば、C++の脆弱な基底クラス問題はSwiftに入れ込みたくない
	- Swift 3の開発スコープ内で、たくさんのデザイン・実装は済んだが、ユーザーの目に見えるところを含めてまだまだ不足がある(例えば、新しいアトリビュートなど)
- ABIの詳細: コード生成モデルには、監視・改善するべきたくさんの細かい詳細がある
	- それらは、swift-devに関わる者がほとんどで、swift-evolution固有の問題では無い
- 標準ライブラリに必要なジェネリクスの改善: このうち[`conditional conformances`](https://github.com/apple/swift/blob/master/docs/GenericsManifesto.md#conditional-conformances-)が最重要であろう
	- [`recursive protocol requirements`](https://github.com/apple/swift/blob/master/docs/GenericsManifesto.md#recursive-protocol-constraints-)やより強力なassociated type束縛がそれに続く
	- しかし、標準ライブラリの指導者たち[^1]は、残りの”_”プロトコル[^2]を最終的に取り除くには何が不可欠かブレイクダウンし、標準ライブラリのパブリックAPIが長期的に正しい方向に進むことを示す必要がある。
- 文字列の再評価: 文字列は最も重要な、言語の基本型である
	- 文字列に関するプログラミングモデルの様々な改善アイディアがある(`unicode-correct-by-default`モデルを危うくすることなく)
	- ゴールは、Perlより優れた文字列処理を行えるようにすることである
- メモリーオーナーシップモデル: Cyclone/RustにインスパイアされたメモリーオーナーシップモデルをSwiftに追加することは、システム系のプログラマーや予測可能で決定的なパフォーマンスが必要(リアルタイム音声プログラミングなど)なプログラマーに強く求められている
	- 本質的にABIに関わるものであり、Swift 4へのゴールとして機能は重要である
	- 型システム・名前修飾に、極めて大きなインパクトがある

これらは実装に向けてそれぞれある程度の考えがすでにあるが、とはいえ正式な提案書となるまでにはまだ時間がかかる。Swift 4開発サイクルの初期で正式な議論に入ることを望んでいる。そして、まだABI安定化に何が影響を与えるのか把握しきれておらず、その把握に連れて他の事項の追加などあり得る。最後に、Swift Package Managerやその他の[swift.org](http://swift.org/)プロジェクトの大事な改善のために、小さい機能に取り組む可能性もあることも付け加えておく。


## Swift 4のステージ2への努力

上に述べたとおり、現時点では割ける時間が不透明なため、ステージ2で達成出来ることは把握不可能である。コアチームは、Swift 4での開発をSwift 3開発サイクルの時よりも早めたいとも思っている。それによって、リリースサイクル後半でよりたくさんのバグフィックスが可能となり、また仕上げのために長い時間をかけられる。
楽観的に見て、提案された機能群のいくつかを選んで取り組むことが出来そうではあり、以下のようなものが候補である。ただしこれらはプラン・約束では無く、単なる候補の羅列であることを強調したい。

- リフレクション: コアチームはさらなる強力な動的機能を追加したいと思っている
	- 例えば、Swift 3はすでにデータリフレクションのために必要なインフラを導入済みである(Xcodeのメモリーデバッガーに活用されている, 訳注: [Xcode Visual Memory Debugger](http://useyourloaf.com/blog/xcode-visual-memory-debugger/)の記事が分かりやすい)
	- このインフラをAPIとして公開してさらに活用したい
	- 同様に、動的メソッドリフレクションランタイム・APIサポートのデザイン・実装をしたい
- 第一級クラスの並行性: アクター・async/await・原子性・メモリーモデルなどのトピックである
	- このエリアは皆から高く求められているものであり、クライアント・サーバーなどへの利用の扉を開けてくれるだろう
	- ステージ2で正式な議論をしたいと思っているが、デザイン・実装には12ヶ月以上は要すると思われ、つまり新しい並行モデルがSwift 4リリースに間に合わないのは明白である
	- これに取りかかる前に、メモリーオーナーシップモデルが理解されやすくすることも有意義である
- ジェネリクスの改善: [このジェネリクスの声明](https://github.com/apple/swift/blob/master/docs/GenericsManifesto.md)には、ジェネリクス機構に関するたくさんの非常に面白い改善が含まれている
	- このうち多数のものはABI安定化のために特に必要なものではないが、Swiftのジェネリクスをさらに強力かつ表現豊かにしてくれるものである
- `.swiftmodule`の安定化: どこかの時点で、`.swiftmodule`バイナリファイルフォーマットの安定化(あるいは他の機構への置き換え)が必要である
	- サードパーティーのバイナリーフレームワークのために
	- 標準ライブラリのABI安定化が済んだ上で、さらにたくさんの労力が必要である
- 新しいスクリプティング機能: 正規表現・複数行文字列のリテラルなど
	- これらによりSwiftが、スクリプティング・Web系の開発者にとってより魅力的になるだろう
- プロパティのふるまい: [SE—0030: Property Behaviors](https://github.com/apple/swift-evolution/blob/master/proposals/0030-property-behavior-decls.md)に記載されている
	- 既存のプロパティモデルに強力な抽象化を施してくれる
	- 訳注: リンク先に記載されているが、プロパティの細かい制御のためにいくつか実装パターンがあるがそれをコーディングで解決するのではなく言語仕様としてサポートするという提案のこと
- その他諸々: サブモジュール・暗黙的な数値型同士のプロモーション・C++ APIのインポート・`hygenic`マクロシステム・保障された末尾再帰・Enum型を列挙可能に・型付きの`throws`・ユーザー定義のアトリビュート・抽象クラス/メソッド・SIMDサポートの改善・`non-@objc`の`dyanamic`対応・データの並行性サポート・高階型変数など
- 糖衣構文: すべて列挙は出来ないが、他の言語で見られる特定の問題解決に役立つものなど様々な提案がある
	- これらは、Swift 4に向けては他のものと比べて最も優先度は低い


# 最後に

- 次の1年に向けて、何を考えているか、どういうアイディアがあるのかを示した
- 心にとめておいてほしいのは、Swift 3のリリースもまだ済んでいない、ということだ
- Swift 3リリースに向けてのソースの破壊的変更は済んだ(訳注: [[swift-evolution] Endgame for Swift 3](https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20160711/024424.html)にて7月27日に終えることが予告されていた)が、まだバグフィックスやその他品質改善作業のための時間があり、それらは依然とても重要な事項である
- このメッセージが、今後の議論・ステージ1を円滑に進めることにに役立つと思っている
- コアチームは、手に負えない大量の提案に忙殺されること・それらによってプロジェクトの重要事項への取り組みが妨げられること、が今後無いように取り組んでいる

---

というわけで、Swiftがオープンソースとしてすごく健全な形で、かつ開発スピードを落とさず(また落とさないような努力をしつつ)にかなり良い体制で進められているという印象を得られたのではないでしょうか。

Swift 2や3の時点で、モダンな言語仕様を多く取り入れてあったり安定性も高まり、すでに高い完成度の言語であると思っていますが、4以降でも貪欲に進化していく姿勢が垣間見れて、改めて今後がすごく楽しみとなりました(　´･‿･｀)

[^1]: guru : Apple内部の人など、標準ライブラリを何らかの形でリードできるポジションにいる人たちを指していると思われる。
[^2]: アンダースコアから始まる非公開プロトコルのこと。情報乏しいですがこちら参考まで: http://swiftdoc.org/v2.2/protocol/, http://swiftdoc.org/v2.2/protocol/_ArrayType/hierarchy/, http://stackoverflow.com/questions/36648890/implicit-public-access-to-bool-internal-type-builtin-int1-runtime-exception/36649246#36649246