2011-02-06 14 views
31

¿Qué califica a un lenguaje de programación para llamarse lenguaje dinámico? ¿Qué tipo de problemas debo usar para resolver un lenguaje de programación dinámico? ¿Cuál es la principal diferencia entre los lenguajes de programación estáticos y los lenguajes de programación dinámicos?¿Qué califica un lenguaje de programación como dinámico?

+5

(1) Dynamic Language! = Programación dinámica. (2) Wikipedia o varias preguntas aquí. – delnan

+2

Esta pregunta no tiene nada que ver con la Programación Dinámica en absoluto. –

+1

* @ Huzaifa *, actualicé el título de su pregunta; como dicen los comentarios anteriores, _ "programación dinámica" _ tiene un significado bastante diferente de _ "programación con un lenguaje de programación dinámico" _. – stakx

Respuesta

22

No creo que haya blanco y negro aquí - hay un espectro completo entre dinámico y estático.

Tomemos dos ejemplos extremos para cada lado del espectro, y veamos a dónde nos lleva eso.

Haskell es un extremo en la dirección estática.

  • Tiene un potente sistema de tipo que se comprueba en tiempo de compilación: si su programa se compila, está libre de errores comunes y no tan comunes.
  • El formulario compilado es muy diferente del programa haskell (es un archivo binario). En consecuencia, la reflexión y modificación del tiempo de ejecución es difícil, a menos que lo haya previsto. En comparación con la interpretación del original, el resultado es potencialmente más eficiente, ya que el compilador es libre de realizar optimizaciones funky.

Así que para las lenguas estáticas Pienso generalmente: análisis en tiempo de compilación bastante largo necesario, sistema de tipos me impedirá cometer errores tontos, sino también de hacer algunas cosas que son realmente válida, y si quiero hacer ningún tipo de manipulación de un programa en tiempo de ejecución, va a ser un poco molesto porque la representación de tiempo de ejecución de un programa (es decir, su forma compilada) es diferente del lenguaje real en sí. También podría ser una molestia modificar las cosas más adelante si no lo hubiera previsto.

Clojure es un extremo en la dirección dinámica.

  • También tiene un sistema de tipo, pero en tiempo de compilación no hay verificación de tipos. Muchos errores comunes solo pueden descubrirse ejecutando el programa.
  • Los programas Clojure son esencialmente solo listas de Clojure (la estructura de datos) y se pueden manipular como tales. Por lo tanto, al realizar la reflexión en tiempo de ejecución, en realidad está procesando un programa Clojure más o menos como lo haría, el formulario de tiempo de ejecución está muy cerca del lenguaje de programación en sí. Así que básicamente puedes hacer las mismas cosas en el tiempo de ejecución que podrías al "tiempo de escribir". En consecuencia, el rendimiento del tiempo de ejecución puede verse afectado porque el compilador no puede realizar muchas optimizaciones iniciales.

Para lenguajes dinámicos por lo general pienso: paso breve recopilación (sintaxis, básicamente, sólo de lectura), de manera rápida y desarrollo incremental, prácticamente no hay límites para lo que permitirá que lo haga, pero no me va a impedir errores tontos .

Como han indicado otras publicaciones, otros lenguajes tratan de tomar más de una posición intermedia - p. los lenguajes estáticos como F # y C# ofrecen capacidades de reflexión a través de una API separada, y por supuesto pueden ofrecer un desarrollo incremental mediante el uso de herramientas inteligentes como REPL de F #. Los lenguajes dinámicos a veces ofrecen tipeo opcional (como Racket, Strongtalk) y, en general, parece tener marcos de prueba más avanzados para compensar la falta de comprobación de cordura en tiempo de compilación. Además, las sugerencias de tipo, aunque no se comprueban en tiempo de compilación, son sugerencias útiles para generar un código más eficiente (por ejemplo, Clojure).

