Appleは、MacintoshラインをIntel CPUからApple Silliconと称する独自CPUに移行する計画に合わせて、そのプロセスをスムーズに進めるためのバイナリ変換ソフトウェアRosetta 2を発表した。Rosetta 2があることによって、最初の移行ステップさえ実行すれば、大半のx86プログラムを新CPU上で実行できるようになる。
Appleがバイナリ変換テクノロジを最初に導入したのは、2006年に、PowerPC CPUからx86へのスイッチを開始した時だった。後にIBMによって買収されたTransitive Corporationの開発したテクノロジであるQuickTransitをベースとしたRosettaは、ユーザに対してほぼ透過的に動作する。認識される可能性があるサイドエフェクトは、アプリの起動や実行が遅くなる場合がある、ということのみだ。
起動が遅いのは、主としてアプリが初めて起動される場合である。バイナリにx86_64インストラクションのみが含まれていることをOSが検知して、Rosettaを読み込む時に遅延が発生する。Mac Rumorsの記者であるJoe Rossignol氏によると、Microsoftの測定では、同社のMacアプリの初回起動に約20秒を要したが、その後の起動はそれよりも速かった。この初回の変換ステップによる影響を軽減するため、Rosetta 2では、アプリのインストール時にAOT変換を行うことも可能になった。このRosetta AOT変換がどのアプリに対してサポートされるのかは、まだ明らかになっていない。
arm64インストラクションが利用可能な場合、macOSがそちらを優先的に実行するのは当然だが、ユーザがアプリ毎にこの動作をオーバーライドすることもできる。これが必要になるのは、例えば、アプリはすでにApple Siliconに移植されているが、ユーザが使用するレガシプラグインやその他のバイナリエクステンションの移植が完了していないような場合だ。事実として、x86_64とarm64のインストラクションが同じプロセス内で混在できないというのは、Rosettaの制限のひとつになっている。
Rosettaでの過去の経験を踏まえたRosetta 2は、エンドユーザと開発者の双方に対して、Apple Silliconへのスムーズな移行を強力に支援する。ただしこれは、必要とするソフトウェアがarm64をネイティブサポートしてリリースされるまで、ユーザが待たざるを得ない多くのケースを否定するものではない。特に問題なのは、Rosetta 2がカーネルエクステンションとx86_64の仮想化機能をサポートしていない点だ。後者の結果として、VMWareやVirtualBox、Dockerといった仮想化機構はRosetta 2上では動作しない、ということになる。
Rosettaの大きな不安のひとつはそのパフォーマンスにある。PPCからx86への変換の場合、Rosettaが遅い原因のひとつは、PowerPCがビッグエンディアンであるのに対して、x86はリトルエンディアンであるという、2つのプラットフォームが使用するメモリオーダの違いにあった。この問題は、ARMベースであるMicrosoft Surfaceラップトップでのx86エミュレーションにも影響を与えている。この問題の発生を防ぐためにAppleは、M1 CPUにx86メモリオーダのサポートを追加した、とRobert Graham氏がTwitter上で述べている。
4/ そこでAppleは、ちょっとズルをしました。Intelのメモリオーダを自社CPUに追加したのです。変換したx86コードを実行する時には、Intelのメモリオーダに合わせてCPUのモードを切り替えます。
― Robert Graham, provocateur (@ErrataRob) November 25, 2020
さらにGraham氏は、JavaScriptのスピードアップやメモリの獲得および解放速度の向上など、自社チップのパフォーマンスを改善するためにAppleが実装した、その他のさまざまな"トリック"についても説明している。
Hacker Newsにおいて一部の開発者の注目を集めたRosetta 2の特徴のひとつは、just-in-timeコンパイラを含むアプリの変換も可能であることだ。これに関する正確なメカニックは公式には文書化されていないが、生成されたばかりのコードページにコードが飛び込もうとした時の検出にページフォールトを使用している可能性がある -- つまり、大まかに言えば、まずページを書き込み可能なモードに設定し、読み込み専用にスイッチした上でコードを実行するのだ。ページフォールトが検出されると、Rosettaがそのページの内容を変換する、という仕組みである。
最後に、アプリケーションは自身がRosetta下で動作していることを検出可能であることを指摘しておく。