[HOME]

Emulator Technology

はじめに

いわゆる古いパソコンやゲーム機のエミュレータで遊んでいるうちは、エミュレータを一種の「シャレ」もしくは「過去のノスタルジー」という感情で、「非実用的なもの」とらえていないだろうか?エミュレータ、およびそれに伴う技術は、意外に多くの場所で実用的に利用されている。

開発

新マシンを開発している場合、そもそもマシン自体が存在しない上、仕様変更も多々ある。物理的なマシンをいくつも試作していればコストもかかるが、エミュレータとしてソフトウェアで実現すれば、テスト・変更も容易である。 Psion、Macintoshエミュレータなどは、こうした内部開発用のものが一般に公開されたものと思われる。
かのビルゲイツも、(アルテア本体を買う金がなかったので)大学のコンピュータ室に潜り込んで、アルテアエミュレータ上でアルテアBASICを開発したと言われている。

Alphaマシン

AlphaチップをCPUにしたマシンは、一般のPC-AT機同様、マザーボードにPC-AT用のグラフィックボードやらを付けて安価に組み立てることができる。
PC-AT用ボードの多くは、初期化用のBIOSを搭載しており(起動時にグラフィックボードやSCSIボードの名前が出てくるアレ)、当然ながらこのBIOSはPC-AT用にx86コードで書かれている。Alphaマシンでは、このBIOSをx86エミュレータで実行することによって初期化を行っている。

Power Macintosh

一般的に知られている最大の商用エミュレータは、PowerMac用のMacOSではないだろうか。
Macintoshは、それまでのMC680x0系のCPUの高速化が行き詰まり、CPUをPowerPCに移行するという大きな変更を行った。 そこで問題になるのが過去の資産である。PowerMacでは、OSにMC680x0エミュレータを内蔵するという荒業でこれに対応した。 初代Macintoshでは、ToolBox(PC-AT機でいうところのBIOS)を128K(だよな、確か)に収めるためかなりトリッキーなコードを多用しており、これが足かせになったのか、リリース当初は、OSの大部分に68コードが残っているといわれ、PowerPCのパワーをフルに活かしているとは言い難く、(32ビットOSといいつつ16ビットコードの残るWindows95のごとく)遅いと酷評された。OSでは「インタープリタ・エミュレータ」を行っていたとみえ、後にサードパーティから「SpeedDoubler」という「リコンパイル・エミュレータ」が発売された。
現在ではほとんどのアプリケーションがPowerPCに対応し、混乱は解消された(と思うがMacはよく知らない)。

Windows NT

PC-AT用の「Windows95の高いやつ(安定版)」という認識の方も少なくないだろうが、Windows95がPC-AT,98等のx86CPU専用であるのに対し、WindowsNTは複数のCPUに対応している。x86以外のCPUでは、Windows3.1(いわゆる16bit Windows)のソフトを動かすx86エミュレータを内蔵しているらしい。

Windows DOS窓

良く考えるとこっちが最大だ。そう、DOS窓というのは、WindowsでDOS(を含めたハードウェア)をエミュレートしているのだ。グラフィックを使うDOSプログラムを「窓」状態にすると、グラフィックをエミュレートしているのがよくわかる。エミュレートできないものは強制的に「全画面」になる。
OS/2ではさらに、PC-DOS窓、PC-DOS日本語(いわゆるDOS/V)窓、PC-5550窓(PC-ATとちょっと違う日本IBMのマシン)とかもあるらしい。

理論的には、PC-ATで98窓とか、PC-98でAT窓とかも可能な気がするのだが。

Pentium II

なにを隠そう、Pentium IIはエミュレータ内蔵のCPUである。詳しい話は省くが、十何年も同じx86命令アーキテクチャで、これ以上高速化することは難しいので、もっと速いCPU(RISCアーキテクチャ)を別に作って、それにx86エミュレータを乗っけてしまえ、というのが大まかな理屈である。AMDなどの互換CPUもそういう方式があったような気がするがどれがどうだか忘れた。
Pentium IIの次世代のCPUにあたるIA64では、IA64命令とx86命令の両方を実行できるそうだが、やっぱりエミュレータなのだろうか?

Java

(Java Scriptとは似て非なるものなので注意)
NC(Network Computer)とか組み込みJavaとか構想はいろいろあるようだが、実際に目にするものとしては、「Webページで何かプログラムが動いてる」いわゆる「Javaアプレット」が一般的だろう。 しかしてその実態は、JavaVM(Virtual Machine-仮想マシン)、つまり、未だ存在しない「Javaチップ」のエミュレータということができる。InternetNavigatorなどに搭載されている、JavaのJIT(Just In Time)コンパイラというのは、エミュレータでいうところの「ダイナミック・リコンパイル(動的再コンパイル)」という手法と同じものをさす。
通常のエミュレータなら「本物」を基準に、動く/動かない/動作が異なる等判断できるが、何しろ物理的な「本物」が存在しない上、仕様もどんどん変わっているので、ブラウザによってJavaVMの動作が異なるといったトラブルもやむをえない気がする。
従って、Java開発環境というのはJavaVMのコード用のクロスコンパイラに他ならない。そう考えると、JavaソースからCPUネイティブコードを吐くコンパイラとか、他の言語からJavaVMのコードを吐くコンパイラもアリなわけで、事実そういったソフトも存在する。

「一度プログラムを書けば、すべてのマシンで動く」(移植や再プログラムの手間が要らない)と言うのがJavaの最大のメリットだが、それには「すべてのマシンに完全なJavaVMが実装されれば」という注釈がつく。見方を変えると、「それなら別にJavaVMでなくてもZ80エミュレータでもx86エミュレータでも同じじゃないの?」という気はする。(もちろんJavaのメリットはそれ以外にもある)

[HOME]