Swift5で導入されたABI Stabilityについて
Swift 5.0で、ABI Stabilityが導入されました。
当時はそこまでしっかりSwiftを調べていたわけではないのでふ~ん程度に思っていましたが、年末のお勉強期間でABI Stabilityについて少し詳しくなった気がするのでまとめておきます。
Swiftの実行時のフローについて
Swiftで書いたプログラムは実行の際にSwift Runtimeを必要とします。
Swift Runtimeにはメモリのクリーンアップ処理など、いわゆるめんどくさいことをまとめて実行してくれるものだと理解しています。
ここではざっくり「実行時にRuntimeと連携する仕組み」として説明します。
このときSwiftプログラムはRuntimeとABIを利用してやり取りしています。
ABIとは
ABIとはApplication Binary Interfaceの略で、アプリケーションが機械語とやり取りする際のInterfaceを指します。
我々iOSエンジニアがよく見るApplication Programming Interfaceはサーバーとのやり取りのときによく使いますが、それの機械語版ということになります。
ABIのStabilityとは
ABI Stabilityとはそのまま ABIの安定性を意味します。
ここでいう安定はわれわれエンジニアがクラッシュを見たときに思う安定とは違い、将来のSwiftバージョンによってABIが変化しないという意味での安定性です。
ABI Stabilityが導入される前の課題
ABI Stabilityが導入される前までは、SwiftのバージョンごとにABIが違いました。
このためSwift 3.0のRuntimeではAの動作を指し示していた命令をSwift 4.0のRuntimeに対して実行すると全く意図していないBという動作を引き起こしてしまうという問題がありました。
このため、Swiftのバージョンアップを行うときは、Swiftファイル側に変更がなくても新しくコンパイルし直す必要がありました。
ABI Stabilityが導入されて解決した課題
この状況はSwift 5.0で導入されたABI Stabilityにより大きく改善します。
Swift 5.0 RuntimeでAという動作を表す命令はSwift 5.1でも、Swift 6.1でも、Swift 10.0でも同じAという動作を表すようになったのです。
これによりSwift 5.0でコンパイルされたプログラムはSwift 6.0 Runtime環境下でも適切に動くことが保証されました。
またこの「プログラムとRuntimeを分ける」というアプローチにより、Swift 5.0でコンパイルしたプログラムもRuntime側の改善の恩恵を受けることが可能になりました。
たとえば、Swift 5.0のRuntimeでは処理に10秒かかっていた命令Aが、Swift 6.0のRuntimeでは処理に1秒かかるように改善されると、自動的にSwift6.0のRuntime上で動くSwiftプログラムも10倍のパフォーマンス改善が行われるようになりました。
参考資料
Discussion