La distinción es profundamente significativa porque los lenguajes compilados restringen la semántica de formas que los lenguajes interpretados no necesariamente. Algunas técnicas interpretativas son muy difíciles (prácticamente imposibles) de compilar.
El código interpretado puede hacer cosas como generar código en tiempo de ejecución y darle visibilidad a ese código en enlaces léxicos de un alcance existente. Ese es un ejemplo. Otra es que los intérpretes se pueden ampliar con código interpretado que puede controlar cómo se evalúa el código. Esta es la base de los antiguos "fexprs" de Lisp: funciones que se llaman con argumentos no evaluados y deciden qué hacer con ellos (tener acceso total al entorno necesario para recorrer el código y evaluar variables, etc.). En lenguajes compilados, realmente no puedes usar esa técnica; usa macros en su lugar: funciones que se llaman en tiempo de compilación con argumentos no evaluados y traducen el código en lugar de interpretarlo.
Algunas implementaciones de lenguaje se basan en estas técnicas; sus autores rechazan la compilación como un objetivo importante, y más bien adoptan este tipo de flexibilidad.
La interpretación siempre será útil como técnica para arrancar un compilador. Para un ejemplo concreto, mire CLISP (una implementación popular de Common Lisp). CLISP tiene un compilador que está escrito en sí mismo. Cuando compila CLISP, ese compilador se interpreta durante los primeros pasos de construcción. Se utiliza para compilarse, y luego, una vez que se compila, la compilación se realiza utilizando el compilador compilado.
Sin un núcleo de intérprete, necesitaría arrancar con algunos Lisp existentes, como lo hace SBCL.
Con la interpretación, puede desarrollar un lenguaje desde cero, comenzando con el lenguaje ensamblador. Desarrolle las rutinas básicas de E / S y núcleo, luego escriba una evaluación, aún lenguaje máquina Una vez que haya evaluado, escriba en el lenguaje de alto nivel; el núcleo del código de máquina realiza la evaluación. Utilice esta función para ampliar la biblioteca con muchas más rutinas y también escriba un compilador. Use el compilador para compilar esas rutinas y el compilador mismo.
Interpretación: ¡un trampolín importante en el camino que conduce a la compilación!