Przede wszystkim język programowania można interpretować i kompilować. Interpretacja i kompilacja to tylko metody generowania kodu wykonywalnego z kodu źródłowego. W przypadku interpretera kod źródłowy jest odczytywany i interpretowany przez interpretera, który następnie wykonuje kod podczas jego interpretacji. Z drugiej strony kompilator odczytuje kod źródłowy i generuje wykonywalny plik binarny z kodu źródłowego - dzięki czemu program może być uruchamiany jako osobny proces niezależnie.
Teraz, zanim ktokolwiek się zastanowi ... Tak, C / C ++ / C # / Java można interpretować i tak, można skompilować skrypty JavaScript i Bash. To, czy istnieją działający tłumacze ustni lub kompilatory dla tych języków, to kolejne pytanie.
Teraz, aby odpowiedzieć na pytanie, kiedy użyjemy „języka interpretowanego” zamiast „języka skompilowanego”. Samo pytanie jest nieco mylące, ale zakładam, że oznacza to, kiedy wolę interpretację niż kompilację. Jedną z wad kompilacji jest to, że generuje pewne obciążenie z powodu procesu kompilacji - kod źródłowy musi zostać skompilowany do wykonywalnego kodu maszynowego, więc nie nadaje się do zadań wymagających minimalnego opóźnienia podczas wywoływania kodu źródłowego w celu wykonania programu. Z drugiej strony skompilowany kod źródłowy jest prawie zawsze szybszy niż równoważny zinterpretowany kod źródłowy z powodu narzutu spowodowanego interpretacją kodu. Z drugiej strony tłumacze mogą wywoływać i uruchamiać kod źródłowy z bardzo małym narzutem wywołania, ale kosztem wydajności w czasie wykonywania.
W końcu prawie niemożliwe jest podanie jakichkolwiek konkretnych przypadków użycia, kiedy wolą jeden po drugim, ale na przykład jeden (do mojego podkreślającego, bardzo nierealistycznego) przypadek byłby, gdy kod źródłowy programu zmienia się dynamicznie między wywołaniami programu, a narzut kompilacji jest zbyt duży wysoki, aby był to realny wybór. W takim przypadku prawdopodobnie pożądana byłaby interpretacja kodu źródłowego zamiast kompilacji.
Istnieje jednak coś, co można uznać za przykład z prawdziwego świata: ukrywanie kodu źródłowego po wdrożeniu. Z natywnieskompilowany kod programista wdraża wykonywalny kod macine programu i danych. W przypadku interpretowanego kodu należy wdrożyć sam kod źródłowy, który można następnie sprawdzić i poddać inżynierii wstecznej przy znacznie mniejszym nakładzie pracy niż w przypadku natywnego kodu maszynowego. Jedynym wyjątkiem są języki takie jak C # i Java, które kompilują się do bezpośredniego języka / kodu bajtowego (MSIL dla C # i kodu bajtowego Java dla Java), które następnie są wdrażane i kompilowane „na czas” w czasie wykonywania, podobnie jak robi to interpreter. Istnieją jednak tak zwane dekompilatory dla MSIL i Java Bytecode, które mogą rekonstruować oryginalny kod źródłowy ze względnie dobrą dokładnością i jako takie, inżynieria wsteczna takich produktów jest znacznie bardziej trywialna niż produkty inżynierii wstecznej, które są wdrażane w natywnym kodzie maszynowym.