No hay (que yo sepa) tal cosa como un "idioma" interpretado o un "idioma" compilado.
Los idiomas especifican la sintaxis y el significado de las palabras clave del código, las construcciones de flujo y varias otras cosas, pero no conozco ningún idioma que especifique si debe compilarse o interpretarse en la especificación del idioma.
Ahora, si su pregunta es cuando utiliza un compilador de idiomas frente a un intérprete de idiomas, realmente se trata de los pros / contras del compilador frente al intérprete y el propósito del proyecto.
Por ejemplo, puede usar el compilador JRuby para una integración más fácil con las bibliotecas java en lugar del intérprete ruby MRI. Probablemente también haya razones para usar el intérprete de rubí MRI sobre JRuby, aunque no estoy familiarizado con el idioma y no puedo hablar de esto.
Beneficios promocionados de los intérpretes:
- Sin compilación significa que el tiempo desde la edición del código hasta la prueba de la aplicación se puede disminuir
- No es necesario generar binarios para múltiples arquitecturas porque el intérprete administrará la abstracción de la arquitectura (aunque es posible que deba preocuparse por los scripts que manejan los tamaños enteros correctamente, pero no por la distribución binaria)
Beneficios promocionados de los compiladores:
- El código nativo compilado no tiene la sobrecarga de un intérprete y, por lo tanto, suele ser más eficiente en tiempo y espacio
- La interoperabilidad suele ser mejor, la única forma de interoperación en proceso con scripts es a través de un intérprete en lugar de un FFI estándar
- Capacidad para admitir arquitecturas para las que el intérprete no se ha compilado (como los sistemas integrados)
Sin embargo, apostaría en el 90% de los casos a que es más o menos así: quiero escribir este software en blub porque lo conozco bien y debería hacer un buen trabajo. Usaré el intérprete (o compilador) de blub porque es el método canónico generalmente aceptado para escribir software en blub.
Entonces, TL; DR es básicamente una comparación caso por caso de los intérpretes frente a los compiladores para su caso de uso particular.
Además, FFI: Interfaz de función externa, en otras palabras, interfaz para interoperar con otros idiomas. Más lecturas en wikipedia
Un punto importante aquí es que muchas implementaciones de lenguaje realmente hacen algún tipo de híbrido de ambos. Muchos lenguajes de uso común en la actualidad funcionan compilando un programa en un formato intermedio, como bytecode, y luego ejecutándolo en un intérprete. Así es como se implementan Java, C #, Python, Ruby y Lua. De hecho, esta es posiblemente la forma en que se implementa la mayoría del lenguaje en uso hoy en día. Entonces, el hecho es que el lenguaje actual interpreta y compila su código. Algunos de estos idiomas tienen un compilador JIT adicional para convertir el bytecode a código nativo para su ejecución.
En mi opinión, deberíamos dejar de hablar de lenguajes interpretados y compilados porque ya no son categorías útiles para distinguir las complejidades de las implementaciones de lenguaje actuales.
Cuando pregunta sobre los méritos de los idiomas interpretados y compilados, probablemente quiere decir algo más. Tal vez se esté preguntando sobre el mérito de la tipificación estática / dinámica, los méritos de distribuir ejecutables nativos, las ventajas relativas de la compilación JIT y AOT. Todos estos son problemas que se combinan con la interpretación / compilación pero son problemas diferentes.
fuente
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.
fuente
Puedo pensar en los siguientes escenarios cuando usarías un lenguaje interpretado :
Puedo pensar en los siguientes escenarios cuando quieres compilar tu código:
fuente
Al final, la gran compensación es entre la productividad (cuántas líneas de código tiene que escribir) y el rendimiento (qué tan rápido se ejecutará su programa).
Debido a que los lenguajes interpretados cuando se transforman en información de CPU tienen más información, pueden confiar en la reflexión y la escritura dinámica, lo que aumenta considerablemente la productividad . Otra ventaja de los lenguajes interpretados es que son independientes de la plataforma siempre que haya un intérprete para la plataforma.
Debido a que la CPU no debe transformar el código de idioma en código de máquina y ejecutar el código al mismo tiempo, como en el caso interpretado, los idiomas compilados producen programas más rápidos. Además, un sistema construido en un lenguaje compilado es más seguro ya que puede detectar problemas en el momento de la compilación, lo que básicamente significa que ve un error al escribirlo (con IDEs modernos) en lugar de verlo solo cuando realmente ejecuta el programa (por supuesto , esto no corrige errores lógicos).
Sabiendo esto, los idiomas interpretados son adecuados para:
Y los idiomas compilados son adecuados cuando:
fuente
Además de las razones que los otros han mencionado, hay un caso de uso particularmente importante para elegir una interpretación ad hoc sobre cualquier forma de compilación o cualquier enfoque híbrido.
En caso de que se use un lenguaje de programación como protocolo de comunicación , y cuando la latencia de la respuesta sea importante, tiene más sentido evitar perder el tiempo en la compilación y cualquier posible preprocesamiento.
Esto se aplica a los idiomas del agente, por ejemplo, o la forma en que, por ejemplo, se usa normalmente Tcl / Tk.
Otra posible razón para apegarse a la interpretación es cuando se utiliza un intérprete de lenguaje para bootstrapping en sí mismo o un lenguaje más elaborado y de nivel superior, y su simplicidad es más importante que el rendimiento del proceso de bootstrap.
Para casi cualquier otro caso de uso posible, la compilación (o un enfoque híbrido) es una mejor opción.
fuente