La distinction est profondément significative car les langages compilés restreignent la sémantique d'une manière que les langages interprétés ne font pas nécessairement. Certaines techniques d'interprétation sont très difficiles (pratiquement impossibles) à compiler.
Le code interprété peut faire des choses comme générer du code au moment de l'exécution et donner à ce code une visibilité sur les liaisons lexicales d'une étendue existante. Voilà un exemple. Un autre est que les interprètes peuvent être étendus avec du code interprété qui peut contrôler la façon dont le code est évalué. C'est la base des anciens "fexprs" de Lisp: des fonctions qui sont appelées avec des arguments non évalués et qui décident quoi en faire (avoir un accès complet à l'environnement nécessaire pour parcourir le code et évaluer les variables, etc.). Dans les langages compilés, vous ne pouvez pas vraiment utiliser cette technique; vous utilisez des macros à la place: des fonctions qui sont appelées au moment de la compilation avec des arguments non évalués, et traduisez le code plutôt que d'interpréter.
Certaines implémentations de langage sont construites autour de ces techniques; leurs auteurs rejettent la compilation comme étant un objectif important et adoptent plutôt ce type de flexibilité.
L'interprétation sera toujours utile comme technique d'amorçage d'un compilateur. Pour un exemple concret, regardez CLISP (une implémentation populaire de Common Lisp). CLISP a un compilateur qui est écrit en lui-même. Lorsque vous générez CLISP, ce compilateur est interprété au cours des premières étapes de génération. Il est utilisé pour se compiler, puis une fois compilé, la compilation se fait à l'aide du compilateur compilé.
Sans noyau d'interpréteur, vous auriez besoin de démarrer avec du Lisp existant, comme le fait SBCL.
Avec l'interprétation, vous pouvez développer un langage à partir de zéro, en commençant par le langage d'assemblage. Développez les E / S de base et les routines de base, puis écrivez un eval, toujours un langage machine. Une fois que vous avez évalué, écrivez dans la langue de haut niveau; le noyau du code machine effectue l'évaluation. Utilisez cette fonction pour étendre la bibliothèque avec de nombreuses autres routines et écrire également un compilateur. Utilisez le compilateur pour compiler ces routines et le compilateur lui-même.
Interprétation: un tremplin important dans le chemin menant à la compilation!