Swift Digest
Blog | Swift.org Blog

Developer Spotlight: Graphing Calculator を C++ から Swift へ移植する

Developer Spotlight: Porting Graphing Calculator from C++ to Swift

このダイジェストはClaude Opus 4.7 / 4.8によって生成されたものです(License)。原文はこちら

この記事の要点

採用前の課題

Graphing Calculator は1985年、128K Macintosh 向けに C で書き始められました。16ビット整数、白黒 QuickDraw、MMU も FPU も GPU もない 8MHz の 68000 CPU という時代のソフトウェアです。以来、CPU は 68K から PowerPC、Intel、ARM へと移り変わり、API も Inside Macintosh から Carbon、Cocoa(AppKit / UIKit)、そして SwiftUI へと変遷してきました。

著者は「壊れていないなら直すな」という方針を長く守ってきましたが、そのぶんコードには、当時は理にかなっていたものの今では役に立たない過去の名残が数多く残っていました。たとえば、1980年代に書かれたスレッドセーフでないコードを動かすために、Classic Mac OS 9 の協調的スレッド API を今なお使い続けていたほどです。こうして数十年分の技術的負債が積み重なると、新規開発はリスクの高いものになります。

ゼロからの全面書き直しは、レガシーコードに刻まれた長年の教訓を失う危険があり、テスト対象がすべて新規になるため、本来はめったに良い選択ではありません。それでも著者は、35年間先送りしてきた問題に正面から向き合うには、すべてを見直して土台から書き直すのが最善だと判断しました。

言語を変えた直接のきっかけは、Apple の AR(拡張現実)技術への感銘でした。AR を数学教育に活かすプロトタイプを作る中で、ARKit によるビジョンや機械学習は Objective-C でも可能ではあるものの、Swift の方がはるかに扱いやすく、今後の Apple の新技術でもそれは同様だろうと感じたことが、Swift への移行を後押ししました。

Swiftでどう改善したのか

著者はまず、Graphing Calculator の中核である数式処理システム(computer algebra system)を Swift へ移植することから学習を始めました。当初は学習用の練習でしたが、やがて実現可能性の検証へと発展し、パンデミック下の在宅プロジェクトとして本格化しました。この移植は、次のように複数の技術移行を同時に伴うものでした。

移行元 移行先
C++ / Objective-C / Objective-C++ Swift
Lex / YACC Swift
pthreads Swift の structured concurrency
C++ の char Swift の String
AppKit / UIKit SwiftUI
OpenGL SceneKit と Metal

著者が移植を通じて評価している Swift の特徴は次のとおりです。

最終的に、ソースコードは約152,000行から約29,000行へと減りました。個々の機能を移植すると、Swift のコードは対応する C++ コードのおおむね30%程度の量に収まったといいます。行数はそれほど有用な指標ではないものの、コードが少ないことはデバッグ・読解・理解の負担が小さいことを意味し、それだけで保守を容易にします。

実運用から得られる示唆

著者は、Swift が 安全で・高速で・表現力のあるコード という約束を、SwiftUI が 最小限のコードで Apple プラットフォーム全体に優れた UX を提供する という約束を、いずれも果たしていると総括しています。一方で、実際の移植から得られた示唆もいくつか示されています。

著者は、書き直しによってコードベースの状態に強い満足を得ており、将来的には数式組版・編集・数値計算・記号計算・グラフ描画のための独立した Swift パッケージとして公開できる手応えを得たとしています。重い計算を伴う長寿命のアプリにおいても、Swift が保守性・安全性・性能を両立しうることを示す事例です。

関連リンク