6月12日、AppleのSwiftチームが「Swift at Apple: Migrating the TrueType Hinting Interpreter」と題した記事を公開した。
AppleがTrueTypeフォントのヒンティングインタープリターをCからSwiftに書き換え、メモリ安全性を実現しながら平均13%の性能向上を達成したことを明らかにした。この移行は2025年秋のmacOS/iOS更新で実装され、同社が初めて大規模なシステムコンポーネントのSwift移行ノウハウを詳細公開したことで注目を集めている。
フォントレンダリングは全てのアプリケーションが依存する基盤技術であり、特にセキュリティリスクが高い領域として知られている。近年、CVE-2023-32434(CoreTextの脆弱性)やCVE-2022-32832(フォントパーサーの脆弱性)など、フォント処理関連の重大な脆弱性が相次いで報告されており、AppleがこのコアシステムをSwiftで書き直した背景にはこうしたセキュリティリスクの根本的な解決がある。
TrueTypeヒンティング — セキュリティ上の重要な攻撃対象
TrueTypeは1991年にAppleとMicrosoftが共同開発したベクターフォント標準で、現在でもHelvetica、Times New Roman、Arialなど主要フォントがこの形式で配布されている。TrueTypeには「ヒンティング」という仕組みがあり、これは小さなサイズで表示する際にグリフの形状を調整してより読みやすくする技術だ。
問題は、フォントファイルには任意のプログラムコードを含めることができる点にある。ヒンティングインタープリターは信頼できないソースからのデータを処理するため、メモリ破壊攻撃の主要な標的となってきた。従来のC言語実装では、バッファオーバーフロー、use-after-free、null pointer dereferenceといったメモリ安全性の問題が常に付きまとい、これらの脆弱性を狙った攻撃も実際に確認されている。
この脆弱性を根本的に解決するため、AppleはCで書かれていた2万行のインタープリターをメモリ安全なSwiftで完全に書き直した。Swiftは自動参照カウント(ARC)や境界チェック、null安全性により、コンパイル時と実行時の両方でメモリ関連のエラーを防ぐ。
完全互換性への挑戦 — ピクセル単位での一致が必須
この移行で最大の困難は、既存システムとピクセル単位で完全に同一のレンダリング結果を出力することだった。ヒンティングの動作がわずかでも変わると、全てのアプリケーションで文字の見た目が変化してしまう。
Appleは徹底的なテスト戦略を採用した:
- 99.7%のコード網羅率を持つユニットテストスイート
- 1000万のPDFファイルから4,200に最小化したコーパスでのテスト(27万グリフ、25,572フォントを含む)
- プロジェクト終了時点でインタープリター本体の4倍の行数のテストコードを作成
テスト駆動開発により、既存の動作を完全に保持しながらSwiftの利点を活用することに成功した。
Swift 6の新機能を活用した4つの最適化手法
性能面では、Swift 6系列で導入された最新機能を活用して以下の最適化を実現した:
1. 参照カウントとランタイムチェックの削除
Swift 6.0で導入された~Copyable値型とSpanを活用。これにより自動参照カウントとランタイム排他性チェックのオーバーヘッドを削除した。
2. C言語境界でのゼロコスト抽象化
@safe struct Zone: ~Copyable, ~Escapable {
let _element: Ref<fnt_ElementType>
@_lifetime(copy element)
init(wrapping element: Ref<fnt_ElementType>) {
// SAFETY: the `fnt_ElementType` passed by the caller must satisfy:
// * `sp`, `ep` point at arrays of length ≥ `maxContourCount`.
unsafe _element = element
}
func readContour(index: Int) -> ClosedRange<Int> {
precondition(0..<contourCount ~= index)
// SAFETY: `index` is bounds checked above
return unsafe Int(_element.value.sp[index])...Int(_element.value.ep[index])
}
}
WebKitのSafer Swift Guidelinesに従い、プロジェクション型を使用してC構造体への安全なアクセスを実現している。
3. メモリ割り当ての最小化
標準ライブラリの.lazy.mapや.lazy.filterの活用、継続渡しスタイルの採用により不要なメモリ割り当てを削除:
mutating func pop<R, E: Error>(
count n: Int,
_ op: (borrowing Span<Element>) throws(E) -> R
) throws(E) -> R {
defer { items.removeLast(n) }
return try op(items.span.extracting(last: n))
}
4. 動的ディスパッチの最適化
プロトコル、ジェネリクス、継承による間接的なメソッド呼び出しを最適化。コンパイラが境界チェックを巻き上げ、全てのジェネリックコンテキストを特化できるよう調整した。
高レベル抽象化で13%の性能向上を実現
Swiftの型システムとオプティマイザーにより、可読性の高いコードを保ちながらC版を上回る性能を実現した。以下のような抽象化が零コストで動作する:
FixedPoint型:複雑な丸めと変換演算をカプセル化StackElement型:8つの数値型に対する組み込み変換を提供- プロジェクション型:安全で自然なデータアクセス
最終的に、SwiftインタープリターはCインタープリターより平均13%高速になった。macOSに同梱される全ヒンティング付きフォントでのベンチマーク結果では、ほぼ全てのケースでSwift版が上回った。
システムプログラミング言語としてのSwiftの実証
この移行により、AppleはSwiftがアプリケーション開発だけでなくシステム開発においても優れた選択肢であることを実証した。同社は今回得られた知見をLLMコーディングアシスタント用の指示に整理し、他のC/C++からSwiftへの変換プロジェクトでも活用している。
移行に関するソースコードはGitHubで公開されており、システムレベルでのSwift採用を検討する開発者にとって貴重な参考資料となっている。Swift言語の公式ドキュメントやメモリ安全性ガイドと併せて参照すると、より深い理解が得られるだろう。
詳細はSwift at Apple: Migrating the TrueType Hinting Interpreterを参照していただきたい。