Lenguas comstackdas vs. interpretadas

Estoy tratando de entender mejor la diferencia. He encontrado muchas explicaciones en línea, pero tienden más a las diferencias abstractas que a las implicaciones prácticas.

La mayoría de mis experiencias de progtwigción han sido con CPython (dynamic, interpretado) y Java (estático, comstackdo). Sin embargo, entiendo que hay otros tipos de lenguajes interpretados y comstackdos. Aparte del hecho de que los archivos ejecutables pueden distribuirse desde progtwigs escritos en lenguajes comstackdos, ¿existen ventajas / desventajas para cada tipo? A menudo, escucho a personas argumentando que los lenguajes interpretados pueden usarse interactivamente, pero creo que los lenguajes comstackdos también pueden tener implementaciones interactivas, ¿correcto?

Un lenguaje comstackdo es uno donde el progtwig, una vez comstackdo, se expresa en las instrucciones de la máquina de destino. Por ejemplo, una operación “+” adicional en su código fuente podría traducirse directamente a la instrucción “AGREGAR” en el código de máquina.

Un lenguaje interpretado es uno donde las instrucciones no son ejecutadas directamente por la máquina de destino, sino que son leídas y ejecutadas por algún otro progtwig (que normalmente está escrito en el idioma de la máquina nativa). Por ejemplo, la misma operación “+” sería reconocida por el intérprete en el tiempo de ejecución, que luego llamaría a su propia función “agregar (a, b)” con los argumentos apropiados, que luego ejecutaría la instrucción “AGREGAR” del código de máquina .

Puede hacer cualquier cosa que pueda hacer en un lenguaje interpretado en un lenguaje comstackdo y viceversa, ambos son Turing completos. Sin embargo, ambos tienen ventajas y desventajas para la implementación y el uso.

Voy a generalizar completamente (¡los puristas me perdonan!) Pero, a grandes rasgos, aquí están las ventajas de los lenguajes comstackdos:

  • Rendimiento más rápido utilizando directamente el código nativo de la máquina de destino
  • Oportunidad de aplicar optimizaciones bastante potentes durante la etapa de comstackción.

Y aquí están las ventajas de los lenguajes interpretados:

  • Más fácil de implementar (¡escribir buenos comstackdores es muy difícil!)
  • No es necesario ejecutar una etapa de comstackción: puede ejecutar código directamente “sobre la marcha”
  • Puede ser más conveniente para lenguajes dynamics.

Tenga en cuenta que las técnicas modernas, como la comstackción de código de bytes, agregan cierta complejidad adicional. Lo que sucede aquí es que el comstackdor apunta a una “máquina virtual” que no es lo mismo que el hardware subyacente. Estas instrucciones de la máquina virtual se pueden volver a comstackr en una etapa posterior para obtener el código nativo (por ejemplo, como lo hizo el comstackdor JVM JIT de Java).

Un lenguaje en sí no es comstackdo ni interpretado, solo una implementación específica de un lenguaje es. Java es un ejemplo perfecto. Existe una plataforma basada en bytecode (la JVM), un comstackdor nativo (gcj) y un intérprete para un superconjunto de Java (bsh). Entonces, ¿qué es Java ahora? ¿Bytecode comstackdo, comstackdo nativo o interpretado?

Otros idiomas, que se comstackn y se interpretan, son Scala, Haskell o Ocaml. Cada uno de estos idiomas tiene un intérprete interactivo, así como un comstackdor a código de byte o código de máquina nativo.

Así que, en general, categorizar idiomas por “comstackdo” e “interpretado” no tiene mucho sentido.

Comience a pensar en términos de una: explosión del pasado

Érase una vez, hace mucho tiempo, vivía en la tierra de los intérpretes y comstackdores informáticos. Todo tipo de alboroto se produjo sobre los méritos de uno sobre el otro. La opinión general en ese momento era algo así como:

  • Intérprete: rápido de desarrollar (editar y ejecutar). Lento de ejecutar porque cada instrucción tuvo que interpretarse en código de máquina cada vez que se ejecutó (piense en lo que esto significó para un bucle ejecutado miles de veces).
  • Comstackdor: lento de desarrollar (edite, compile, enlace y ejecute. Los pasos de comstackción / enlace pueden tomar mucho tiempo). Rápido de ejecutar. Todo el progtwig ya estaba en código de máquina nativo.

Una diferencia de uno o dos orden de magnitud en el rendimiento en tiempo de ejecución existía entre un progtwig interpretado y un progtwig comstackdo. Otros puntos distintivos, por ejemplo, la mutabilidad en tiempo de ejecución del código, también fueron de algún interés, pero la distinción principal giró en torno a los problemas de rendimiento en tiempo de ejecución.

