En primer lugar, un lenguaje de programación puede ser tanto interpretado como compilado. La interpretación y la compilación son solo métodos para generar código ejecutable a partir del código fuente. Con un intérprete, el código fuente está siendo leído e interpretado por un intérprete que luego ejecuta el código tal como lo interpreta. Por otro lado, un compilador lee el código fuente y genera un archivo binario ejecutable a partir del código fuente, de modo que el programa se puede ejecutar como un proceso separado de forma independiente.
Ahora, antes de que nadie se pregunte ... Sí, C / C ++ / C # / Java se puede interpretar, y sí, se pueden compilar los scripts JavaScript y Bash. Sin embargo, si hay intérpretes o compiladores en funcionamiento para estos idiomas es otra cuestión.
Ahora para responder realmente la pregunta cuando usaremos "lenguaje interpretado" sobre "lenguaje compilado". La pregunta en sí es algo confusa, pero supongo que significa cuándo preferir la interpretación sobre la compilación. Una de las desventajas de la compilación es que genera algo de sobrecarga debido al proceso de compilación: el código fuente debe compilarse en código máquina ejecutable, por lo que no es adecuado para tareas que requieren un retraso mínimo al invocar el código fuente para ejecutar un programa. Por otro lado, el código fuente compilado es casi siempre más rápido que el código fuente interpretado equivalente debido a la sobrecarga causada por la interpretación del código. Por otro lado, los intérpretes pueden invocar y ejecutar el código fuente. con muy poca sobrecarga de invocación, pero a expensas del rendimiento en tiempo de ejecución.
Al final, es casi imposible mencionar cualquier caso de uso definitivo sobre cuándo preferir uno tras otro, pero por ejemplo, uno (para mi comprensión muy poco realista) sería cuando el código fuente del programa cambia dinámicamente entre invocaciones del programa y la sobrecarga de compilación también lo es. alto para que sea una opción viable. En ese caso, probablemente sería deseable interpretar el código fuente en lugar de compilar.
Sin embargo, hay algo que puede considerarse un ejemplo del mundo real: ocultar el código fuente durante el despliegue. Con nativamentecódigo compilado, el desarrollador implementa el código ejecutable macine del programa y los datos. Con el código interpretado, se debe implementar el código fuente en sí mismo, que luego se puede inspeccionar y realizar ingeniería inversa con mucho menos esfuerzo que lo que es hacer ingeniería inversa del código de máquina nativo. Una excepción a esto son los lenguajes como C # y Java, que se compilan en lenguaje / bytecode inmediato (MSIL para C # y Java bytecode para Java) que luego se implementa y compila "justo a tiempo" en tiempo de ejecución, algo así como lo hace un intérprete. Sin embargo, existen los llamados descompiladores para MSIL y Java Bytecode que pueden reconstruir el código fuente original con una precisión relativamente buena y, como tal, la ingeniería inversa de dichos productos es mucho más trivial que los productos de ingeniería inversa que se implementan en el código de máquina nativo.