シミュレータとエミュレータの違い

似てるけど似ていない、少し似ているシミュレータとエミュレータの違いについてまとめてみました。
AndroidシミュレータとかiPhoneエミュレータっていうのは間違いだよ!

仕組み

シミュレータとエミュレータ、見た目は似たようなものでも中身は全然違う。
シミュレータは外から見た振る舞いを再現するだけなのに対して、エミュレータは中身の動作まで再現する。
ソフト的に言うと、シミュレータはインターフェースの再現、エミュレータはオブジェクトの再現というイメージ。ちなみにエミュレータはICE(In Circuit Emulator)のようにHWによるエミュレータもある。

Host移植性

シミュレータの中身はほとんどHostシステムで実装されているため、別Hostで動作させるためにはそのHostですべて新規に実装しないといけないので移植性は悪い。
エミュレータも実装は相当難しいと思うが、QEMUのようなマルチHostに対応しているエミュレータが存在するので、それを使うことで簡単に別のHost上で動作させることが出来る。

軽さ

シミュレータは、見た目だけ真似しているので、もっとも簡単な例としてはラッパー一枚だけですむ。

void targetFunc() {
    similarFuncOnHost();
}

エミュレータは中身を全部再現するので

void targetFunc() {
    targetMiddleWare() {
        targetOsSystemCall() {
            targetHwAccess() {
                similarFunctionOnHost();
            }
        }
    }
}

という感じでターゲット上での動作をすべて再現する。スケジューリングやメモリ管理も含まれる。

再現性

一般的には、シミュレータは「なんちゃって」なので再現性が悪いです。Windows上でRTOSシミュレータを動かした場合、処理は似たようなものでもシステムレベルでの動作までは再現出来ないのが一般的で、RTOSでは命のリアルタイム性が再現出来なかったりします。

ところが、iOSに関してはTargetOSがHostOSを元に作られてるし、なにより同じ会社で、相当力をいれて開発してるため再現性が高い。

実機とのバイナリ互換

いかに再現性が高かろうと、シミュレータに絶対超えられない壁は実機とのバイナリ互換。バイナリ互換性がないため、実機用、シミュレータ用と別々にビルドしないといけない。
一方エミュレータは実機と全く同じバイナリが動作する。みんなが大好きなファミコンエミュレータも、エミュレータだから吸いだしたROMを動作させることが出来る。シミュレータだったらこうはいかない。

これからのトレンド、あるいは希望

Androidはバージョンが上がるごとにエミュレータの動作が重くなっている。最新SDKであるhonycombはMacBookAirで実行すると定常状態でCPU1個を占領し、ほぼ動作しないといっていい。
一方iPhoneシミュレータはサクサク動くし、安定性、再現性も向上している。
HostとTargetが同じようなシステムの場合はシミュレートするほうが理にかなってる気がするし、開発マシンの仮想化やマルチOSブートも簡単になったから、マルチHostは捨ててもいいんじゃないかな?

Ubuntu上でサクサク動作するAndroidシミュレータ欲しいよう。