2009-04-17 23 views
13

Lo que hace que sea difícil acelerar los lenguajes tipados dinámicamente en comparación con los idiomas tipados estáticamente. En otras palabras, ¿cuál es la propiedad inherente de los lenguajes estáticos que facilitan la optimización de la velocidad de ejecución?¿Por qué los lenguajes tipados dinámicamente son lentos?

Respuesta

20

Al acceder a atributos/métodos en lenguajes tipados estáticamente, las búsquedas se pueden reducir a una dirección de función estática. Incluso en el caso de los métodos virtuales, que son más lentos, la búsqueda solo está leyendo un desplazamiento desde un vtable.

En los idiomas dinámicos, los nombres se basan en cadenas. ¿Quieres consultar foo.bar? Busque foo en la tabla hash de variables locales, luego busque bar en la tabla hash de foo. En algunos lenguajes dinámicos, como Python y Ruby, puede haber búsquedas/llamadas de métodos adicionales para implementar atributos generados dinámicamente.

Todas estas búsquedas son muy difíciles de hacer rápidamente. Python tiene una de las implementaciones de tabla hash más ajustadas del mundo, y JavaScript ha invertido millones de dólares en investigación para hacerlo rápido. Estas tácticas funcionan, compare el JavaScript de Chrome con IE 5 para ver cuánto, pero son mucho, mucho más difíciles que generar llamadas de funciones estáticamente.


Debo mencionar que la "dinámica" de un idioma puede variar. Python tiene varias formas diferentes de interactuar con búsquedas variables, lo cual es bueno en algunas circunstancias, pero hace que la optimización sea muy difícil. Otros lenguajes dinámicos, como Common Lisp y Smalltalk, pueden competir de manera uniforme con los lenguajes estáticos en muchos casos de uso porque las búsquedas/modificaciones dinámicas son más controladas.

+0

Es posible especificar tipos estáticamente en Common Lisp, cuando sienta la necesidad. Una implementación desarrollada para la velocidad puede producir código muy rápido. –

0

Esto se debe a que los lenguajes tipados estáticos a menudo se compilan en código máquina mientras que los lenguajes con tipado dinámico en la mayoría de los casos son ejecutados por un intérprete.

+1

Parece ser demasiado simplista. No todos los idiomas tipificados de forma estática se compilan en código máquina, incluido cualquier CLR estático o lenguaje JVM. No todos los idiomas escritos dinámicamente se interpretan, por ejemplo, muchos Lisps se pueden compilar en bytecode, y también hay muchos compiladores para Python y PHP. – Juliet

+0

Common Lisp se puede compilar en código de máquina. –

+0

La mayoría de las buenas implementaciones de Common Lisp se compilan en código máquina. Algunos no tienen un intérprete, solo hacen compilación de JIT. –

10

Ciertos tipos de optimizaciones de tiempo de compilación solo se pueden realizar si se conoce el tipo exacto de una variable.

Los lenguajes de tipado dinámico también suelen tener lógica agregada para determinar el tipo y garantizar que el valor sea el correcto para el tipo.

10

vistazo a este ejemplo de pitón:

def fact(n): 
    if n==0: 
     return n 
    return n*fact(n-1) 

Qué es n? ¿Es un número? ¿Es una cadena? ¿Es una clase que definiste antes? No hay forma de que el compilador sepa qué entrada obtendrá. Debe realizar muchas comprobaciones en tiempo de ejecución, lo que significa que está realizando un trabajo más implícito para operaciones simples.

+2

En realidad, algunos languagse, como Ocaml, F # y Haskell admiten inferencia de tipo (http://en.wikipedia.org/wiki/Type_inference), por lo que el compilador puede determinar el tipo de datos de una variable en función de su uso sin anotaciones de tipo . Por ejemplo, 'n == 0', una prueba de igualdad para un literal entero indica que 'n' es un número entero. Como el compilador sabe que 'n' es un número entero, entonces 'return n' implica que la función también devuelve un número entero. Entonces, podemos determinar que la función toma un int y devuelve un int. – Juliet

+2

@Princess: Ah, pero ¿es un int del tamaño de una máquina o un bignum? Todavía tiene que probar esto (pero se puede hacer de manera eficiente) – simon

+0

Todavía piensa demasiado estático: ¿qué hay de la recompilación dinámica y la especificación (lea los self papers). En realidad, al tener información de tipo real, un compilador dinámico podría incluso producir código más rápido que un compilador estático, ya que incluso puede conocer los rangos de valores, etc. Probablemente se trate de cuánto dinero se invierte en el esfuerzo de hacer que el lenguaje rápido ... – blabla999

4

Los lenguajes de tipeo dinámico deben hacer todas las comprobaciones en el tiempo de ejecución porque el tipo puede cambiar durante el curso de la ejecución.

Los idiomas tipados estáticos resuelven todos los tipos durante el tiempo de compilación, por lo que el costo se consume por adelantado, una vez.

Esta es la razón principal por la cual los lenguajes dinámicos son típicamente más lentos. Pero hay otras cosas en que pensar. Mucho depende del compilador o intérprete, la implementación del GC, el diseño de la tabla de envío y los algoritmos de búsqueda junto con otras optimizaciones.

Todo depende de la implementación: un lenguaje de tipeo dinámico puede ser más rápido que un lenguaje compilado, solo se necesita más trabajo para lograrlo.

+0

Puede haber lenguajes dinámicos compilados ;-) – Ponkadoodle

+0

Quiere decir que una implementación muy buena de un lenguaje de tipado dinámico podría ser más rápida que una implementación muy pobre de un lenguaje estáticamente tipado. – niagr

1

Su pregunta está un poco desactualizada ya que los lenguajes con tipado dinámico en realidad no son lentos. Muchos ejemplos pueden ser en la práctica, pero otros son rápidos (donde rápido significa "razonablemente comparable a c" o algo así, cf el ceceo común).

Muchos lenguajes dinámicos se ejecutan en una VM o incluso se interpretan, lo que puede estar causando ralentizaciones que se pueden evitar. En cierto nivel, hay optimizaciones que están disponibles para los compiladores de lenguaje estático (o dinámicos que han hecho las promesas correctas de no ser dinámicas sobre algo) que no son posibles en una situación totalmente dinámica.

Sin embargo, si estás pensando en las diferencias entre decir, python y C++ solo por ejemplo, no es el dinámico vs. el estático lo que realmente es el problema.

+0

También puede ser bueno tener en cuenta que, por ejemplo, algunos de los traductores más recientes de bytecode de Javascript suelen funcionar tan rápido como C++. – eyelidlessness

Cuestiones relacionadas