Sí, se han hecho preguntas similares, pero siempre con el objetivo de descubrir "cuál es mejor".
Lo pregunto porque surgí como desarrollador principalmente en JavaScript y realmente no tengo mucha experiencia escribiendo en lenguajes estáticamente escritos.
A pesar de esto, definitivamente veo valor en aprender C para manejar operaciones exigentes en niveles más bajos de código (lo que supongo que tiene mucho que ver con estático vs dinámico en el nivel del compilador), pero lo que estoy tratando de entender es si hay contextos de proyecto específicos (¿tal vez ciertos tipos de operaciones dinámicas intensivas en datos?) que involucran otras cosas además del rendimiento donde tiene mucho más sentido ir con Java o C # frente a algo como Python.
fuente
Respuestas:
Sí definitivamente.
La escritura dinámica tiene ventajas definidas en los casos en que desea poder tratar todo como un solo tipo. La serialización / deserialización es uno de los ejemplos clásicos. Esta es la razón por la cual tanta programación web se realiza en lenguajes de secuencias de comandos de tipo dinámico: se adaptan bien a una tarea que implica una gran cantidad de conversión de todo tipo de datos hacia y desde cadenas.
Por otro lado, para la programación de aplicaciones, los lenguajes estáticos funcionan mucho mejor porque tratar de tratar todo como un solo tipo no es un requisito con frecuencia. A menudo desea tener estructuras de datos eficientes con datos representados como sí mismos y que no se conviertan a otros tipos con mucha frecuencia. Esto hace que las características de la escritura dinámica sean un inconveniente en lugar de un beneficio, por lo que las aplicaciones se escriben casi exclusivamente en lenguajes de escritura estática.
fuente
Desde mi punto de vista, si puede trabajar de forma natural dentro de un lenguaje tipado estáticamente, entonces el tipeo estático es el camino a seguir. En general, el propósito de un sistema de tipos es evitar que realice operaciones con una semántica indefinida, como
(string) "hello" + (bool) true
. Tener el nivel adicional de seguridad que le impide realizar estas operaciones puede ser una buena manera de evitar errores en su código, incluso sin pruebas unitarias extensas. Es decir, la seguridad de tipos proporciona otro nivel de confianza en la corrección semántica de su código.Pero los sistemas de tipos son muy difíciles de corregir. Yo no creo que es un sistema de tipo perfecto en la naturaleza en el momento de escribir estas líneas. (Por "sistema de tipo perfecto", me refiero a un sistema de tipo estricto, que no requiere anotaciones de código detallado, que no genera errores de tipo falso positivo, y cuyos errores de tipo son fáciles de entender para el programador). Además, puede será difícil entender los sistemas de tipos realmente buenos que existen. Cuando estaba aprendiendo Haskell, no puedo decirte la cantidad de errores de tipo oscuro que recibí al intentar escribir lo que me pareció (para mí) el código correcto. Por lo general, el código no era realmente correcto (lo cual es un punto a favor del sistema de tipos), pero tomó muchode trabajo para comprender los mensajes de error del compilador, para poder corregir los problemas subyacentes. En los lenguajes OO, puede que eventualmente te encuentres pensando "este argumento debería ser contravariante con el tipo de entrada, no covariante", o (más probablemente) volver a los tipos de letra para escapar de los límites del sistema de tipos. Los sistemas de tipos pueden ser mucho más complicados de lo que piensas.
Por lo que vale, entiendo que la dificultad de encontrar buenos sistemas de tipos es parte de lo que motivó a Gilad Bracha a incluir soporte de sistemas de tipos conectables en Newspeak.
fuente
Son herramientas diferentes, pero no es por rendimiento. Se trata de complejidad .
Los lenguajes dinámicos generalmente apuntan a la máxima flexibilidad, y trae falta de validación y una especie de garantía. Entonces, es muy poderoso en programas a pequeña escala, pero se vuelve casi imposible mantener programas a gran escala (complejidad).
Los lenguajes estáticos generalmente apuntan a la máxima validación. Su primer objetivo suele ser detectar errores (o errores) lo antes posible. Se hacen muchas garantías para la validación. Entonces es más difícil de aprender y comenzar, pero a medida que los programas se hacen más grandes, proporciona una mejor validación del programa con mucho menos costo (esfuerzos de codificación).
Como resultado, los lenguajes dinámicos generalmente se ajustan a programas pequeños (me refiero a muy pequeños) como páginas web dinámicas, DSL de navegador web (¡no para aplicaciones de navegador!) O scripts de shell. Los lenguajes estáticos se adaptan mejor a las programaciones del sistema o cualquier otra cosa.
Las descripciones anteriores son algo sobre lenguajes muy puramente dinámicos o estáticos. La mayoría de los lenguajes de la vida real se encuentran entre ellos y muestra varias características.
Consulte aquí para obtener más detalles: https://softwareengineering.stackexchange.com/a/105417/17428
fuente
Actualmente programo en lenguajes de tipo estático (C # y F #), pero disfruto programando en lenguajes dinámicos (Smalltalk, Ruby). Hay muchas ventajas y desventajas que las personas asocian con un tipo frente a otro que tienen más que ver con el idioma que cuando se imponen los tipos. Por ejemplo, los lenguajes dinámicos generalmente tienen una sintaxis más limpia y concisa, sin embargo, F # y OCaml con su sistema de inferencia de tipos tienen una sintaxis tan limpia como cualquier lenguaje dinámico. Y con la escritura estática, tiene refactorizaciones automáticas reales y autocompletado, pero Smalltalk, con todo el código fuente en una base de datos y cada método compilado por separado, fue el primer idioma en tener refactorizaciones automáticas serias, y funcionó muy bien. En última instancia, los lenguajes dinámicos y estáticos modernos de hoy en día son de tipo seguro, que es el aspecto más importante de su sistema de tipos,
fuente
Ahora es 2015, lo que agrega algunos fragmentos interesantes a la conversación:
Por lo tanto, los chicos del backend están cansados de la camisa de fuerza innecesaria de la escritura estricta, mientras que los chicos de la interfaz están cansados del caos de la escritura dinámica.
Muy irónico: me pregunto si se encontrarán en el medio, o se cruzarán con el estallido sónico de una fecha límite que pasa ... ;)
fuente