¿Cuál es la diferencia entre lenguaje compilado e interpretado?

118

Después de leer algo de material sobre este tema, todavía no estoy seguro de cuál es la diferencia entre un lenguaje compilado y un lenguaje interpretado. Me dijeron que esta es una de las diferencias entre Java y JavaScript. ¿Alguien podría ayudarme a entenderlo?

SIr Codealot
fuente

Respuestas:

165

¿Cuál es la diferencia entre lenguaje compilado e interpretado?

La diferencia no está en el idioma; está en la implementación .

Habiendo sacado eso de mi sistema, aquí hay una respuesta:

  • En una implementación compilada, el programa original se traduce en instrucciones nativas de la máquina, que son ejecutadas directamente por el hardware.

  • En una implementación interpretada, el programa original se traduce en otra cosa. Otro programa, llamado "el intérprete", examina "otra cosa" y realiza las acciones necesarias. Dependiendo del lenguaje y su implementación, hay una variedad de formas de "algo más". De más popular a menos popular, "algo más" podría ser

    • Instrucciones binarias para una máquina virtual, a menudo llamadas código de bytes , como se hace en Lua, Python, Ruby, Smalltalk y muchos otros sistemas (el enfoque fue popularizado en la década de 1970 por UCSD P-system y UCSD Pascal)

    • Una representación en forma de árbol del programa original, como un árbol de sintaxis abstracta, como se hace para muchos prototipos o intérpretes educativos.

    • Una representación tokenizada del programa fuente, similar a Tcl

    • Los personajes del programa fuente, como se hizo en MINT y TRAC

Una cosa que complica el problema es que es posible traducir (compilar) el código de bytes en instrucciones nativas de la máquina . Por lo tanto, una implementación intepretada exitosa podría eventualmente adquirir un compilador. Si el compilador se ejecuta dinámicamente, entre bastidores, a menudo se le llama compilador justo a tiempo o compilador JIT. Los JIT se han desarrollado para Java, JavaScript, Lua y, me atrevería a decir, muchos otros lenguajes. En ese punto, puede tener una implementación híbrida en la que se interpreta parte del código y se compila parte del código.

Norman Ramsey
fuente
7
Señor, tengo las siguientes preguntas 1. ¿En qué idioma está escrito "algo más"? 2. Y en el contexto de JavaScript, ¿ese "algo más" varía de un navegador a otro? 3. Diga, mi script se está ejecutando en Google Chrome e Internet Explorer, ¿se interpreta de la misma manera en ambos navegadores?
JavaHopper
@Norman, esa fue una explicación increíble. Sin embargo, he aquí un par de confusiones que todavía tengo. En una implementación compilada, el programa original se convierte en instrucciones nativas de la máquina. ¿Cómo? Pensé que C, por ejemplo, después de la compilación produciría código ensamblador, que de todos modos debe ser ensamblado por un ensamblador nativo en el código de máquina de la máquina subyacente. Entonces, ¿en qué se diferencia eso de una máquina virtual (python o JVM, etc.) que hace lo mismo en el caso de un lenguaje interpretado?
qre0ct
58

Java y JavaScript son un ejemplo bastante malo para demostrar esta diferencia , porque ambos son lenguajes interpretados . Java (interpretado) y C (o C ++) (compilado) podrían haber sido un mejor ejemplo.

¿Por qué el texto tachado? Como esta respuesta señala correctamente, interpretado / compilado se trata de una implementación concreta de un lenguaje, no del lenguaje per se . Si bien declaraciones como "C es un lenguaje compilado" son generalmente ciertas, no hay nada que impida que alguien escriba un intérprete de lenguaje C. De hecho, intérpretes para C existes .

Básicamente, el código compilado puede ser ejecutado directamente por la CPU de la computadora. Es decir, el código ejecutable se especifica en el idioma "nativo" de la CPU ( lenguaje ensamblador ).

Sin embargo, el código de los idiomas interpretados debe traducirse en tiempo de ejecución desde cualquier formato a las instrucciones de la máquina de la CPU. Esta traducción la realiza un intérprete.

Otra forma de decirlo es que los lenguajes interpretados son el código que se traduce a instrucciones de máquina paso a paso mientras se ejecuta el programa, mientras que los lenguajes compilados tienen el código traducido antes de la ejecución del programa.

