2009-11-13 10 views
6

Jon Skeet publicó this blog post, en el que afirma que se preguntará por qué la parte dinámica de los idiomas es tan buena. Así que pensé en preguntar preventivamente en su nombre: ¿Qué los hace tan buenos?¿Por qué la parte "Dinámica" de los lenguajes dinámicos es tan buena?

+6

Wiki de la comunidad imho – ChristopheD

+1

Solo para evitar que mi blog publique un poco más: cosas como REPL y tipo de inferencia tienden a agruparse con lo que a la gente le gusta de los lenguajes dinámicos, pero no son aspectos intrínsecamente dinámicos. –

+0

Para agregar al comentario de Jon Skeet, OCaml y Haskell están tan tipados estáticamente como se puede obtener, pero vienen con REPL recién sacado de la caja. F # es otro lenguaje tipado estáticamente con REPL y tipo de inferencia. – Juliet

Respuesta

8

Los dos enfoques fundamentalmente diferentes a los tipos de lenguajes de programación son tipos estáticos y tipos dinámicos. Permiten paradigmas de programación muy diferentes y cada uno tiene sus propios beneficios y desventajas.

Recomiendo encarecidamente el excelente artículo What to Know Before Debating Type Systems de Chris Smith para obtener más información sobre el tema.

A partir de ese artículo:

Un sistema de tipo estático es un mecanismo por el cual un compilador examina el código fuente y asigna etiquetas (llamados "tipos") a las piezas de la sintaxis, y luego las utiliza para inferir algo sobre el comportamiento del programa. Un sistema de tipo dinámico es un mecanismo mediante el cual un compilador genera código para realizar un seguimiento del tipo de datos (coincidentemente, también llamado su "tipo") utilizado por el programa. El uso de la misma palabra "tipo" en cada uno de estos dos sistemas no es, por supuesto, completamente coincidente; sin embargo, se entiende mejor como una especie de significado histórico débil. Se produce una gran confusión al tratar de encontrar una visión del mundo en la que "tipo" realmente signifique lo mismo en ambos sistemas. No es así La mejor manera de abordar el problema es reconocer que:

  • Gran parte del tiempo, los programadores están tratando de resolver el mismo problema con tipos estáticos y dinámicos.
  • Sin embargo, los tipos estáticos no están limitados a problemas resueltos por tipos dinámicos .
  • Los tipos dinámicos tampoco están limitados a problemas que se pueden resolver con tipos estáticos.
  • En esencia, estas dos técnicas no son lo mismo en absoluto.
+0

+1 para el enlace. Es un artículo muy perspicaz (de hecho, ¡una lectura muy recomendada!) – Stephan202

+0

Gran respuesta para establecer el debate. John tiene razón en que muchas de las cosas que equiparamos con los lenguajes dinámicos no lo son. –

+0

En ese enlace, vi lo siguiente: "OEl cálculo lambda simplemente tipado, en el que se basan todos los demás sistemas de tipo, demuestra que los programas terminan en un tiempo finito. De hecho, la pregunta más interesante es cómo extender de manera útil el ¡escriba el sistema para poder describir programas que no terminan! Sin embargo, encontrar bucles infinitos no está en la clase de cosas que la mayoría de las personas asocian con "tipos", por lo que es sorprendente ". Estoy bastante seguro de que esto es completamente INCORRECTO, ya que las computadoras son máquinas de turing y creo que se ha demostrado matemáticamente que no se puede demostrar que no todos los programas se detengan. – RCIX

-1

lenguajes de programación dinámicos básicamente hacen las cosas en tiempo de ejecución que hacen otros idiomas en tiempo de compilación. Esto incluye la extensión del programa, agregando un nuevo código, extendiendo objetos y definiciones, o modificando el sistema de tipo, todo durante la ejecución del programa en lugar de la compilación.

http://en.wikipedia.org/wiki/Dynamic_programming_language

Éstos son algunos ejemplos comunes

http://en.wikipedia.org/wiki/Category:Dynamic_programming_languages

Y para responder a su pregunta original:

son lentos, es necesario utilizar un editor de texto básico para escribirlos - Sin indicaciones de Intellisense o Código, tienden a ser un gran dolor en el culo para escribir y mantener. PERO el más famoso (javascript) se ejecuta en prácticamente todos los navegadores del mundo, eso es algo bueno, supongo. Vamos a llamarlo 'amplia compatibilidad'. Creo que probablemente pueda obtener un intérprete de lenguaje dinámico para la mayoría de los sistemas operativos, pero ciertamente no podría obtener un compilador para lenguajes no dinámicos para la mayoría de los sistemas operativos.

+1

Entonces, para completar, ¿qué hace que este sea un buen enfoque? –

+1

