Istnieją trzy ogólne tryby wykonania dla nowoczesnych języków wysokiego poziomu:
Interpretowany Kiedy kod napisany w języku jest interpretowany, jego składnia jest odczytywana, a następnie wykonywana bezpośrednio, bez etapu kompilacji. Program zwany interpreterem czyta każdą instrukcję programu, podążając za jego przepływem, a następnie decyduje, co zrobić i wykonuje to. Hybryda interpretera i kompilatora skompiluje instrukcję do kodu maszynowego i wykona go; kod maszynowy jest następnie odrzucany, aby zostać zinterpretowany na nowo, jeśli linia jest wykonywana ponownie. Interpretery są zazwyczaj najprostszymi implementacjami zachowania języka, w porównaniu do dwóch pozostałych wariantów wymienionych tutaj. Kompilacja Kiedy kod napisany w danym języku jest kompilowany, jego składnia jest przekształcana w formę wykonywalną przed uruchomieniem. Istnieją dwa rodzaje kompilacji: Generowanie kodu maszynowego Niektóre kompilatory kompilują kod źródłowy bezpośrednio do kodu maszynowego. Jest to oryginalny tryb kompilacji, a języki, które są bezpośrednio i całkowicie przekształcone w kod maszynowy w ten sposób, mogą być nazywane prawdziwie skompilowanymi językami. Zobacz język asemblera. Reprezentacje pośrednie Gdy kod napisany w języku jest kompilowany do reprezentacji pośredniej, reprezentacja ta może być zoptymalizowana lub zapisana do późniejszego wykonania bez potrzeby ponownego czytania pliku źródłowego. Kiedy reprezentacja pośrednia jest zapisywana, może mieć formę taką jak kod bajtowy. Reprezentacja pośrednia musi być następnie zinterpretowana lub dalej skompilowana w celu jej wykonania. Maszyny wirtualne, które wykonują kod bajtowy bezpośrednio lub przekształcają go dalej w kod maszynowy, zatarły niegdyś jasne rozróżnienie pomiędzy reprezentacjami pośrednimi a prawdziwie skompilowanymi językami. Kod napisany w danym języku może być przetłumaczony na język niższego poziomu, dla którego kompilatory kodu natywnego są już powszechne. JavaScript i język C są popularnymi celami dla takich translatorów. Zobacz CoffeeScript, Chicken Scheme i Eiffel jako przykłady. Konkretnie, wygenerowany kod C i C++ można zobaczyć (jako wygenerowany z języka Eiffel przy użyciu EiffelStudio IDE) w katalogu EIFGENs dowolnego skompilowanego projektu Eiffel. W języku Eiffel proces tłumaczenia jest określany jako transcompiling lub transcompiled, a kompilator Eiffel jako transcompiler lub kompilator source-to-source.
Zauważ, że języki nie są ściśle interpretowanymi lub kompilowanymi językami. Raczej implementacje zachowania języka używają interpretowania lub kompilowania. Na przykład ALGOL 60 i Fortran zostały zinterpretowane (mimo że były bardziej typowo kompilowane). Podobnie, Java pokazuje trudność w próbie zastosowania tych etykiet do języków, a nie do implementacji; Java jest kompilowana do kodu bajtowego, który jest następnie wykonywany przez interpretację (w wirtualnej maszynie Javy (JVM)) lub kompilację (zwykle z kompilatorem just-in-time, takim jak HotSpot, ponownie w JVM). Co więcej, kompilacja, transkompilacja i interpretacja nie są ściśle ograniczone tylko do opisu artefaktu kompilatora (binarnego pliku wykonywalnego lub zespołu IL).
Architektura komputerowa języka wysokiego poziomuEdit
Alternatywnie możliwe jest, aby język wysokiego poziomu był bezpośrednio zaimplementowany przez komputer – komputer bezpośrednio wykonuje kod HLL. Jest to znane jako architektura komputera języka wysokiego poziomu – sama architektura komputera jest zaprojektowana tak, aby była ukierunkowana przez konkretny język wysokiego poziomu. Na przykład duże systemy Burroughs były maszynami docelowymi dla ALGOL-a 60.