初のオンライン開催となったWWDC、出し物はいろいろあったが、やはりインパクトが大きかったのは自社設計SoC「A12Z」の採用を皮切りとしたARMアーキテクチャへの移行開始宣言だ。本誌にもレポート記事が三々五々掲載されるのだろうが、Macのアーキテクチャ移行を幾度か見守ってきた当コラム(なにせ前世紀から続いているもので)としては、「ユニバーサルバイナリ」と「Rosetta」について語るのが役目というものだろう。

この道はいつか来た道

Macユーザとして気になるのは、ARMアーキテクチャへのスムーズな移行だろうが、結論からいえば「ほぼ問題なからん」となる。MacOS 9より前、いわゆるClassic MacOSのときに行われた68KからPowerPCへの移行はさておき(連載開始前でありフォローしていない)、Mac OS X登場以降2度にわたり行われたアーキテクチャ移行では特段の問題は生じなかった。

その理由は「Mach-O(マーク・オー)」にある。Mach-Oとは、現macOSの源流であるNEXTSTEP/OPENSTEPに採用されたバイナリフォーマットで、いまなおmacOSはもちろんiOSやiPad OSで利用されている。かんたんにいうと、このMach-Oは「単一ファイルに複数のバイナリ(プログラムの実行部分)を収録できる」構造を持ち、外観上は1つのアプリ/コマンドであっても異種アーキテクチャで動作する。

実際、PowerPC MacからIntel Macの移行期には、「i386」と「PowerPC」両方のバイナリを持つアプリ/ コマンドが多数存在し、/usr/libや/System/Library以下にある各種ライブラリもi386とPowerPC両方のバイナリを備えていた。Mach-Oのしくみを利用し、アプリとシステム側の双方がi386とPowerPC両方のバイナリを持つ、だから見た目は1つのアプリが異なるプラットフォームでもネイティブ動作する……これがユニバーサルバイナリの基本的な考えかただ。

当コラムが見守ったもうひとつのMach-Oの活躍は、Intel i386(32bit)からx86_64(64bit)への移行期。同じIntel CPUではあるが、64bit CPUの実力を引き出すためにはアプリとライブラリの両方で64bitバイナリを、一方で互換性のために32bitバイナリを用意せねばならない。このときも「ユニバーサルバイナリ」と呼ばれていたが、実のところPowerPCからIntelのときとしくみは変わらない。その証拠に、Catalinaの現在も「PowerPC MacでもIntel 32bit Macでも64bit Macでも変わらずネイティブ動作するアプリ」は存在する。

これからApple Silliconへの移行期を迎えるが、この道はいつか来た道、macOSには実績豊富なMach-Oがある。もちろんXcodeなどの開発環境でソースコードからコンパイルする必要はあるし、アプリ/ライブラリともしばらくは"FATバイナリ"を余儀なくされるためストレージ消費量は若干増えるのだろうが(参考)、Apple Sillicon搭載Macだからアプリが少ない、という事態は起こりにくいはずだ。

  • かつてはPowerPCからIntelへ、今度はIntelからApple Silliconへプラットフォーム移行が行われる

  • lipoコマンドでオーディオアプリ「XLD」のバイナリを調べたところ。x86_64とi386、PowerPCバイナリが収録されている

この石は……いつか見た石?

Mach-Oのおかげでこれからのプラットフォーム移行は心配無用だが、すべてのアプリ開発者が超特急でApple Sillicon搭載Mac向けにソースコードをコンパイルし直してくれるわけではない。ARMアーキテクチャならではの事情があるし、最適化も必要なので相応の開発期間が必要なはず。PowerPCからIntelのときも、i386からx86_64のときも、数年の移行期間を設けていたのはそれが理由だ。

では、日常的に利用しているアプリのApple Sillicon版がなかなかリリースされないとき、じっと待ち続けなければならないのかというと、そうではない。それがバイナリトランスコードシステム「Rosetta 2」だ。

なぜ「2」かというと、かつてPower PCからIntelへの移行期に「Rosetta」が存在したから。Rosettaは、OS X Tigerで登場しOS X Lionで取り除かれてしまうまでの約5年、PowerPCアプリ -- Intelバイナリを持たない非ユニバーサルアプリ -- を実行するたびに自動的に呼び出され、PowerPCバイナリをジャストインタイムでIntelバイナリに変換するという離れ業をやってのけた(参考)。

今回のRosetta 2は、x86_64バイナリをApple Sillicon向けに変換する。現在のところ詳細は不明だが、アプリのインストール時にバイナリを一括変換するしくみが明らかにされている。これは、初代Rosettaにはなかった機能だ。ただし、JITコンパイラやプラグインも実行可能というから、一定量のバイナリを実行時に逐次変換する初代Rosettaと同様の機構も備えているのだろう。

パフォーマンスは実際に体験してみないとなんともいえないが、基調講演の説明にあった「以前より高速で強力で高い互換性」という言葉は力強い。初代Rosettaの開発元・Transitive社は2008年にIBMに買収されており、今回はApple社内で開発したのかもしれない(Rosettaの商標はAppleが保有している)。Apple Silliconという硬い石はもちろん、こちらの柔らかい石にも要注目だ。

  • Rosetta 2は新OS「macOS Big Sur」に収録される

  • このようにアイコンは用意されたが、初代Rosettaのように/usr/libexecあたりでひっそりと存在するのかもしれない