Estoy muy en desacuerdo con esta afirmación y le señalo http://steve.yegge.googlepages.com/is-weak-typing-strong-enough – RCIX

+0

Disculpe, no quise ofender. Aunque esta frase saltó sobre mí en esa página "El tema de la tipificación fuerte frente a la débil realmente hace que la gente se preocupe". jeje ... Digamos que los idiomas dinámicos tienen un propósito. Sin embargo, no escribirías un sistema de negociación de acciones de alta transacción en uno, ¿o sí? – reach4thelasers

4

Lo principal es que evita una gran cantidad de redundancia que proviene de hacer que el programador "declare" esto, aquello y lo otro.Una ventaja similar podría obtenerse mediante la inferencia de tipo (boo hace eso, por ejemplo) pero no de manera tan económica y flexible. Como he escrito en the past ...:

completa la comprobación de tipos o inferencia requiere un análisis de todo el programa , que puede ser muy poco práctico - y paradas lo que Van Roy y Haridi, en su obra maestra "Conceptos, técnicas y modelos de Computer Programming", llame a "totalmente programación abierta". Citando una publicación de mío desde 2004: "" "Me encantan las explicaciones de de Van Roy y Haridi, 104-106 de su libro, aunque puedo o no estoy de acuerdo con sus conclusiones (que son básicamente eso la diferencia intrínseca es muy pequeña - que punto a Oz y Alice como interoperables idiomas sin y con tipos estáticos, respectivamente), todos los puntos que hacen son buena que es más importante, creo, la forma dinámica a escribir . permite la modularidad real (más difícil con el tipado estático , ya que la disciplina de tipo debe aplicarse en el módulo bo undaries), y "computación exploratoria en un modelo de computación que integra varios paradigmas de programación ".

"Se recomienda el tipado dinámico", concluyen en " ," cuando los programas deben ser tan flexibles como ". Recomiendo la lectura de los manifiesto ágil a entender por qué la flexibilidad máxima es crucial en la mayoría de la programación aplicación en el mundo real - y, por tanto, por qué, en dicho mundo real en lugar de en los círculos académicos más Dr. Van Roy y Dr . Hadidi mudanza, la tipificación dinámica es generalmente preferible, y no es un problema tan pequeño ya que hacen la diferencia. Aún así, al menos mostrar más conciencia de los problemas, en dedicar 3 páginas excelentes de discusión sobre TI, pros y contras, que casi cualquier otro libro que he visto - la mayoría de los libros claramente delineado y preformados precedencia de una forma u otra, por lo que la discusión rara vez es tan equilibrada como eso;).

1

Hagamos algunas comparaciones ventajas/desventajas:

lenguajes dinámicos:

  • decisiones de tipo pueden ser cambiados con un impacto mínimo código.
  • El código se puede escribir/compilar de forma aislada. No necesito una implementación o incluso una descripción formal del tipo para escribir el código.
  • Tiene que confiar en las pruebas unitarias para encontrar cualquier tipo de error.
  • El lenguaje es más escueto. Menos tipeo
  • Los tipos se pueden modificar en tiempo de ejecución.
  • Editar y continuar es mucho más fácil de implementar.

estáticas Idiomas:

  • compilador dice de todos los errores de tipo.
  • Los editores pueden ofrecer avisos como Intellisense mucho más ampliamente.
  • Sintaxis más estricta que puede ser frustrante.
  • Se requiere (por lo general) más tipeo.
  • El compilador puede hacer una mejor optimización si conoce los tipos de antemano.

Para complicar las cosas un poco más, tenga en cuenta que los lenguajes como C# van parcialmente dinámica (en el sentir de todos modos) con el constructo var o lenguajes como Haskell que son de tipo estático, sino dinámico sienten debido a la inferencia de tipos.

+0

Puntos de interés. Sin embargo, ha quedado bien demostrado que la tereseness no * matemáticamente el 100% siempre es igual a * tereseness, pero es cierto en la mayoría de los casos. Además, debería leer http://steve.yegge.googlepages.com/is-weak-typing-strong-oughough. – RCIX

+2

La integridad no es una característica intrínseca de los lenguajes tipados dinámicamente. PHP, ASP clásico, JavaScript y Objective-C son idiomas sorprendentemente hinchados en comparación con OCaml, Haskell, SML y Scala. Por lo que vale, generalmente encuentro que mi F # es comparativamente o incluso más concisa que Python equivalente. – Juliet

+1

"var" no es de ninguna manera dinámico - C# 3 está completamente tipado estáticamente. (C# 4 * está * yendo dinámico donde usted lo quiere). "Var" es simplemente escribir inferencia de nuevo. Es por eso que la publicación del blog va a ser sobre el lado dinámico de las cosas, no sobre las otras cosas que a menudo acompañan a los lenguajes dinámicos. –

Cuestiones relacionadas