記事


ロゼッタ翻訳環境について


Rosetta が実行可能ファイルを翻訳する方法を学び、Rosetta が翻訳できないものを理解します。







概観


Rosetta は、ユーザが Apple シリコン上で x86_64 命令を含むアプリを実行できるようにする変換プロセスです。Rosetta は、Apple シリコンへの移行を容易にし、あなたのアプリのユニバーサルバイナリを作成する時間をあなたに与えることを目的としています。これは、あなたのアプリのネイティブバージョンの作成に代わるものではありません。


ユーザにとって、Rosetta はほとんど透明です。実行可能ファイルに Intel 命令のみが含まれている場合、macOS は自動的に Rosetta を起動し、変換プロセスを開始します。翻訳が完了すると、システムは元の実行可能ファイルの代わりに、翻訳されたファイルを起動します。ただし、翻訳プロセスには時間がかかるため、ユーザには翻訳されたアプリの起動や実行が遅くなることがあります。


システムは、Apple シリコン上でアプリの arm64 命令を実行したいでしょう。バイナリに arm64 命令と x86_64 命令の両方が含まれている場合、ユーザは、Finder のアプリの「情報を見る」ウィンドウから、Rosetta 変換を使用してアプリを起動するようにシステムに指示できます。たとえば、ユーザは Rosetta 変換を有効にして、arm64 アーキテクチャをまだサポートしていない古いプラグインをアプリで実行できるようにする場合があります。



重要

システムは、同じプロセス内で arm64 コードと x86_64 コードが混在することを防ぎます。Rosetta 変換は、プロセスが動的にロードするすべてのコードモジュールを含むプロセス全体に適用されます。




あなたのアプリが Rosetta 翻訳下で実行されているかどうかを確認する方法については、あなたのアプリが翻訳済みバイナリとして実行されているかどうかを確認する を参照してください。



翻訳できないものは何ですか?


Rosetta は、ジャストインタイム (JIT) コンパイラを含んだアプリを含む、ほとんどのインテルベースのアプリを翻訳できます。ただし、Rosetta は以下の実行可能ファイルを翻訳しません。


  • カーネル拡張機能

  • x86_64 コンピュータープラットフォームを仮想化する仮想マシンアプリ

  • Rosetta はすべての x86_64 命令を変換しますが、AVX、AVX2、AVX512 ベクトル命令など、一部の新しい命令セットやプロセッサ機能の実行はサポートしていません。これらの新しい命令をあなたのコードに含める場合は、それらが使用可能であることを確認した後にのみ実行してください。たとえば、AVX512 ベクトル命令が使用可能かどうかを判断するには、sysctlbyname 関数を使用して hw.optional.avx512f 属性を確認します。



    あなたのアプリが翻訳済みバイナリとして実行されているかどうかを確認する


    Apple シリコン上では、ユニバーサルバイナリはネイティブに実行することも、変換されたバイナリとして実行することもできます。システムは可能な限りネイティブバージョンを実行しますが、ユーザは古いプラグインをサポートするために Rosetta を使用してコードを実行することを選択する場合があります。


    プロセスが Rosetta 変換下で実行されているかどうかをプログラムで判断するには、以下の例に示すように、sysctl.proc_transulated フラグを指定して sysctlbyname 関数を呼び出します。この例の関数は、ネイティブプロセスの場合は値 0、変換されたプロセスの場合は 1、エラーが発生した場合は -1 を返します。


    1. int processIsTranslated() {
    2. int ret = 0;
    3. size_t size = sizeof(ret);
    4. if (sysctlbyname("sysctl.proc_translated", &ret, &size, NULL, 0) == -1)
    5. {
    6. if (errno == ENOENT)
    7. return 0;
    8. return -1;
    9. }
    10. return ret;
    11. }















    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