Zunächst kann eine Programmiersprache sowohl interpretiert als auch kompiliert werden. Interpretation und Kompilierung sind nur Methoden zum Generieren von ausführbarem Code aus dem Quellcode. Mit einem Interpreter ist der Quellcode gelesen und wird interpretiert durch einen Interpreter , der dann den Code ausführt , wie es interpretiert. Ein Compiler hingegen liest den Quellcode und generiert aus dem Quellcode eine ausführbare Binärdatei - damit das Programm als separater Prozess unabhängig ausgeführt werden kann.
Bevor sich jemand wundert ... Ja, C / C ++ / C # / Java kann interpretiert werden, und ja, JavaScript- und Bash-Skripte können kompiliert werden. Ob es für diese Sprachen Dolmetscher oder Compiler gibt, ist eine andere Frage.
Um nun die Frage zu beantworten, wann wir "interpretierte Sprache" anstelle von "kompilierter Sprache" verwenden. Die Frage selbst ist etwas verwirrend, aber ich gehe davon aus, dass es bedeutet, wann die Interpretation der Zusammenstellung vorzuziehen ist. Einer der Nachteile der Kompilierung besteht darin, dass aufgrund des Kompilierungsprozesses ein gewisser Overhead entsteht. Der Quellcode muss zu ausführbarem Maschinencode kompiliert werden, sodass er nicht für Aufgaben geeignet ist, die beim Aufrufen des Quellcodes zum Ausführen eines Programms nur eine minimale Verzögerung erfordern . Andererseits ist kompilierter Quellcode aufgrund des durch die Interpretation des Codes verursachten Overheads fast immer schneller als gleichwertig interpretierter Quellcode. Dolmetscher hingegen können den Quellcode aufrufen und ausführen mit sehr geringem Aufrufaufwand, jedoch auf Kosten der Laufzeitleistung.
Am Ende ist es nahezu unmöglich, bestimmte Anwendungsfälle zu erwähnen, wenn einer nach dem anderen bevorzugt werden soll, aber zum Beispiel wäre ein (meiner Meinung nach sehr unrealistischer) Fall, wenn sich der Programmquellcode zwischen Programmaufrufen dynamisch ändert und der Aufwand für das Kompilieren ebenfalls ist hoch, damit es eine tragfähige Wahl ist. In diesem Fall wäre es wahrscheinlich wünschenswert, den Quellcode zu interpretieren, anstatt ihn zu kompilieren.
Es gibt jedoch etwas, das als reales Beispiel angesehen werden kann: Verstecken des Quellcodes bei der Bereitstellung. Mit nativkompilierter Code Der Entwickler stellt den ausführbaren Macine-Code des Programms und der Daten bereit. Bei interpretiertem Code muss der Quellcode selbst bereitgestellt werden, der dann mit viel weniger Aufwand überprüft und rückentwickelt werden kann als bei der Rückentwicklung von nativem Maschinencode. Eine Ausnahme bilden Sprachen wie C # und Java, die zu sofortiger Sprache / Bytecode kompiliert werden (MSIL für C # und Java-Bytecode für Java), die dann zur Laufzeit "just in time" bereitgestellt und kompiliert werden, ähnlich wie es ein Interpreter tut. Es gibt jedoch sogenannte Dekompilierer für MSIL und Java Bytecode, die den ursprünglichen Quellcode mit relativ guter Genauigkeit rekonstruieren können. Daher ist das Reverse Engineering solcher Produkte weitaus trivialer als das Reverse Engineering von Produkten, die im nativen Maschinencode eingesetzt werden.