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
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.
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.
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
Common Lisp se puede compilar en código de máquina. –
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. –
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.
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.
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
@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
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
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.
Puede haber lenguajes dinámicos compilados ;-) – Ponkadoodle
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
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.
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
- 1. Por qué los puntos son lentos
- 2. ¿Por qué los iframes son tan lentos?
- 3. ¿Qué lenguajes tipados estáticamente son similares a Python?
- 4. ¿Por qué mis rieles son tan lentos?
- 5. ¿Por qué los trabajos de Powershell son tan lentos?
- 6. ¿Por qué los vectores en caja son tan lentos?
- 7. ¿Por qué los arrays de arrays (vectores) son tan lentos?
- 8. Por qué los subprocesos POSIX son más lentos que OpenMP
- 9. pykka - ¿Los actores son lentos?
- 10. ¿Por qué los lenguajes JIT-ed son aún más lentos y menos eficientes en la memoria que C/C++ nativo?
- 11. Lenguajes del lado del cliente fuertemente tipados?
- 12. ¿Por qué PropertyInfo SetValue y GetValue son tan lentos?
- 13. ¿Por qué Seq.iter y Seq.map son mucho más lentos?
- 14. ¿Son los cromos "appendChild" realmente tan lentos?
- 15. ¿Prolog es un lenguaje sin tipo? ¿Cuál es la diferencia entre Prolog y los lenguajes tipados dinámicamente?
- 16. ¿Qué algoritmos son difíciles de implementar en los lenguajes funcionales?
- 17. Apache Derby INSERTOS son lentos
- 18. ¿Por qué los lenguajes funcionales son una bendición para los entornos de múltiples hilos?
- 19. ¿Por qué la mayoría de los lenguajes de S-Expression se tipan dinámicamente?
- 20. ocultar/mostrar son * muy * lentos
- 21. ¿Son los spinlocks de Linux/SMP innecesariamente lentos?
- 22. ¿Por qué algunos lenguajes de programación son más rápidos que otros?
- 23. Los cálculos de autovalores de Python son mucho más lentos que los de MATLAB en mi computadora. ¿Por qué?
- 24. ¿Por qué los índices GiST de Text-Search de PostgreSQL son mucho más lentos que los índices GIN?
- 25. ¿Cómo/por qué los lenguajes funcionales (específicamente Erlang) escalan bien?
- 26. ¿Por qué los lenguajes perezosos no admiten la mutación?
- 27. ¿Por qué mis sitios de desarrollo local MAMP PRO son lentos en Firefox y Chrome?
- 28. Por qué transiciones para algunas propiedades CSS son lentos y ninguno fluidez
- 29. ¿Por qué son list(), dict() y tuple() más lentos que [], {} y()?
- 30. ¿Por qué rubygame y gosu son más lentos que opengl puros?
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. –