この記事の要点
- Swift 6 では、Swift 6 language mode を有効にしたコードに対して、コンパイル時のデータ競合安全性チェックが導入されました。モジュールごとに段階的に有効化できますが、エコシステム全体でデータ競合安全性を進めるには、オープンソースパッケージ全体での早期採用が鍵になります。
- Swift Package Index に新しく追加された Ready for Swift 6 ページは、パッケージエコシステム全体のデータ競合安全性への進捗を可視化します。各パッケージが実際に Swift 6 language mode を採用しているかどうかにかかわらず、
completeの strict concurrency チェックを全パッケージに対して有効にした場合に何件が通過するかを集計しています。 - Swift Package Index は Swift 6 の nightly toolchain を使って 5 月初旬からこのチェックを実行しており、データ競合エラーのないパッケージの割合は記事公開時点で 43% を超えました。Swift 6 ベータ開始からわずか 1 週間での数字です。
- データ競合エラーのないパッケージには「Safe from data races」ラベルが表示されます。ただし Swift 6 互換性(compatibility)の緑チェックと、データ競合安全性は別の指標である点に注意が必要です。
何が発表されたのか
Swift 6 は、Swift 6 language mode を opt in したコードに対して、コンパイル時のデータ競合安全性チェックを行います。データ競合はクラッシュ・一貫性のない挙動・性能問題の原因になるため、アプリとその依存パッケージが早期にこのチェックを有効化することが望まれます。
モジュールは依存先とは独立に段階的に Swift 6 language mode を採用できますが、データ競合安全性の効果が完全に得られるのは、すべてのモジュールが採用したときです。そこで本記事では、エコシステム全体の進捗を追跡する仕組みとして、Swift Package Index の新しい Ready for Swift 6 ページが紹介されています。
このページは、パッケージが自分の都合で Swift 6 language mode を採用しているかどうかとは別に、「もし全パッケージに対して strict concurrency チェックを有効にしたら何件が通過するか」を示します。つまり、エコシステム全体がデータ競合安全に近づいている度合いを俯瞰できる指標です。
何に使えるのか
エコシステム全体の進捗を追う
Ready for Swift 6 ページでは、データ競合エラーのないパッケージ数の推移を時系列で確認できます。記事公開時点では、Sendable 適合がより多く追加されたプラットフォーム SDK の恩恵もあり、データ競合エラーゼロのパッケージが 43% を超えていました。
今後の進捗は 2 つの方向から進むと説明されています。1 つは、より多くのパッケージがチェックを有効化し、コンパイラが指摘した潜在的なデータ競合を作者が修正していくこと。もう 1 つは、コンパイラの改良によってデータ競合チェックが洗練され、診断が整理されていくことです。
個々のパッケージのデータ競合安全性を確認する
Swift Package Index は、complete の strict concurrency チェックでエラーゼロになるパッケージに対して、「Safe from data races」ラベルを他のメタデータと並べて表示します。あるパッケージにデータ競合安全性の問題が報告されていないかを、採用前に判断する材料になります。
互換性とデータ競合安全性の違いに注意する
Swift 6 への移行期には、Swift Package Index の互換性マトリクスで Swift 6 に緑のチェックが付いていながら、同時にデータ競合安全性のエラーを抱えているパッケージを見かけることがあります。
これは矛盾ではありません。互換性チェックでは、Swift Package Index はパッケージ作者が指定した language mode を使ってビルドします。パッケージは Swift 6 language mode や strict concurrency チェックを採用する前から Swift 6 と互換であり得ます。マトリクスはあくまで「互換性」だけを示すものです。データ競合安全性に潜在的な問題があるパッケージを採用するかどうかは利用者の判断ですが、緑のチェックが付いていれば採用自体は可能です。
導入・今後の位置づけ
コンパイル時のデータ競合安全性は Swift にとって大きな前進であり、並行処理に起因するバグを丸ごと一つのクラスとして排除し、コードの安全性と保守性を高めます。各モジュールが Swift 6 language mode へ移行するたびに、エコシステム全体のデータ競合安全性への移行が一歩進みます。
利用者は、自分のパッケージを移行することで貢献でき、エコシステム全体の進捗は Swift Package Index の Ready for Swift 6 ページで追えます。