Podsumowanie, które podaję poniżej, oparte jest na „Kompilatorach, zasadach, technikach i narzędziach”, Aho, Lam, Sethi, Ullman, (Pearson International Edition, 2007), strony 1, 2, z dodatkiem moich własnych pomysłów.
Dwa podstawowe mechanizmy przetwarzania programu to kompilacja i interpretacja .
Kompilacja pobiera jako dane wejściowe program źródłowy w danym języku i generuje program docelowy w języku docelowym.
source program --> | compiler | --> target program
Jeśli językiem docelowym jest kod maszynowy, można go wykonać bezpośrednio na niektórych procesorach:
input --> | target program | --> output
Kompilacja obejmuje skanowanie i tłumaczenie całego programu wejściowego (lub modułu) i nie wymaga jego wykonania.
Interpretacja przyjmuje jako dane wejściowe program źródłowy i jego dane wejściowe, i tworzy wynik programu źródłowego
source program, input --> | interpreter | --> output
Interpretacja zazwyczaj polega na przetwarzaniu (analizie i wykonywaniu) programu pojedynczo.
W praktyce wiele procesorów językowych stosuje połączenie obu tych podejść. Np. Programy Java są najpierw tłumaczone (kompilowane) na program pośredni (kod bajtowy):
source program --> | translator | --> intermediate program
dane wyjściowe z tego kroku są następnie wykonywane (interpretowane) przez maszynę wirtualną:
intermediate program + input --> | virtual machine | --> output
Aby jeszcze bardziej skomplikować sytuację, JVM może wykonać kompilację just-in-time w czasie wykonywania, aby przekonwertować kod bajtowy na inny format, który jest następnie wykonywany.
Ponadto, nawet podczas kompilacji do języka maszynowego, plik binarny jest uruchamiany przez interpreter, który jest implementowany przez procesor. Dlatego nawet w tym przypadku używasz hybrydy kompilacji + interpretacji.
Tak więc rzeczywiste systemy używają mieszanki tych dwóch, więc trudno powiedzieć, czy dany procesor językowy jest kompilatorem, czy tłumaczem, ponieważ prawdopodobnie użyje obu mechanizmów na różnych etapach przetwarzania. W takim przypadku prawdopodobnie bardziej odpowiednie byłoby użycie innego, bardziej neutralnego terminu.
Niemniej kompilacja i interpretacja to dwa odrębne rodzaje przetwarzania, jak opisano na powyższych schematach,
Aby odpowiedzieć na wstępne pytania.
Kompilator stworzyłby język maszynowy, który działa bezpośrednio na fizycznym sprzęcie?
Kompilator niekoniecznie tłumaczy program napisany dla maszyny M1 na równoważny program napisany dla maszyny M2. Maszyna docelowa może być zaimplementowana sprzętowo lub być maszyną wirtualną. Koncepcyjnie nie ma różnicy. Ważne jest to, że kompilator patrzy na fragment kodu i tłumaczy go na inny język bez wykonywania go.
Więc interpreter nie tworzy języka maszynowego, ale kompilator robi to dla swojego wejścia?
Jeśli podczas tworzenia odwołujesz się do wyniku, kompilator tworzy program docelowy, który może być w języku maszynowym, interpreter tego nie robi.