Po pierwsze, chociaż z pewnością istnieją instrukcje bardzo podobne, nie jest tak, że istnieje zestaw instrukcji, które zawsze zachowują się w ten sam sposób na różnych architekturach procesora. Do dokładnej emulacji (zwykle) nie wystarczy przetłumaczyć każdą instrukcję - musisz obsługiwać dostęp do pamięci, czas, przerwania ... i to tylko dla procesora.
Wydaje się, że to, o czym myślisz, to rekompilacja statyczna, ale jest to bardzo trudne (w rzeczywistości myślę, że sprowadza się to do problemu zatrzymania , co w praktyce czyni go niemożliwym). W praktyce czasami możemy to zrobić dla podzbioru programów, ale nie można napisać kompilatora ogólnego przeznaczenia, który pobiera kod obiektu dla jednej architektury jako dane wejściowe i generuje doskonale równoważny kod dla innego. Na przykład trudno byłoby obsłużyć kod samomodyfikujący przy użyciu tej metody.
Rekompilacja dynamiczna (która generuje kod w locie podczas wykonywania programu) jest bardziej skuteczna (nadal nie jest trywialna, aby zrobić dobrze). Konkretne problemy będą jednak zależeć od architektury. W wielu przypadkach emulacja procesora nie jest problemem, ale emulowanie różnych urządzeń peryferyjnych przy zachowaniu dokładnego taktowania jest (patrz np . Artykuł byuu na temat emulacji SNES ).
Czasami możesz zignorować wiele z tych ograniczeń i nadal emulować sprzęt wystarczająco dobrze, aby uruchomić podzestaw oprogramowania, ale o ile wiem, nigdy nie jest możliwe, aby mieć 100% dokładności przy zerowym obciążeniu, chyba że masz rzeczywisty sprzęt.