WWDC 2024の講演で、AppleのLanguages and Runtimesチームのリーダーであり、SwiftのコアチームのメンバーでもあるTed Kremenek氏は、Swift 6の新しいデータ競合セーフモードを紹介した。このモードでは、新しいコンパイル時の静的検出機能により、開発者がデータ競合のない並行プログラムを作成できるようになると期待されている。
Kremenek氏が説明するように、Swift 5.5におけるasync/await
とアクター、Swift 5.6におけるsendable
分散アクター、Swift 5.9におけるカスタムエグゼキューターと分離アサーション、そして最終的にSwift 5.10における完全なデータ分離と分離されたグローバルの導入から始まり、データ競合の安全性への道はいくつかのSwiftバージョンに渡って開拓されてきた。
これら全ての機能は、完全なデータ競合安全性を可能にする新しいオプトイン・コンパイラー・モードにまとめられている。Swift 6は、コードの異なる部分が共有データにアクセスしたり変更したりするのを防ぐために、コンパイル時にデータ競合状態を識別することで、並行プログラミングを劇的に簡単にする、とKremenek氏は言う。
この新しいモードがオプトインである理由は、データ競合の安全性確保のために既存のコードへの変更を必要とする可能性があるからだ。多くの場合、それは「限定的」なものではあるが、とKremenek氏は言う。そのため、開発者は、コードに潜むデータ競合の問題に対処するために、いつ新しいモードを有効にするのが最適かを判断できる。
あるいは、開発者はモジュールごとに新しいモードを選択できる。これは、Swift 5の言語モードを使用しながら、コンパイラのアクター分離とSendable
チェックを警告として有効にすることで可能になる。
Appleはまた、既存のプロジェクトをSwift 6に移行し、コンパイラが生成する可能性のある一見膨大な量の警告に整然と対処するプロセスを通して、開発者を支援するためのいくつかのガイドラインを提供した。
主なアイデアは、モジュールを一つずつ移行し、他のモジュールにあまり依存していないものから始めることだ。こうすることで、必要な変更のほとんどをモジュールにローカルなものにできる。どのモジュールから始めるかを選択するもう1つの有用な基準は、プロジェクト全体で多くの警告を引き起こす可能性がある、安全でないグローバルステートや trivially-Sendable型を含むモジュールがあるかどうかを検討することである。
警告の数が、まだ快適に取り組むには多すぎる場合、Swift コンパイラは、特定のタイプの問題に焦点を当てるために、3つのきめ細かいスイッチを提供する。完全な同時実行チェックを有効にするための漸進的な道として、一度に一つずつ有効にできる。それらは、プロパティラッパーによって引き起こされるアクター分離推論を削除すること、グローバル変数に対して厳密な同時実行を適用すること、メソッドとキーパスリテラルの送信可能性を推論することを含む。
グローバル変数がどのように並行コンテキストで問題の原因となるかはよく理解されているが、他の2つのコンパイラオプションは、Swiftに特有の微妙な動作に対処している。特に、プロパティ・ラッパーは、Swiftコンパイラがコンテナ・クラスの分離を推測する方法を、開発者にとってかなり不透明な方法で変更する可能性があり、これは予期しない潜在的な問題(または、静的チェッカが有効になっている場合、警告)をもたらすだろう。同様に、パーシャル・メソッドや未適用メソッド、キー・パス・リテラルに対するセンダビリティの推測は、いくつかのコーナー・ケースに対処している。リンク先のSwift Evolution Proposalsで完全な議論を得られる。
最後のメモとして、もしあなたのSwiftコードベースが最新の言語リリースによってもたらされた並行処理機能にまだ対応していないのであれば、今こそそれらを使い始める時だ。コールバックベースの関数をラップして非同期コンテキストから直接使用可能にすることから始め、一時的に内部のみの分離を使用してクラスに分離を採用するなど、段階的に高度な並行性サポートを採用することをAppleは提案している。