Aquí se hacen muchas preguntas sobre implementos de lenguaje interpretados o compilados. Me pregunto si la distinción realmente tiene sentido. (En realidad, las preguntas son generalmente sobre idiomas, pero realmente están pensando en las implementaciones más populares de esos idiomas).
Hoy casi ninguna implementación se interpreta estrictamente. es decir, casi nadie analiza y ejecuta el código línea por línea. Además, la implementación que compila el código de máquina también se está volviendo menos común. Cada vez más, los compiladores apuntan a algún tipo de máquina virtual.
De hecho, la mayoría de las implementaciones convergen en la misma estrategia básica. El compilador produce bytecode que se interpreta o compila en código nativo a través de un JIT. Es realmente una mezcla de las ideas tradicionales de compilación e interpretación.
Por lo tanto, pregunto: ¿Hay alguna distinción útil entre las implementaciones interpretadas y la implementación compilada en estos días?
fuente
P-code
había sido introducido en 1966 primero. IBM Aix existe desde 1986.Respuestas:
Es importante recordar que interpretar y compilar no son solo alternativas entre sí. Al final, cualquier programa que escriba (incluido uno compilado en código máquina) se interpreta. Interpretar el código simplemente significa tomar un conjunto de instrucciones y devolver una respuesta.
Compilar, por otro lado, significa convertir un programa en un idioma a otro idioma. Por lo general, se supone que cuando se realiza la compilación, el código se compila en un lenguaje de "nivel inferior" (por ejemplo, código de máquina, algún tipo de código de bytes de VM, etc.). Este código compilado todavía se interpreta más adelante.
Con respecto a su pregunta de si existe una distinción útil entre los idiomas interpretados y compilados, mi opinión personal es que todos deben tener una comprensión básica de lo que está sucediendo con el código que escriben durante la interpretación. Entonces, si su código se está compilando JIT, o se almacena en caché por bytecode, etc., el programador debe al menos tener una comprensión básica de lo que eso significa.
fuente
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!
fuente
En realidad, muchas implementaciones de idiomas todavía se interpretan estrictamente, es posible que no se dé cuenta de ellas. Por nombrar algunos: los lenguajes de shell de UNIX, los cmd de Windows y los shells de PowerScript, Perl, awk, sed, MATLAB, Mathematica, etc.
fuente
Pienso: absolutamente sí .
Realmente, C ++ apunta a portar al dominio del compilador algún concepto de alto nivel que generalmente se entrega a los intérpretes, pero se mantiene en el lado minoritario ...
fuente
Distinción útil: los programas interpretados pueden modificarse agregando o cambiando funciones en tiempo de ejecución.
fuente