Die Unterscheidung ist von großer Bedeutung, da kompilierte Sprachen die Semantik in einer Weise einschränken, wie dies bei interpretierten Sprachen nicht unbedingt der Fall ist. Einige Interpretationstechniken sind sehr schwer (praktisch unmöglich) zu kompilieren.
Interpretierter Code kann beispielsweise zur Laufzeit Code generieren und diesen Code für lexikalische Bindungen eines vorhandenen Bereichs sichtbar machen. Das ist ein Beispiel. Zum anderen können Interpreter mit interpretiertem Code erweitert werden, der steuern kann, wie Code ausgewertet wird. Dies ist die Basis für alte Lisp-"fexprs": Funktionen, die mit nicht bewerteten Argumenten aufgerufen werden und entscheiden, was mit ihnen zu tun ist (uneingeschränkter Zugriff auf die erforderliche Umgebung, um den Code zu durchsuchen und Variablen auszuwerten usw.). In kompilierten Sprachen können Sie diese Technik nicht wirklich anwenden. Sie verwenden stattdessen Makros: Funktionen, die zur Kompilierungszeit mit nicht bewerteten Argumenten aufgerufen werden, und übersetzen den Code, anstatt ihn zu interpretieren.
Einige Sprachimplementierungen basieren auf diesen Techniken. Ihre Autoren lehnen das Kompilieren als wichtiges Ziel ab und begrüßen diese Art der Flexibilität.
Das Interpretieren ist immer nützlich, um einen Compiler zu booten. Ein konkretes Beispiel finden Sie in CLISP (eine beliebte Implementierung von Common Lisp). CLISP hat einen Compiler, der in sich selbst geschrieben ist. Wenn Sie CLISP erstellen, wird dieser Compiler während der ersten Erstellungsschritte interpretiert. Es wird verwendet, um sich selbst zu kompilieren. Sobald es kompiliert ist, erfolgt das Kompilieren mit dem kompilierten Compiler.
Ohne einen Interpreter-Kernel müssten Sie mit einem vorhandenen Lisp booten, wie es SBCL tut.
Mit der Interpretation können Sie eine Sprache von Grund auf neu entwickeln, beginnend mit der Assemblersprache. Entwickeln Sie die grundlegenden I / O- und Core-Routinen und schreiben Sie dann eine eval noch Maschinensprache. Sobald Sie eval haben, schreiben Sie in der Hochsprache; Der Maschinencode-Kernel führt die Auswertung durch. Verwenden Sie diese Funktion, um die Bibliothek um viele weitere Routinen zu erweitern und auch einen Compiler zu schreiben. Verwenden Sie den Compiler, um diese Routinen und den Compiler selbst zu kompilieren.
Interpretation: ein wichtiger Schritt auf dem Weg zur Zusammenstellung!