Swift 採用中止 – Ladybird ブラウザの Swift 6.0 サポート課題が終了
(github.com/LadybirdBrowser)- Ladybird ブラウザプロジェクトは、Swift 6.0 サポートを実験段階から正式化する過程で発生した問題一覧を整理していたが、その後 Swift の採用をこれ以上進めないことを決定した
- 主な障害要因は Swift と C++ の相互運用性(Interop) に関する ABI の不一致、ヘッダーの循環依存、特定の型を返せないことなどで、多くの項目は Swift 6.0.0 以降に修正された
- CMake ビルドシステムでも、Swift + Ninja 環境でのデプロイメントターゲット不一致、
install_name処理の不具合、非互換なコンパイルオプションなどの問題が報告された - Ladybird 自体のコードでも、AK および LibGfx モジュールの modulemap 構成、Swift フロントエンドのクラッシュ、型の名前空間衝突 など多数のビルド不安定要因が確認された
- こうした技術的制約の蓄積により Swift 統合は中止され、これは C++ 中心の開発を維持する決定 につながった
Swift 関連の問題
- Swift 6.0 サポートを実験段階から脱するために解決すべき 言語および ABI レベルのバグ が多数存在
- LLVM バージョンの不一致により、Swift オープンソースビルド時にアサーション失敗が発生
Optional<CxxValueType>を返す際に コンパイラとブリッジングヘッダー間の ABI 不一致 問題- Ubuntu 22.04 環境で
<execution>ヘッダーを含めると libstdc++ モジュールの循環依存 が発生 swift::Optional<swift::String>を返せないことや<chrono>ヘッダーの読み込み失敗など、C++23 互換性の問題 も含む
- 一部の問題は Swift 6.0.0 以降のリリースで修正されたが、いくつかは main ブランチでのみ解決 されており、安定版には未反映
- 複数の項目で「ワークアラウンド(回避ビルド方法)」が提示されたが、完全な解決策ではない
CMake 関連の問題
- Swift と Ninja ビルドの組み合わせで
CMAKE_OSX_DEPLOYMENT_TARGETが適用されず、多数の警告が発生- 手動で
CMAKE_Swift_COMPILER_TARGETを設定する必要あり
- 手動で
- CMP0157 ポリシーを有効化すると install_name ディレクトリ設定が無視 され、手動修正が必要
- 関連修正は CMake 3.29、3.30 にバックポート予定
- Swift コンパイラが理解できないリンクオプション が外部依存関係から渡される問題が存在
Ladybird プロジェクト内部の問題
- AK および LibGfx モジュールの clang module map 構成時にシステムヘッダーと衝突 が発生
<math.h>を含めるとモジュール認識エラーでビルド失敗
- Swift フロントエンドが AK コンテナテスト中にデバッグビルドでクラッシュ
- リリースモードビルドでのみ回避可能
String型の名前空間衝突により Swift フロントエンドが異常終了AK.StringまたはSwift.Stringと明示指定が必要
- Swift Testing モジュール使用時に コンパイラフロントエンドがクラッシュ し、
AK::StringViewの CxxSequenceType 未認識 問題も存在
追加の改善項目
- Swift で C++ 関数が
Optional<CxxType>を返すと アプリケーションがクラッシュ- 暫定対策としてサイズ 0 または 1 の配列を返す方法を使用
- SourceKit-LSP および vscode-swift は ルートレベルの compile_commands.json を要求
- シンボリックリンクの作成で解決可能
- Linux 環境では
<swift/bridging>パスを 手動追加しなければならない不便さ がある
未解決の疑問
- Swift で C++ の view 型や byte slice をコピーなしで渡す方法 が不明
- Swift が AK::Optional、AK::HashMap など独自型を std:: 型と同等に認識 できない
- Swift ガベージコレクタと Ladybird のメモリ管理をどう統合するか も未確定
この issue は Swift 6.0 統合に向けた技術的障害を体系的に記録した文書だったが、その後 Ladybird チームが Swift 採用を中止したことで、「Swift 6.0 Blockers」issue は終了 した。
1件のコメント
Hacker Newsの意見
Swift削除コミットには少し追加説明がある
「長い間進展がなかったため、Swift導入を断念し、コードベースから削除した」というメッセージが含まれている
関連コミットはこちらで見られる
私は2021年に初めてSwiftを使ってみたが、10年以上C#/.NETをやってきた身として驚いた
C#も複雑だと思っていたが、Swiftはそれよりはるかに複雑な言語だった
特にバックエンドAPIやデータアクセス層を作るときは、参考資料がほとんどなかった
Swiftは知見の大半がAppleプラットフォーム向けに蓄積されていて、それ以外の領域ではほぼ開拓者にならなければならない感覚だった
Larry Wallが言ったように、ツールの複雑さは問題の複雑さに合わせるべきだ(Rakuへの言及)
しかし「structは値渡し、classは参照渡し」という規則と、「唯一の信頼できる情報源を保つ」という原則が衝突して、開発が退屈で遅くなる経験をした
Swiftの矛盾したベストプラクティスのせいで進展がなく、結局多くの助言は当てにならないと気づいた
シンタックスシュガーが多すぎるし、同じことをする方法が何十通りもあって、そのたびに言語リファレンスを引かなければならなかった
言語が何であれ、Ladybirdが将来的にユーザーフレンドリーなJavaScript実装に注力してくれるといい
JSがユーザー活動の追跡やペースト禁止、過剰なデバイス情報収集に悪用されているのは問題だ
Torのように、ユーザー間で標準化されたスプーフィング値を報告するようにすれば、プライバシー保護に役立つ気がする
トグル式オプションとして提供するのはよいが、デフォルトにすると採用は難しそうだ
Swift削除は興味深い。理由が明確に説明されていないので気になる
Linuxで動くだけでも、いずれ試してみたい
Swiftが複数のC++バージョンのライブラリを同時にimportできなかったり、演算子のバージョン衝突が起きたりする問題だった
Swiftはよい言語だが、すでに大きいプロジェクトに後から追加するには複雑すぎたのだろう
なぜLadybirdがSwiftを試したのか気になる。RustのほうがC++相互運用性に優れているのではと思う
SwiftのGCもブラウザ性能には不利そうだ
リンク1, リンク2
回避策はあるが、生産性が落ちる
ただLadybirdには十分ではなかったようだ
以前はSerenityOSでJaktという言語を作ったこともあったが、結局C++に戻ったようだ
関連する過去の議論はこの投稿にある
SwiftはAppleにあまりに依存した言語なので驚きはない
C++の安全な部分だけをうまく使えば十分で、実際ほとんどのブラウザはC++で書かれている
ChromiumとFirefoxは段階的により安全な言語へ置き換え中で、新しいブラウザをC++でまた書くのは過去の失敗を繰り返すようなものだ
C++利用は1998年のKHTML時代の遺産だ
string_viewのような最新STL機能も含むのか? それでも完全なメモリ安全にはほど遠い一部のベンチマークを除けば、実際のプログラムではほぼ常に遅い
Swift削除は残念だ。では独自言語のJaktが再び候補に上がるのだろうかと気になる
新しい言語を導入する可能性は低いと思う
外部支援で運営されるプロジェクトがこういう形だと、長期的に持続しにくい
Swiftは結局Appleのおもちゃ言語に過ぎないと思う
Appleはそれ以上に成長させないだろう
LadybirdのMac UIはAppKitの上に薄く載せたレイヤーだ
SwiftではなくObjective-C++で書かれている
ソースコード参照
Swift導入よりずっと前、SerenityOS時代に作ったものなので、Objective-C++を使ったのは単に慣れた言語だったからだ
以前、Swiftへ移行すると言ったときに批判したことがある
Swiftは設計が雑で、コンパイル速度も遅く、システム言語として成長する可能性は低いと見ていた
専門家もいなかったので、今回の決定はよかったと思う
ConcurrencyやSwift Testingのような機能も、Appleの必要に応じて押し進められた例だ
クロスプラットフォーム作業の大半は、小規模チームが別途進めている
Chris Lattnerを別にしても、SwiftリードたちはC++コミュニティで認められた人物だった
Rust陣営がCに加えてSwift ABIもFFIでサポートしてくれるとよいのだが