シミュレータとエミュレータの違い
似てるけど似ていない、少し似ているシミュレータとエミュレータの違いについてまとめてみました。
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を元に作られてるし、なにより同じ会社で、相当力をいれて開発してるため再現性が高い。