コンピュータ において、バイナリ変換とは、バイナリ再コンパイルの一種であり、バイナリがコンパイルされたオペレーティングシステムに関して、ソース命令セット(ISA)からターゲット命令セットへ命令シーケンスを変換する処理です。命令セットシミュレーションなどの場合、ターゲット命令セットはソース命令セットと同じになることもあり、命令トレース、条件付きブレークポイント、ホットスポット検出などのテストおよびデバッグ機能を提供します。
バイナリ変換には、静的変換と動的変換の2つの主要な種類があります。変換はハードウェア(例えば、CPU内の回路)で行うことも、ソフトウェア(例えば、ランタイムエンジン、静的リコンパイラ、エミュレータなど。いずれも一般的に処理速度が遅い)で行うこともできます。
バイナリ変換は、対象プラットフォーム用のバイナリが存在しないこと、対象プラットフォーム向けにコンパイルするためのソースコードが存在しないこと、または対象プラットフォーム向けにソースコードをコンパイルすることが困難であることなどが原因で行われます。
静的に再コンパイルされたバイナリは、エミュレーションのオーバーヘッドが排除されるため、対応するエミュレーションされたバイナリよりも高速に実行される可能性があります。これは、一般的にインタプリタ型プログラムとコンパイル型プログラムのパフォーマンスの違いと同様です。
静的バイナリ変換を使用するトランスレータは、動的バイナリ変換のようにコードを最初に実行することなく、実行可能ファイルのすべてのコードをターゲットアーキテクチャとプラットフォームで実行可能なコードに変換することを目的としています。トランスレータがすべてのコードを検出できるとは限らないため、これを正しく行うことは非常に困難です。たとえば、実行可能ファイルの一部は間接分岐を介してのみアクセス可能であり、その値は実行時にのみ判明する場合があります。
そのような静的バイナリトランスレータの1つは、ユニバーサルスーパーオプティマイザピープホール技術(スタンフォード大学のソラヴ・バンサルとアレックス・エイケンによって開発)を使用して、多数のソースとターゲットのペア間で効率的な変換を実行し、開発コストを大幅に削減し、ターゲットバイナリのパフォーマンスを向上させます。PowerPCからx86への変換の実験では、一部のバイナリはネイティブバージョンよりも優れたパフォーマンスを示しましたが、平均的にはネイティブの3分の2の速度で動作しました。[ 1 ]
1960年代、ハネウェルは自社のハネウェル200シリーズのコンピュータ向けにLiberatorと呼ばれるプログラムを提供しました。このプログラムはIBM 1400シリーズのコンピュータ用のプログラムをハネウェル200シリーズのプログラムに変換することができました。[ 2 ]
1995年、ベル通信研究所のノーマン・ラムジーとプリンストン大学コンピュータサイエンス学科のメアリー・F・フェルナンデスは、静的アセンブリ変換の基本ツールを備えたニュージャージーマシンコードツールキットを開発した。 [ 3 ]
2004年、任天堂のスコット・エリオットとフィリップ・R・ハッチンソンは、ゲームボーイのバイナリから「C」コードを生成するツールを開発し、それを新しいプラットフォーム用にコンパイルして、航空機のエンターテイメントシステムで使用するためのハードウェアライブラリにリンクできるようにした。[ 4 ]
2014年には、 1998年のビデオゲームStarCraftのARMアーキテクチャ版が、オリジナルのx86版の静的再コンパイルと追加のリバースエンジニアリングによって生成された。 [ 5 ] [ 6 ] Pandoraハンドヘルドコミュニティは、必要なツールを独自に開発し[ 7 ] 、このような翻訳を何度か成功させてきた。 [ 8 ] [ 9 ]
別の例としては、2013年にLLVMを使用して生成されたビデオゲーム「スーパーマリオブラザーズ」のNESからx86への静的再コンパイル版がある。 [ 10 ]
例えば、2014年にはビデオゲーム「Cube World」のプロシージャル地形生成器のx86からx64への静的再コンパイルが成功裏に行われた。[ 11 ]
動的バイナリ変換(DBT)は、短いコードシーケンス(通常は単一の基本ブロック程度)を調べ、それを変換して、結果のシーケンスをキャッシュします。コードは発見されたときにのみ、可能な場合にのみ変換され、分岐命令は既に変換され保存されたコードを指すように設定されます(メモ化)。
動的バイナリ変換は、単純なエミュレーションとは異なり(エミュレータの主要な読み込み・デコード・実行ループ(主要なパフォーマンスボトルネック)を排除する)、変換時に大きなオーバーヘッドが発生します。このオーバーヘッドは、変換されたコードシーケンスが複数回実行されることで、徐々に相殺されることが期待されます。
より高度な動的トランスレータは、動的再コンパイルを採用しており、変換されたコードに計測器を組み込んで、どの部分が頻繁に実行されるかを特定し、これらの部分を積極的に最適化します。この手法はJITコンパイラを彷彿とさせ、実際、そのようなコンパイラ(例えば、SunのHotSpotテクノロジー)は、仮想命令セット(バイトコード)から実際の命令セットへの動的トランスレータと見なすことができます。
このスマートマイクロプロセッサは、エンジンとしてハードウェアVLIWコアと、コードモーフィングソフトウェアと呼ばれるソフトウェア層で構成されています。コードモーフィングソフトウェアは、シェルとして機能し、x86命令をネイティブのCrusoe命令に変換します。さらに、コードモーフィングソフトウェアには、動的コンパイラとコードオプティマイザが含まれています。その結果、最小限の電力でパフォーマンスが向上します。これにより、Transmetaは膨大なソフトウェアアプリケーション基盤に影響を与えることなく、VLIWハードウェアとコードモーフィングソフトウェアを個別に進化させることができます。
例えば、Series 200 プロセッサの命令レパートリーは、IBM 1400 シリーズなど、他のいくつかの処理システムの命令レパートリーと十分に似ているため、これらの競合システム用に作成されたプログラムを、より高性能な Series 200 システムで実行に適した形式に自動的に一度だけ変換することができます。
「ソースがなければ移植もできない」というルールは完全に正しいわけではなく、静的再コンパイルによって移植と似たようなもの(ただし全く同じではない)を得ることができます。同様のことは、M-HT がいくつかの DOS ゲームで何度か行っています。このゲームは、やや似たアプローチで Android にも移植されました。
この記事は、Nintendo Entertainment Systemのゲームを静的に逆アセンブルしてネイティブ実行ファイルに再コンパイルする可能性に関する独自の研究を紹介しています。
しかし、何らかの方法で元の x86 マシン コードを使用するというアイデアが浮かびました。 ただし、オープン サーバーでは x86-64 もサポートする必要があり、その場合は絶対にエミュレーションまたは再コンパイルが必要です。 […] アセンブラへの静的再コンパイルははるかに良いオプションのように思えましたが、移植性を維持するには、x86、x86-64、場合によっては ARM/PowerPC 用のバックエンドを作成する必要があります。
ゲイリー
が開拓した技術の多くは
、10年後の今、再発見されている。
アップル
と
DECは、既存のソフトウェアを
PowerPC
または
Alpha
アーキテクチャに移植するための「新しい」技術として
バイナリ再コンパイル
を宣伝している
。実際には、
DRIは
1980年代初頭に
8080
から
8086へ
のバイナリ再コンパイラを発表していた。 […]