バイナリ変換についての解説
バイナリ変換(英: binary translation)は、
コンピュータにおける重要な技術であり、ある命令列を別の命令セットに翻訳することで
機械語コードのエミュレーションを実現します。このプロセスには主に静的バイナリ変換と動的バイナリ変換の2種類が存在し、それぞれ異なるアプローチを採用しています。
静的バイナリ変換
静的バイナリ変換は、
実行ファイル全体をターゲットとなるアーキテクチャの命令セットに一括で変換する手法です。この変換方法は、全てのコードを静的に検出するのが難しいため、正確な変換を実現するのが難しいという欠点があります。特に、実行時に分岐先を特定するような間接ジャンプに依存するコードは、静的解析では到達できない場合があります。
動的バイナリ変換
対照的に、動的バイナリ変換は、特定のコード片を実行時に動的に変換する方式です。この手法は、エミュレーションを単純化し、性能上のボトルネックを解消します。動的変換では、基本ブロック単位の短いコード列が対象となり、変換が行われる際にはその結果がキャッシュされます。これにより、同じコードが複数回実行される場合のオーバーヘッドを相殺することが可能です。
動的バイナリ変換プログラムの中には、実行時間を計測し、特に時間がかかる部分を最適化する機能を持つものもあります。これはジャストインタイムコンパイラの技術に似ており、実際のマシンの命令セットへの動的な変換が行われることになります。
具体例
Appleは、M68Kのコードを早期の
PowerPCアーキテクチャに変換する
エミュレータを開発しました。この技術によって、アップルは互換性を維持しつつ新たなアーキテクチャに移行することを可能にしました。具体的には、
エミュレータによって68K用のソフトウェアが動作し続け、新しいOSでも利用できるように工夫されています。加えて、Mac OS Xでは
PowerPC上での「クラシック」環境を提供し、ユーザーが旧いソフトウェアにアクセスできるようにしています。さらに、OS X v10.4からは
Rosettaという変換レイヤーが導入され、
PowerPCからx86にスムーズに移行できるようになりました。
DECも同様に、
CISCの
VAXアーキテクチャから
RISCの
DEC Alphaアーキテクチャへの移行を支援するツールを開発して成功を収めました。また、x86アプリケーションを
DEC Alpha用に変換するFX!32というバイナリ変換プログラムも提供されています。これによって、ユーザーは新しいアーキテクチャでも旧来のアプリケーションをそのまま利用することができました。
2006年には
インテルがTransitive Binary Translatorを発表し、将来的に
ItaniumやXeon CPUにこの技術をサポートする計画を発表しました。他の企業も同様にTransitiveのQuickTransit技術を採用し、異なるプラットフォーム間での変換が行われています。
このように、バイナリ変換は新しいアーキテクチャへの適応を促進し、過去の技術との互換性を維持するために非常に重要です。