Hoy en día, el paisaje ha evolucionado hasta tal punto que la distinción comstackda / interpretada es bastante irrelevante. Muchos lenguajes comstackdos recurren a servicios en tiempo de ejecución que no están completamente basados ​​en código de máquina. Además, la mayoría de los idiomas interpretados se “comstackn” en un código de bytes antes de la ejecución. Los intérpretes de código de bytes pueden ser muy eficientes y compiten con algunos códigos generados por comstackdores desde un punto de vista de velocidad de ejecución.

La diferencia clásica es que los comstackdores generaron código de máquina nativo, los intérpretes leen el código fuente y el código de máquina generado sobre la marcha utilizando algún tipo de sistema de tiempo de ejecución. Hoy quedan muy pocos intérpretes clásicos, casi todos comstackdos en código de bytes (o algún otro estado semi-comstackdo) que luego se ejecuta en una “máquina” virtual.

Los casos extremos y simples:

  • Un comstackdor producirá un ejecutable binario en el formato ejecutable nativo de la máquina de destino. Este archivo binario contiene todos los recursos necesarios, excepto las bibliotecas del sistema; está listo para ejecutarse sin más preparación ni procesamiento, y funciona como un rayo porque el código es el código nativo de la CPU en la máquina de destino.

  • Un intérprete presentará al usuario una solicitud en un bucle donde puede ingresar sentencias o código, y al presionar RUN o el equivalente, el intérprete examinará, escaneará, analizará e interpretará cada línea hasta que el progtwig se ejecute hasta un punto de parada o un error. Debido a que cada línea se trata por sí sola y el intérprete no “aprende” nada de haber visto la línea antes, el esfuerzo de convertir el lenguaje legible por humanos en instrucciones de máquina se incurre cada vez en cada línea, por lo que es lento. En el lado positivo, el usuario puede inspeccionar e interactuar de otra manera con su progtwig en todo tipo de formas: cambio de variables, cambio de código, ejecución en modo de seguimiento o depuración … lo que sea.

Con aquellos fuera del camino, déjenme explicarles que la vida ya no es tan simple. Por ejemplo,

  • Muchos intérpretes comstackrán previamente el código que se les da para que el paso de la traducción no tenga que repetirse una y otra vez.
  • Algunos comstackdores no comstackn las instrucciones de la máquina específicas de la CPU, sino el código de bytes, una especie de código de máquina artificial para una máquina ficticia. Esto hace que el progtwig comstackdo sea un poco más portátil, pero requiere un intérprete de código de bytes en cada sistema de destino.
  • Los intérpretes de bytecode (estoy mirando Java aquí) recientemente tienden a volver a comstackr el bytecode que obtienen para la CPU de la sección de destino justo antes de la ejecución (llamado JIT). Para ahorrar tiempo, a menudo esto solo se hace para el código que se ejecuta a menudo (hotspots).
  • Algunos sistemas que se parecen y actúan como intérpretes (Clojure, por ejemplo) comstackn cualquier código que obtienen de forma inmediata, pero permiten el acceso interactivo al entorno del progtwig. Eso es básicamente la conveniencia de los intérpretes con la velocidad de la comstackción binaria.
  • Algunos comstackdores no comstackn realmente, simplemente comstackn y comprimen previamente el código. Oí hace un tiempo que así es como funciona Perl. Así que a veces el comstackdor simplemente hace un poco del trabajo y la mayor parte sigue siendo interpretación.

Al final, en estos días, la interpretación frente a la comstackción es una compensación, ya que el tiempo empleado (una vez) en la comstackción suele ser recompensado por un mejor rendimiento en tiempo de ejecución, pero un entorno interpretativo que ofrece más oportunidades para la interacción. Comstackr frente a interpretar es principalmente una cuestión de cómo el trabajo de “entender” el progtwig se divide entre diferentes procesos, y la línea es un poco borrosa en estos días, ya que los idiomas y los productos intentan ofrecer lo mejor de ambos mundos.

De http://www.quora.com/What-is-the-difference-between-compiled-and-interpreted-programming-languages

No hay diferencia, porque “lenguaje de progtwigción comstackdo” y “lenguaje de progtwigción interpretado” no son conceptos significativos. Cualquier lenguaje de progtwigción, y realmente me refiero a cualquiera, puede ser interpretado o comstackdo. Así, la interpretación y la comstackción son técnicas de implementación, no atributos de lenguajes.

La interpretación es una técnica mediante la cual otro progtwig, el intérprete, realiza operaciones en nombre del progtwig que se está interpretando para ejecutarlo. Si puede imaginar leer un progtwig y hacer lo que se dice hacer paso a paso, digamos en un papel de borrador, eso es lo que hace un intérprete también. Una razón común para interpretar un progtwig es que los intérpretes son relativamente fáciles de escribir. Otra razón es que un intérprete puede monitorear lo que un progtwig intenta hacer mientras se ejecuta, para hacer cumplir una política, por ejemplo, por seguridad.