stakx - ya no contribuye
fuente
8
¿Se interpreta Java? De wikipedia: "Las aplicaciones Java normalmente se compilan en bytecode (archivo de clase) que se puede ejecutar en cualquier máquina virtual Java (JVM) independientemente de la arquitectura de la computadora".
Personman
6
@Personman que todavía es técnicamente "interpretado" como la JVM está ejecutando el código, no el sistema operativo en sí. Es realmente una diferencia semántica, ya que se podría decir que la complejidad de los sistemas operativos modernos hace que la diferencia sea básicamente irrelevante para la mayoría de las situaciones. Estás hablando de la diferencia entre el sistema operativo que ejecuta la aplicación y el sistema operativo que ejecuta una aplicación que ejecuta el código.
GrayWizardx
5
Supongo que quiere decir que los archivos de clase son interpretados por la máquina virtual Java. Eso es algo razonable, pero la fuente de Java realmente está compilada en el código de bytes de Java VM. Puede construir una máquina Java física que no requiera que la máquina virtual la interprete en el código de máquina de otra arquitectura. Por tanto, parece más exacto decir que Java está compilado. Aún así, este es un buen ejemplo de la forma en que la distinción es confusa y algo arbitraria. Después de todo, C compilado es interpretado por la CPU, ¿verdad?
Personman
13
Java es un ejemplo bastante malo de un lenguaje compilado o interpretado porque es esencialmente ambos. Si tuviera que hacer una comparación, iría con C y Lisp para evitar confusiones.
Bill the Lizard
7
@stakx: en realidad, los códigos de bytes de Java normalmente también se compilan en código nativo mediante un compilador JIT. La única forma de obtener un comportamiento de intérprete puro es apagar explícitamente el compilador JIT cuando se lanza la JVM.
Stephen C
15

Aquí está la diferencia básica entre el lenguaje compilador e intérprete.

Lenguaje del compilador

  • Toma todo el programa como entrada única y lo convierte en código objeto que se almacena en el archivo.
  • Se genera el código de objeto intermedio
  • por ejemplo: C, C ++
  • Los programas compilados se ejecutan más rápido porque la compilación se realiza antes de la ejecución.
  • El requisito de memoria se debe más a la creación de código objeto.
  • Los errores se muestran después de compilar todo el programa
  • Código fuente --- Compilador --- Código máquina --- Salida

Idioma del intérprete:

  • Toma una sola instrucción como entrada única y ejecuta instrucciones.
  • NO se genera el código de objeto intermedio
  • por ejemplo: Perl, Python, Matlab
  • Los programas interpretados se ejecutan más lentamente porque la compilación y la ejecución se realizan simultáneamente.
  • El requisito de memoria es menor.
  • Se muestran errores para cada instrucción.
  • Código fuente --- Intérprete --- Salida
PGOEL
fuente
5

Un compilador, en general, lee el código informático de un lenguaje de nivel superior y lo convierte en código p o código máquina nativo. Un intérprete se ejecuta directamente desde p-code o un código interpretado como Basic o Lisp. Normalmente, el código compilado se ejecuta mucho más rápido, es más compacto y ya ha detectado todos los errores de sintaxis y muchos de los errores de referencia ilegales. El código interpretado solo encuentra tales errores después de que la aplicación intenta interpretar el código afectado. El código interpretado suele ser bueno para aplicaciones simples que solo se usarán una vez o como máximo un par de veces, o tal vez incluso para la creación de prototipos. El código compilado es mejor para aplicaciones serias. Un compilador primero toma el programa completo, busca errores, lo compila y luego lo ejecuta. Mientras que un intérprete hace esto línea por línea, por lo que toma una línea, verifica si hay errores

Si necesita más información, busque en Google la "diferencia entre compilador e intérprete".

Salil
fuente
3
Umm, no estoy seguro de dónde sacaste algo de esto más allá de las dos primeras declaraciones. Esto era técnicamente cierto hace varias generaciones con muchos lenguajes interpretados, pero dependiendo de la plataforma y la atención al detalle, es posible tener un código interpretado que funcione cerca o tan bien como el código compilado para ciertas actividades.
GrayWizardx
Teniendo en cuenta que lenguajes como Java, C # y JavaScript, que casi están inundando todo el mundo de la programación en la actualidad, sería injusto decir que "el código compilado es mejor para aplicaciones serias".
Sisir
2

Es una distinción muy turbia y, de hecho, generalmente no es una propiedad de un lenguaje en sí, sino del programa que está utilizando para ejecutar el código en ese lenguaje.

