Interpretacja a translacja

Wstecz
Dalej
Indeks

Dotychczas omówiony sposób emulacji nazywa się interpretacją.

Nasze następne podejście nosi nazwę translacji i różni się od interpretacji mniej więcej tym czym kompilatory od interpreterów. Dokładniej mówiąc, bierzemy kod maszynowy z architektury gościa i w jakiś sposób tłumaczymy go na kod maszynowy gospodarza [w celu, oczywiście, uruchomienia go].

Zaletą translacji jest to, że zamiast tłumaczyć instrukcja po instrukcji, pozwala to robić bardziej "globalnie". Daje to większa elastyczność i otwiera pewne możliwości optymalizacji, o których będzie mowa przy konkretnych programach.

Pewną wadą translacji jest to, że kod wynikowy jest związany z konkretną platformą gospodarza, przez co przenośność nie jest tak prosta jak w przypadku interpreterów, w których instrukcje opisane są w języku przenośnym. Oczywiście są sposoby na radzenie sobie z tym problemem - znów będą one dokładniej opisane później.

Ogólnie rzecz biorąc translacja występuje w dwóch odmianach: statycznej i dynamicznej.

Translacja statyczna polega na przetłumaczeniu całego kodu przed uruchomieniem. Choć potencjalnie dzięki temu możemy otrzymać bardzo wysoką wydajność, technika ta wiąże się się istotnymi problemami. Największym jest samomodyfikujący się kod - sprawia on, że to co przetłumaczymy może być zupełnie nie tym co powinno być uruchomione. Nie zawsze jest też łatwo z góry sprawdzić który fragment programu jest tak naprawdę wykonywanym kodem, a który zaszytymi między nim danymi. Z tych powodów praktycznie zawsze muszą być stosowane pewne techniki dynamiczne, działające w czasie wykonania programu. Wielu twórców decyduję się w takim razie wyłącznie wyłącznie na translację dynamiczną, gdyż jest ona najbardziej elastyczna i najciekawsza w implementacji. Nie wymaga też trzymania całego wygenerowanego kodu, czy to w pamięci, co przy większych programach mogło by się okazać wręcz niemożliwe, czy to na dysku, co mogło by powodować zwolnienie działania.

Wróć do góry