La comstackción es una técnica mediante la cual un progtwig escrito en un idioma (el “idioma de origen”) se traduce a un progtwig en otro idioma (el “lenguaje de objetos”), que se espera que signifique lo mismo que el progtwig original. Mientras se realiza la traducción, es común que el comstackdor también intente transformar el progtwig de manera que el progtwig objeto sea más rápido (¡sin cambiar su significado!). Una razón común para comstackr un progtwig es que hay una buena manera de ejecutar progtwigs en el lenguaje de objetos rápidamente y sin la sobrecarga de interpretar el idioma de origen en el camino.

Es posible que, según las definiciones anteriores, haya adivinado que estas dos técnicas de implementación no se excluyen mutuamente, e incluso pueden ser complementarias. Tradicionalmente, el lenguaje de objeto de un comstackdor era un código de máquina o algo similar, que se refiere a cualquier número de lenguajes de progtwigción entendidos por CPU de computadora en particular. El código de la máquina luego se ejecutaría “en el metal” (aunque uno podría ver, si se mira lo suficientemente de cerca, que el “metal” se parece mucho a un intérprete). Sin embargo, hoy en día es muy común usar un comstackdor para generar código objeto que debe interpretarse; por ejemplo, así es como Java solía (y en ocasiones todavía funciona) el trabajo. Hay comstackdores que traducen otros idiomas a JavaScript, que a menudo se ejecuta en un navegador web, que puede interpretar el JavaScript, o comstackrlo en una máquina virtual o código nativo. También tenemos intérpretes para el código de máquina, que se pueden usar para emular un tipo de hardware en otro. O, uno podría usar un comstackdor para generar código objeto que luego es el código fuente de otro comstackdor, que incluso podría comstackr código en la memoria justo a tiempo para que se ejecute, que a su vez. . . tienes la idea Hay muchas maneras de combinar estos conceptos.

La mayor ventaja del código fuente interpretado sobre el código fuente comstackdo es la portabilidad .

Si su código fuente está comstackdo, debe comstackr un ejecutable diferente para cada tipo de procesador y / o plataforma en que desea que se ejecute su progtwig (por ejemplo, uno para Windows x86, uno para Windows x64, uno para Linux x64, etc.). en). Además, a menos que su código sea completamente compatible con los estándares y no utilice ninguna de las bibliotecas / funciones específicas de la plataforma, ¡realmente necesitará escribir y mantener múltiples bases de código!

Si su código fuente es interpretado, solo necesita escribirlo una vez y puede ser interpretado y ejecutado por un intérprete apropiado en cualquier plataforma. ¡Es portátil ! Tenga en cuenta que un intérprete en sí es un progtwig ejecutable que se escribe y comstack para una plataforma específica.

Una ventaja del código comstackdo es que oculta el código fuente al usuario final (que podría ser propiedad intelectual ) porque en lugar de implementar el código fuente original legible, se implementa un archivo ejecutable binario oscuro.

Un comstackdor y un intérprete hacen el mismo trabajo: traducir un lenguaje de progtwigción a otro lenguaje pgoramming, por lo general más cerca del hardware, a menudo código de máquina ejecutable directo.

Tradicionalmente, “comstackdo” significa que esta traducción se realiza de una vez, la realiza un desarrollador y el ejecutable resultante se distribuye a los usuarios. Ejemplo puro: C ++. La comstackción generalmente toma bastante tiempo y trata de hacer una gran cantidad de costosas opciones de modo que el ejecutable resultante se ejecute más rápido. Los usuarios finales no tienen las herramientas y el conocimiento para comstackr cosas por sí mismos, y el ejecutable a menudo tiene que ejecutarse en una variedad de hardware, por lo que no puede hacer muchas optimizaciones específicas de hardware. Durante el desarrollo, el paso de comstackción separado significa un ciclo de retroalimentación más largo.

Tradicionalmente, “interpretado” significa que la traducción se realiza “sobre la marcha”, cuando el usuario desea ejecutar el progtwig. Ejemplo puro: PHP vainilla. Un intérprete ingenuo tiene que analizar y traducir cada pieza de código cada vez que se ejecuta, lo que lo hace muy lento. No puede realizar optimizaciones complejas y costosas porque llevaría más tiempo que el tiempo de ejecución. Pero puede utilizar completamente las capacidades del hardware en el que se ejecuta. La falta de un paso de comstackción por separado reduce el tiempo de retroalimentación durante el desarrollo.