Sin embargo, la mayoría de los lenguajes se utilizan principalmente de una forma u otra, y sí, Java esencialmente siempre se compila, mientras que javascript esencialmente siempre se interpreta.

Compilar código fuente es ejecutar un programa en él que genera un archivo binario ejecutable que, cuando se ejecuta, tiene el comportamiento definido por la fuente. Por ejemplo, javac compila archivos .java de lectura humana en archivos .class legibles por máquina.

Para interpretar el código fuente se ejecuta un programa en él que produce el comportamiento definido de inmediato, sin generar un archivo intermediario. Por ejemplo, cuando su navegador web carga stackoverflow.com, interpreta un montón de JavaScript (que puede ver al ver el código fuente de la página) y produce muchos de los efectos agradables que tienen estas páginas, por ejemplo, upvoting o el pequeño notificador. barras en la parte superior.

Personman
fuente
Mientras que Java primero se traduce a código de bytes y solo mientras se ejecuta la JVM lo convierte a código de máquina; ¿Es correcto decir que se compila y no se interpreta?
Sisir
1
Supongo que se puede decir que el código de bytes de Java se interpreta, claro, pero nadie escribe el código de bytes de Java. El propio Java se suele compilar en código de bytes.
Personman
2

El lenguaje interpretado se ejecuta en tiempo de ejecución de acuerdo con las instrucciones como en el script de shell y el lenguaje compilado es uno que se compila (se cambia a lenguaje ensamblador, que la CPU puede entender) y luego se ejecuta como en c ++.

Praveen Kishor
fuente
0

Como han dicho otros, compilado e interpretado son específicos de una implementación de un lenguaje de programación; que son no inherentes al lenguaje. Por ejemplo, hay intérpretes de C.

Sin embargo, podemos (y en la práctica lo hacemos) clasificar los lenguajes de programación en función de su implementación más común (a veces canónica). Por ejemplo, decimos que C está compilado.

Primero, debemos definir sin ambigüedad los intérpretes y compiladores:

Un intérprete para el lenguaje X es un programa (o una máquina, o simplemente algún tipo de mecanismo en general) que ejecuta cualquier programa p escrito en el lenguaje X de manera que realice los efectos y evalúe los resultados según lo prescrito por la especificación de X .

Un compilador de X a Y es un programa (o una máquina, o simplemente algún tipo de mecanismo en general) que traduce cualquier programa p de algún lenguaje X a un programa p ' semánticamente equivalente en algún lenguaje Y de tal manera que interpretar p ' con un intérprete para y se obtendrán los mismos resultados y tienen los mismos efectos que la interpretación de p con un intérprete para X .

Tenga en cuenta que desde el punto de vista del programador, las CPU son intérpretes de máquina para sus respectivos lenguajes de máquina nativos.

Ahora, podemos hacer una clasificación tentativa de lenguajes de programación en 3 categorías dependiendo de su implementación más común:

  • Lenguajes de compilación rígida: cuando los programas se compilan completamente en lenguaje de máquina. El único intérprete utilizado es una CPU. Ejemplo: generalmente, para ejecutar un programa en C, el código fuente se compila en lenguaje de máquina, que luego es ejecutado por una CPU.
  • Idiomas interpretados: Cuando no hay compilación de ninguna parte del programa original a lenguaje máquina. En otras palabras, no se genera ningún código de máquina nuevo; sólo se ejecuta el código de máquina existente. También se debe usar un intérprete que no sea la CPU (generalmente un programa). Ejemplo: en la implementación canónica de Python, el código fuente se compila primero en el código de bytes de Python y luego ese código de bytes es ejecutado por CPython, un programa de interpretación para el código de bytes de Python .
  • Lenguajes compilados suaves: cuando se utiliza un intérprete distinto de la CPU, pero también se pueden compilar partes del programa original en lenguaje máquina. Este es el caso de Java, donde el código fuente se compila en bytecode primero y luego, el código de bytes puede ser interpretado por el intérprete de Java y / o compilado posteriormente por el compilador JIT.

A veces, los lenguajes compilados suaves y rígidos se denominan simplemente compilados, por lo que se dice que C #, Java, C, C ++ están compilados.

Dentro de esta categorización, JavaScript solía ser un lenguaje interpretado, pero eso fue hace muchos años. Hoy en día, está compilado con JIT en el lenguaje de máquina nativo en la mayoría de las principales implementaciones de JavaScript, por lo que diría que cae en lenguajes compilados suaves.

MrIo
fuente