programacion lenguaje dinámica bcpl programming-languages dynamic static

programming languages - dinámica - ¿Qué califica un lenguaje de programación como dinámico?



bcpl lenguaje de programacion (5)

¿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?


Lo que califica a un lenguaje de programación para ser llamado lenguaje dinámico.

Generalmente, se considera que los lenguajes dinámicos son aquellos que ofrecen flexibilidad en 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áticos (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, siempre que el tiempo y el espacio proporcionados no sean de importancia crítica, es probable que siempre desee utilizar lenguajes con flexibilidad y capacidades en tiempo de ejecución, como la compilación en tiempo de ejecución.


El lenguaje dinámico realiza muchas tareas en tiempo de ejecución donde un lenguaje estático las haría en tiempo de compilación .
Las tareas en cuestión suelen ser una o más de las siguientes: sistema de tipo, envío de métodos y generación de código.

Lo cual también responde bastante bien a las preguntas sobre su uso.



Hay muchas definiciones diferentes en uso, pero una posible diferencia es:

  • Un lenguaje dinámico generalmente usa tipeo dinámico .
  • Un lenguaje estático generalmente usa tipeo estático .

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.


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 poderoso sistema de tipo que se revisa en tiempo de compilación: si su programa se compila, no tiene errores comunes ni comunes.
  • La forma compilada es muy diferente del programa haskell (es un 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.

Entonces, para los lenguajes estáticos, suelo pensar: se necesita un análisis de tiempo de compilación bastante largo, el sistema de tipos me evitará cometer errores tontos, pero también de hacer algunas cosas que son realmente válidas, y si quiero manipular un programa en tiempo de ejecución, va a ser un poco molesto porque la representación en 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 tipo. Muchos errores comunes solo pueden descubrirse ejecutando el programa.
  • Los programas de Clojure son esencialmente solo listas de Clojure (la estructura de datos) y pueden manipularse 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 los lenguajes dinámicos, generalmente pienso: paso de compilación corta (básicamente solo lectura de sintaxis), desarrollo tan rápido e incremental, prácticamente sin límites a lo que me permitirá hacer, pero no me evitará errores tontos.

Como han indicado otras publicaciones, otros lenguajes intentan tomar un término medio: por ejemplo, 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 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 obligue a tomar 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.