Si busca la herramienta adecuada para un problema determinado, esta es sin duda una de las dimensiones que puede considerar, pero por sí sola no es probable que forzar una decisión en ambos sentidos. Piensa en las otras propiedades de los idiomas que estás considerando: ¿es un lenguaje funcional u OO o lógico o ...? ¿Tiene un buen marco para las cosas que necesito? ¿Necesito estabilidad y compatibilidad retroactiva binaria, o puedo vivir con un poco de batche en el compilador? ¿Necesito herramientas extensas? Etc.

+0

"el resultado es más eficiente". Haskell es muchas cosas, pero eficiente no es una de ellas. Ambos tiempos de compilación y ejecución son generalmente los peores de cualquier idioma. Haskell incluso ha sido derrotado por Python en los puntos de referencia. http://flyingfrogblog.blogspot.com/2009/04/f-vs-ocaml-vs-haskell-hash-table.html –

+0

"no es necesario un paso de compilación". La compilación nunca es necesaria. –

+0

"Así que al hacer la reflexión en tiempo de ejecución, en realidad está procesando un programa Clojure más o menos como lo escribiría: la forma de ejecución está muy cerca del lenguaje de programación en sí". ¿No se refiere solo a las citas, una función que también se encuentra en los idiomas bastante estáticos (por ejemplo, OCaml). –

4

Hay un montón de definiciones diferentes en uso, pero una posible diferencia es:

  • Un lenguaje dinámico normalmente utiliza dinámica escribir.
  • A estático idioma normalmente utiliza estático escribiendo.

Algunos idiomas son difíciles de clasificar como estáticos o dinámicos. Por ejemplo, C# se considera tradicionalmente como un lenguaje estáticamente tipado, pero C# 4.0 introdujo un tipo estático llamado dynamic que se comporta de alguna manera más como un tipo dinámico que un tipo estático.

+0

en su ejemplo de "no conversiones", ¿está contando la herencia como una conversión?Como cualquier tipo común entre foo y bar (incluido el "objeto") permitirá que se compile –

+0

. Para muchas personas, el lenguaje estático frente al dinámico se refiere a algo más que el tipo de sistema. Características como la compilación en tiempo de ejecución y un REPL también hacen que los idiomas sean más dinámicos. –

+3

@Jon Harrop: Sí, oí mucho. Otra definición que mucha gente usa es static = compiled, dynamic = interpreted. Python, que generalmente se considera un lenguaje dinámico, incluye un compilador que compila código de bytes, similar a los archivos de clase Java. Los archivos 'pyc' son los archivos compilados. Por lo tanto, creo que esta definición no es adecuada, ya que implicaría que Python es un lenguaje estático. Dado que los términos no tienen una definición oficial, creo que en realidad no se puede decir quién tiene o no la razón. –

5

lenguaje dinámico hace muchas tareas en tiempo de ejecución donde un lenguaje estático haría ellos en tiempo de compilación .
Las tareas en cuestión son generalmente una o más de: sistema de tipo, envío de métodos y generación de código.

que también responde bastante las preguntas sobre su uso.

4

¿Qué se considera un lenguaje de programación para ser llamado lenguaje dinámico.

Se considera que los lenguajes dinámicos son aquellos que ofrecen flexibilidad en el tiempo de ejecución. Tenga en cuenta que esto no necesariamente entra en conflicto con los sistemas de tipo estático. Por ejemplo, F # fue votado recientemente como "idioma dinámico favorito en .NET" en una conferencia a pesar de que está tipado estáticamente. Muchas personas consideran que F # es un lenguaje dinámico porque ofrece características de tiempo de ejecución como la evaluación meta-circular, una lectura-evaluación-impresión-bucle (REPL) y el tipado dinámico (de tipo). Además, la inferencia de tipo significa que el código F # no está lleno de declaraciones de tipo, como la mayoría de los lenguajes tipados estáticamente (por ejemplo, C, C++, Java, C# 2, Scala).

Cuáles son los problemas que debo resolver para que el lenguaje dinámico lo resuelva.

En general, dado que el tiempo y el espacio no son de importancia crítica, probablemente siempre desee utilizar lenguajes con flexibilidad en tiempo de ejecución y capacidades como la compilación en tiempo de ejecución.

Cuestiones relacionadas