Estaba leyendo acerca de los pros y los contras de lenguajes interpretados, y uno de los más comunes de los contras es la lentitud, pero ¿por qué son los programas en lenguajes interpretados lento?

  • Ver esta pregunta similar: stackoverflow.com/questions/1407603/…
  • Yo en realidad no está de acuerdo con la suposición general de que los lenguajes interpretados son lentos. ¿Qué hace que un lenguaje lento?
  • Un bucle ajustado en virtud de la interpretación en general será más lento que el compilado. Lo que no me impide para la construcción de un mal designd programa compilado que actúa por debajo de un programa interpretados a hacer lo mismo, ni garantiza que puedo escribir el código compilado casi tan rápido como yo puede escribir para el intérprete. Las desventajas están en todas partes.
  • Posibles duplicados de Pros Y los Contras De los Lenguajes Interpretados

15 Comentarios

  1. 58

    Los programas nativos se ejecuta mediante instrucciones por escrito para el procesador que corren.

    Lenguajes interpretados son sólo eso, «interpretado». Alguna otra forma de instrucción se lee y se interpreta, por un tiempo de ejecución, que a su vez ejecuta nativo de instrucciones de la máquina.

    Que piensa de esta manera. Si usted puede hablar en su idioma nativo a alguien, que generalmente trabajan más rápido que tener un intérprete de tener que traducir su idioma a otro idioma para el oyente a entender.

    Tenga en cuenta que lo que estoy describiendo es para cuando un idioma se está ejecutando en un intérprete. Hay intérpretes para muchos idiomas que no es nativo de la persona para la que construir nativo de instrucciones de la máquina. La reducción de la velocidad (sin embargo, el tamaño de la que podría ser) sólo se aplica a los interpretada contexto.

    Así, es un poco incorrecto decir que la idioma es lento, sino que es el contexto en el que se está ejecutando que es lento.

    C# no es un lenguaje interpretado, incluso a pesar de que emplea un lenguaje intermedio (IL), esto es JITted a los nativos de instrucciones antes de ser ejecutado, por lo que ha algunos de la misma reducción de la velocidad, pero no lo es todo, pero yo apostaría que si usted construye un cabal intérprete de C# o C++, se ejecutará más lento también.

    Y para que quede claro, cuando digo «lento», que es, por supuesto, un término relativo.

    • Gran analogía, nunca he pensado de esa manera.
    • Una nota adicional: las cosas no son tan malos como eran hace 10 años. En la actualidad, es posible construir muy interesante aplicaciones con código interpretado. Supongo que todo depende del tipo de aplicaciones que estamos construyendo…
    • Tenga en cuenta que usted tiene que tener cuidado con el etiquetado de un idioma como «interpretar» y, en consecuencia, «lento». Por ejemplo JavaScript siempre fue interpretado (y lento), pero en la reciente generación de JS motores cuando se ejecuta caro tareas de cálculo, que se compila a los nativos de instrucciones.
    • Oh, estoy de acuerdo, debería aclarar la respuesta.
  2. 18

    Todas las respuestas parecen pierda el verdadero punto importante aquí. Es el detalle de cómo se «interpreta» código se implementa.

    Interpretar lenguajes de script son más lentas debido a su método, el objeto y la variable global el espacio modelo es dinámico. En mi opinión esta es la verdadera definición de lenguaje de secuencia de comandos no el hecho de que es interpretado. Esto requiere muchos extras hash-búsquedas en una tabla en cada acceso a una variable o método de llamada. Y es la razón principal por la que todos ellos son terribles en el multithreading y el uso de un GIL (Bloqueo Global de Intérprete). Este búsquedas es donde la mayoría de su tiempo se gasta. Es una dolorosa de memoria aleatoria de búsqueda, lo que realmente duele cuando usted consigue un L1/L2 cache-miss.

    De Google Javascript Core8 es tan rápido y la orientación casi C la velocidad de una simple optimización: se toma el objeto del modelo de datos fijo y crear un código interno para acceder a ella como la estructura de datos de un nativo programa compilado. Cuando una nueva variable o método se agrega o quita a continuación, todo el código compilado se descarta y se compila de nuevo.

    La técnica está muy bien explicado en el Deutsch/Schiffman papel «la Aplicación Eficiente de la Smalltalk-80 Sistema».

    La pregunta de por qué php, python y ruby no están haciendo esto es bastante simple de responder: la técnica es extremadamente complicado de implementar.

    Y sólo Google tiene el dinero para pagar JavaScript debido a un rápido basado en el navegador intérprete de JavaScript es su necesidad fundamental de sus mil millones de dólares de modelo de negocio.

  3. 8

    Pensar en el interpeter como un emulador para una máquina que no tienen

    La respuesta corta es que los lenguajes compilados son ejecutados por las instrucciones de la máquina, mientras que la interpretan son ejecutadas por un programa escrito en un lenguaje compilado) que lee la fuente o de un código de bytes y, a continuación, básicamente emula una hipotética máquina que sería de ejecutar el programa directamente si la máquina existido.

    Pensar en la interpreta en tiempo de ejecución como un emulador para una máquina que no suceden realmente tener alrededor en el momento.

    Obviamente, esto es complicado por el JIT (Just In Time) compiladores de Java, C#, y otros tienen. En teoría, ellos son tan buenos como los «AOT» («A la Vez») compiladores, pero en la práctica, los idiomas que se ejecuta más lentamente y son impedidos por la necesidad de tener el compilador en torno al uso de memoria y tiempo en el programa en tiempo de ejecución. Pero si usted dice nada de eso aquí, ASÍ que esté preparado para atraer rabioso JIT defensores de los que insisten en que no hay ninguna diferencia teórica entre JIT y AOT. Si se les pregunta si Java y C# son tan rápidos como C y C++, a continuación, empezar a hacer excusas y tipo de calmarse un poco. 🙂

    Así, C++ totalmente las reglas en los juegos donde la cantidad máxima de computación siempre se puede poner a utilizar.

    Sobre el escritorio y web, la información orientada a las tareas se hacen a menudo por los idiomas con más de abstracción o al menos, menos de compilación, porque los equipos son muy rápidas y los problemas no son computacionalmente intensivo, por lo que nos puede pasar algún tiempo en metas como el tiempo-a-mercado, la productividad de los programadores, confiable memoria de entornos seguros, la dinámica de la modularidad, y otras herramientas de gran alcance.

  4. 7

    Esta es una buena pregunta, pero debe ser formulado un poco diferente, en mi opinión, por ejemplo: «¿por Qué son lenguajes interpretados más lento que el de los lenguajes compilados?»

    Creo que es un error común pensar que los lenguajes interpretados son más lentos de por sí. Lenguajes interpretados son no lento, pero, dependiendo del caso de uso, podría ser más lento de la versión compilada. En la mayoría de los casos de lenguajes interpretados son en realidad lo suficientemente rápido!

    «Suficientemente rápido», y en el aumento de la productividad del uso de un lenguaje como Python, por ejemplo, en C debe ser justificación suficiente para considerar la posibilidad de un lenguaje interpretado. Además, siempre se puede sustituir ciertas partes de su programa interpretados con una rápida implementación en C, si usted realmente necesidad de la velocidad. Pero, de nuevo, mida primero y determinar si la velocidad es realmente el problema, a continuación, optimizar.

    • +1 para evitar la prematura optimización! Buena respuesta!
  5. 4

    Además de las otras respuestas no hay optimización: cuando se compila un programa, que no suelen cuidado ¿cuánto tiempo se necesita para compilar el compilador tiene un montón de tiempo para optimizar el código. Cuando estás interpretar el código, tiene que hacerse muy rápido, por lo que algunos de los más inteligentes optimizaciones podría no ser capaz de ser realizado.

  6. 4

    Bucle de 100 veces, el contenido del bucle se interpretan de 100 veces en el código de bajo nivel.

    No se almacenan en caché, no se reutiliza, no optimizada.

    En términos simples, un compilador interpreta una vez en el código de bajo nivel

    Edición, después de los comentarios:

    • JIT es compilado código, no se interpreta. Es sólo compila más tarde, no en la frente
    • Me refiero a la definición clásica, no modernas implementaciones prácticas
    • ¿Tienes una buena fuente para esto? Me parece cotización difícil de creer…
    • Por supuesto: en.wikipedia.org/wiki/…
    • Esa es la descripción de una muy cojo de la implementación de un lenguaje interpretado. No me cabe duda de que los intérpretes hicieron hacer esto en el pasado, pero hoy en día el único que me esperaría ser atrapado análisis por siempre y para siempre sería cmd.exe
    • Es cierto, aunque la respuesta fue redactada bastante mal (sin ánimo de ofender gbn). Creo que quiso decir que el código de bytes para que el bucle se interpreta 100 veces, en lugar de que simplemente se ejecuta 100 veces. Este no es un problema para JIT-capaz de máquinas virtuales, sin embargo, debido a que compile el bucle hacia abajo para código nativo, lo que sería tan rápido como en un programa compilado.
    • Tan pronto como se introduce un JIT en la mezcla, no creo que se le puede llamar un lenguaje interpretado, al menos no un puramente interpreta uno.
    • Interpretación de por sí hace esto. Por supuesto, una vez que el trabajo de usted sería inmediatamente empezar a pensar en hacer algo más inteligente, que todos los grandes de «scripting» lenguajes. Muchos son bytecode compila en tiempo de ejecución, algunos utilizan los compiladores JIT, etc. etc. etc.
    • Yo creo que mientras Tony es técnicamente correcta, por su definición, no son en la práctica muy pocos lenguajes interpretados en el mayor uso de la producción. Esta respuesta puede ser correcta, pero se trata de la semántica.
    • Hay muy pocos casos en que una tradicional intérprete iba a interpretar algo «en» el código de bajo nivel. En su lugar, después de ver a «A=42» tendría en cuenta la declaración comenzó con un nombre de variable, buscar esa variable, observe lo siguiente fue un igual, y la llamada «evaluación de la expresión». Esa rutina se daría cuenta de lo siguiente fue un dígito, munch dígitos hasta la siguiente no-dígito a la vez que acumula el valor (así como para calcular 42), luego de la tienda que a la variable cuya dirección fue calculada anteriormente.
    • Los únicos casos donde la tradicional intérpretes sería «generar código de bajo nivel», sería hacer las cosas como OUT portnum,value en un procesador 8080 cuya out instrucción requiere de una constante dirección. Un intérprete de BASIC sería la tienda de «FUERA» de la instrucción seguida por un RET en un par de bytes mantenido a la mano para ese propósito y, a continuación, llamar a esa rutina.

  7. 2

    Una simple pregunta, sin respuesta simple. La línea de fondo es que todos los equipos realmente «entender» es instrucciones binarias, que es lo «rápido», » lenguajes de programación como C se compilan en.

    Luego están las máquinas virtuales, que comprenden las diferentes instrucciones binarias (como Java y .NET) pero los que han de ser traducidos en la marcha a las instrucciones de la máquina por un Solo-En-Compilador (JIT). Que es casi tan rápido (más rápido incluso en algunos casos específicos, debido a que el JIT tiene más información que la que una estática compilador sobre cómo el código está siendo utilizado).

    Entonces hay lenguajes interpretados, que por lo general también tienen sus propios intermedio instrucciones binarias, pero el intérprete funciona como un bucle con una gran instrucción switch con un caso por cada instrucción, y cómo ejecutarlo. Este nivel de abstracción sobre el subyacente código máquina es lenta. Hay más instrucciones, las cadenas largas de las llamadas de función en el intérprete para hacer incluso las cosas más sencillas, y se puede argumentar que la memoria caché y no se utilizan tan efectivamente como resultado.

    Pero de lenguajes interpretados son a menudo lo suficientemente rápido como para los fines para los que están acostumbrados. Las aplicaciones Web son invariablemente vinculado por IO (generalmente de acceso a bases de datos) que es de un orden de magnitud más lento que cualquier intérprete.

    • .NET es un framework, no una máquina virtual. Una VM lenguaje fácil de comprender normalmente (pero no siempre), se aísla el código desde el hardware y el sistema operativo, y proporciona un resumen «código de máquina» que fuente es compilado para que la VM luego, en tiempo de ejecución, se traduce en instrucciones compatible con el sistema operativo de destino o de hardware.
  8. 1

    No hay tal cosa como un lenguaje interpretado. Cualquier idioma puede ser realizada por un intérprete o compilador. En estos días la mayoría de los idiomas tienen las implementaciones mediante un compilador.

    Que dijo, los intérpretes son generalmente más lento, debido a que necesitan procesar el idioma o algo más cerca en tiempo de ejecución y la traducen a las instrucciones de la máquina. Un compilador realiza esta traducción de las instrucciones de la máquina sólo una vez, después de que se ejecuta directamente.

  9. 0

    De about.com:

    Un lenguaje Interpretado es procesado
    en tiempo de ejecución. Cada línea es leer,
    analizado y ejecutado. Tener que
    volver a procesar una línea cada vez en un bucle
    es lo que hace de lenguajes interpretados de manera
    lento. Esta sobrecarga significa que
    interpreta el código se ejecuta entre 5 – 10
    veces más lento que el código compilado. El
    lenguajes interpretados como Basic o
    JavaScript son los más lentos. Su
    la ventaja es que no necesita ser
    vuelve a compilar después de los cambios y que es
    muy útil cuando estás aprendiendo a programar.

    El 5-10 veces más lento no es necesariamente verdad para lenguajes como Java y C#, sin embargo. Ellos son interpretados, pero la just-in-time compiladores puede generar instrucciones en lenguaje máquina para algunas operaciones, acelerando las cosas de manera espectacular (cerca de la velocidad de un lenguaje compilado, a veces).

    • Eso no es del todo correcta. C# y Java son compilado, pero compilado a la IL, no nativo de instrucciones. Decir que son interpretados implica que la fuente es analizado en tiempo de ejecución, que no es el caso con C# (aunque no estoy seguro acerca de Java – no familiarizada con él).
    • Eso es cierto, la fuente no es analizado en tiempo de ejecución, el bytecode compilado instrucciones. Estaba pensando que la compilación JIT (que la mayoría de Java Vm uso ahora) cuenta como otra forma de interpretación, pero supongo que no lo hace. Java PUEDE ser interpretado si la máquina virtual está usando hace eso, y algunos de ellos lo hacen, pero la mayoría no por obvias razones de rendimiento.
  10. 0

    Lenguajes interpretados necesidad de leer y de interpretar el código fuente en tiempo de ejecución. Con el código compilado un montón de que la interpretación se hace antes de tiempo (en tiempo de compilación).

  11. 0

    Muy pocos contemporáneo lenguajes de secuencias de comandos son «interpretado» en estos días; están típicamente compiladas sobre la marcha, ya sea en código máquina o en algunos intermedio de código de bytes de lenguaje, que es (más eficiente) que se ejecuta en una máquina virtual.

    Habiendo dicho eso, más lento, ya que el cpu es la ejecución de muchas más instrucciones por «línea de código», ya que muchas de las instrucciones que se gastan la comprensión del código, en lugar de hacer lo que la semántica de la línea sugieren!

  12. 0

    Leer este Pros Y Contras De Lenguajes Interpretados

    Esta es la idea en ese puesto a su problema.

    Una ejecución por los servicios de un intérprete
    generalmente mucho menos eficiente que
    regular la ejecución del programa. Sucede
    porque cada instrucción
    debe pasar una interpretación en
    tiempo de ejecución o como en las nuevas
    las implementaciones, el código tiene que ser
    se compila a un intermedio
    la representación antes de cada ejecución.

    • Por CIERTO, ¿te diste cuenta de que la cuestión que enlaza con el mismo cartel…Nathan muestra todos los signos de no ser graves.
    • 🙂 lo siento, yo no veo que hasta que usted dijo. gracias
  13. 0

    Por la misma razón que es más lento para hablar a través de traductor de en el idioma nativo. O, leer con el diccionario. Se necesita tiempo para traducir.

    Actualización: no, no veo que mi respuesta es la misma que la aceptación de uno, a un grado 😉

  14. 0

    Sí, lenguajes interpretados son lentos…

    Sin embargo, considere lo siguiente. Tuve un problema a resolver. Me tomó 4 minutos para resolver el problema en Python, y el programa se llevó a 0.15 segundos. Luego he tratado de escribir en C, y tengo un tiempo de ejecución de 0,12 segundos, y me tomó 1 hora de escribir. Todo esto debido a la manera práctica de resolver el problema en cuestión fue el uso de tablas hash, y el hashtable dominado el tiempo de ejecución de todos modos.

  15. 0

    Wikipedia dice,

    La interpretación de código es más lento que el que ejecuta el código compilado porque el intérprete debe analizar cada instrucción en el programa cada vez que se ejecuta y, a continuación, realizar la acción deseada, mientras que el código compilado sólo realiza la acción dentro de un plazo de un contexto determinado por la compilación. Este análisis de tiempo de ejecución que se conoce como «interpretativo sobre la cabeza». Acceso a las variables es también más lento en un intérprete debido a que la asignación de identificadores a los lugares de almacenamiento se debe hacer varias veces en tiempo de ejecución en lugar de en tiempo de compilación.

    Consulte este IBM doc,

    Interpretado programa debe ser traducido cada vez que se ejecuta, hay una mayor sobrecarga. Por lo tanto, un lenguaje interpretado en general es más adecuado ad hoc de las solicitudes de peticiones predefinidas.

    En Java aunque es considerada como un lenguaje interpretado, usa JIT (Just-in-Time) compilación y mitigar el problema anterior mediante el uso de una técnica de almacenamiento en caché para almacenar en caché el compilado a código de bytes.

    El compilador JIT lee el bytecode en muchas de las secciones (o en su totalidad, rara vez) y compila dinámicamente en código máquina para que el programa se ejecute más rápido. Esto se puede hacer por archivo, por función o incluso en cualquier fragmento de código; el código puede ser compilado cuando está a punto de ser ejecutado (de ahí el nombre de «just-in-time») y, a continuación, almacena en caché y se reutiliza más tarde, sin necesidad de volver a compilar.

Dejar respuesta

Please enter your comment!
Please enter your name here