Pero hoy en día “comstackdo contra interpretado” no es un problema en blanco o negro, hay sombras en el medio. Intérpretes ingenuos y simples están prácticamente extintos. Muchos idiomas utilizan un proceso de dos pasos en el que el código de alto nivel se traduce a un código de bytes independiente de la plataforma (que es mucho más rápido de interpretar). Luego tiene “comstackdores justo a tiempo” que comstackn código a lo sumo una vez por ejecución del progtwig, a veces resultados de caché, e incluso deciden inteligentemente interpretar el código que se ejecuta raramente, y realizan optimizaciones poderosas para el código que se ejecuta mucho. Durante el desarrollo, los depuradores son capaces de cambiar el código dentro de un progtwig en ejecución incluso para lenguajes comstackdos tradicionalmente.

Primero, una aclaración, Java no está completamente comstackdo de forma estática y enlazado en la forma en que C ++. Se comstack en el bytecode, que luego es interpretado por una JVM. La JVM puede ir y hacer la comstackción justo a tiempo al lenguaje de máquina nativo, pero no tiene que hacerlo.

Más al punto: creo que la interactividad es la principal diferencia práctica. Dado que todo se interpreta, puede tomar un pequeño fragmento de código, analizarlo y ejecutarlo en relación con el estado actual del entorno. Por lo tanto, si ya hubiera ejecutado código que inicializó una variable, tendría acceso a esa variable, etc. Realmente se presta a cosas como el estilo funcional.

Sin embargo, la interpretación cuesta mucho, especialmente cuando tiene un sistema grande con muchas referencias y contexto. Por definición, es un desperdicio porque el código idéntico puede tener que ser interpretado y optimizado dos veces (aunque la mayoría de los tiempos de ejecución tienen algo de caché y optimizaciones para eso). Aún así, usted paga un costo de tiempo de ejecución y, a menudo, necesita un entorno de tiempo de ejecución. También es menos probable que vea optimizaciones complejas de interpretación porque en la actualidad su rendimiento no es lo suficientemente interactivo.

Por lo tanto, para sistemas grandes que no van a cambiar mucho, y para ciertos idiomas, tiene más sentido precomstackr y prelinkear todo, hacer todas las optimizaciones que puede hacer. Esto termina con un tiempo de ejecución muy magro que ya está optimizado para la máquina de destino.

En cuanto a la generación de ejecutables, eso tiene poco que ver con eso, IMHO. A menudo puedes crear un ejecutable desde un lenguaje comstackdo. Pero también puede crear un ejecutable a partir de un lenguaje interpretado, excepto que el intérprete y el tiempo de ejecución ya están empaquetados en un valor exentable. Esto significa que, en general, todavía paga los costos de tiempo de ejecución (aunque estoy seguro de que para algún idioma hay formas de traducir todo a un árbol ejecutable).

No estoy de acuerdo en que todos los idiomas puedan ser interactivos. Ciertos idiomas, como C, están tan ligados a la máquina y a toda la estructura del enlace que no estoy seguro de que pueda crear una versión interactiva significativa y completa.

Es bastante difícil dar una respuesta práctica porque la diferencia está en la definición del lenguaje en sí. Es posible crear un intérprete para cada lenguaje comstackdo, pero no es posible comstackr un comstackdor para cada idioma interpretado. Se trata mucho de la definición formal de un lenguaje. Para que te guste la informática teórica que le gusta a nadie en la universidad.

El libro de Python © 2015 Imagine Publishing Ltd, simplemente distingue la diferencia con el siguiente indicio que se menciona en la página 10 como:

Un lenguaje interpretado como Python es uno donde el código fuente se convierte en código de máquina y luego se ejecuta cada vez que se ejecuta el progtwig. Esto es diferente de un lenguaje comstackdo como C, donde el código fuente solo se convierte a código de máquina una vez; el código de máquina resultante se ejecuta cada vez que se ejecuta el progtwig.

Comstackr es el proceso de crear un progtwig ejecutable a partir de un código escrito en un lenguaje de progtwigción comstackdo. La comstackción permite que la computadora ejecute y entienda el progtwig sin la necesidad del software de progtwigción utilizado para crearlo. Cuando se comstack un progtwig, a menudo se comstack para una plataforma específica (por ejemplo, la plataforma de IBM) que funciona con computadoras compatibles con IBM, pero no con otras plataformas (por ejemplo, la plataforma de Apple). El primer comstackdor fue desarrollado por Grace Hopper mientras trabajaba en la computadora Harvard Mark I. Hoy en día, la mayoría de los lenguajes de alto nivel incluirán su propio comstackdor o tendrán disponibles kits de herramientas que se pueden usar para comstackr el progtwig. Un buen ejemplo de un comstackdor usado con Java es Eclipse y un ejemplo de un comstackdor usado con C y C ++ es el comando gcc. Dependiendo de qué tan grande sea el progtwig, debería tardar unos segundos o minutos en comstackrse y, si no se encuentran errores mientras se comstack, se crea un archivo ejecutable. Verifique esta información