Zadaje się tutaj wiele pytań na temat interpretowanych i skompilowanych narzędzi językowych. Zastanawiam się, czy to rozróżnienie rzeczywiście ma jakiś sens. (W rzeczywistości pytania zwykle dotyczą języków, ale naprawdę myślą o najpopularniejszych implementacjach tych języków).
Obecnie prawie żadna implementacja nie jest ściśle interpretowana. tzn. prawie nikt nie analizuje i nie uruchamia kodu po jednej linii na raz. Ponadto implementacja, która kompiluje się do kodu maszynowego, również staje się coraz mniej powszechna. Coraz częściej kompilatory są ukierunkowane na jakąś maszynę wirtualną.
W rzeczywistości większość wdrożeń jest zbieżna w oparciu o tę samą podstawową strategię. Kompilator wytwarza kod bajtowy, który jest interpretowany lub kompilowany do kodu natywnego za pomocą JIT. To naprawdę połączenie tradycyjnych pomysłów kompilacji i interpretacji.
Dlatego pytam: czy istnieje obecnie użyteczne rozróżnienie między interpretowanymi implementacjami a skompilowanymi implementacjami?
źródło
P-code
zostały wprowadzone w 1966 roku. IBM Aix istnieje od 1986 roku.Odpowiedzi:
Ważne jest, aby pamiętać, że tłumaczenie i kompilacja to nie tylko alternatywy dla siebie. Ostatecznie każdy napisany program (w tym skompilowany do kodu maszynowego) zostanie zinterpretowany. Interpretacja kodu oznacza po prostu pobranie zestawu instrukcji i zwrócenie odpowiedzi.
Z drugiej strony kompilacja oznacza konwersję programu z jednego języka na inny. Zwykle przyjmuje się, że podczas kompilacji kod jest kompilowany do języka „niższego poziomu” (np. Kod maszynowy, kod bajtowy VM itp.). Ten skompilowany kod jest nadal interpretowany później.
Jeśli chodzi o pytanie, czy istnieje użyteczna różnica między językami tłumaczonymi a skompilowanymi, osobiście uważam, że każdy powinien mieć podstawową wiedzę na temat tego, co dzieje się z kodem, który piszą podczas tłumaczenia. Tak więc, jeśli ich kod jest kompilowany JIT, buforowany kodem bajtowym itp., Programista powinien przynajmniej mieć podstawową wiedzę na temat tego, co to oznacza.
źródło
Rozróżnienie to ma głębokie znaczenie, ponieważ języki skompilowane ograniczają semantykę w taki sposób, że języki interpretowane niekoniecznie. Niektóre techniki interpretacyjne są bardzo trudne (praktycznie niemożliwe) do skompilowania.
Zinterpretowany kod może wykonywać takie czynności, jak generowanie kodu w czasie wykonywania i udostępnianie tego kodu w powiązaniach leksykalnych istniejącego zakresu. To jeden przykład. Innym jest to, że tłumacze mogą zostać rozszerzeni o interpretowany kod, który może kontrolować sposób oceny kodu. To jest podstawa starożytnych „fexprs” Lispa: funkcje, które są wywoływane z nieocenionych argumentów i decydują, co z nimi zrobić (mając pełny dostęp do środowiska niezbędnego do przejścia kodu i oceny zmiennych itp.). W skompilowanych językach tak naprawdę nie można użyć tej techniki; zamiast tego używasz makr: funkcji, które są wywoływane w czasie kompilacji z nieocenionymi argumentami i tłumaczą kod zamiast interpretować.
Niektóre implementacje językowe są oparte na tych technikach; ich autorzy odrzucają kompilację jako ważny cel i raczej przyjmują tego rodzaju elastyczność.
Tłumaczenie zawsze będzie przydatne jako technika ładowania kompilatora. Konkretny przykład, spójrz na CLISP (popularna implementacja Common Lisp). CLISP ma kompilator, który jest napisany sam w sobie. Podczas kompilacji CLISP ten kompilator jest interpretowany na wczesnych etapach budowy. Służy do samodzielnej kompilacji, a następnie po skompilowaniu kompilacja jest wykonywana przy użyciu skompilowanego kompilatora.
Bez jądra interpretera będziesz musiał uruchomić się z istniejącym Lispem, podobnie jak SBCL.
Dzięki interpretacji możesz rozwijać język od zera, zaczynając od języka asemblera. Opracuj podstawowe procedury we / wy i podstawowe, a następnie napisz ewaluacyjny, wciąż maszynowy język. Po zakończeniu ewaluacji pisz w języku wysokiego poziomu; jądro kodu maszynowego dokonuje oceny. Użyj tego narzędzia, aby rozszerzyć bibliotekę o wiele innych procedur i napisać kompilator. Użyj kompilatora do skompilowania tych procedur i samego kompilatora.
Interpretacja: ważny krok na drodze do kompilacji!
źródło
W rzeczywistości wiele implementacji języków jest wciąż ściśle interpretowanych, po prostu możesz ich nie znać. Aby wymienić kilka: języki powłoki UNIX, powłoki cmd Windows i PowerScript, Perl, awk, sed, MATLAB, Mathematica i tak dalej.
źródło
Myślę: absolutnie tak .
Naprawdę, C ++ ma na celu przeniesienie do domeny kompilatora jakiejś koncepcji wysokiego poziomu, która zwykle jest przekazywana tłumaczom, ale pozostaje po stronie mniejszości ...
źródło
Przydatne rozróżnienie: interpretowane programy mogą się modyfikować, dodając lub zmieniając funkcje w czasie wykonywania.
źródło