P: A menudo escuché la afirmación de que los idiomas escritos dinámicamente son más productivos que los idiomas escritos estáticamente. ¿Cuáles son las razones de este reclamo? "
Esto tiene razones históricas. Si retrocede algunas décadas, los lenguajes dinámicos fueron indiscutiblemente mucho más productivos que los lenguajes estáticos (aunque también significativamente más lentos). Perl es claramente mucho más productivo que C si conoce ambos y la tarea en cuestión lo permite. Pero con el tiempo, los idiomas se han prestado mucho entre sí, y los idiomas más nuevos están reduciendo la brecha (tanto en productividad como en rendimiento).
Aquí hay algunos puntos a considerar:
Recolección de basura : la recolección de basura es un gran impulso de productividad. Creo que Java fue el primer lenguaje estático convencional con GC. Antes de esto, estático básicamente significaba administración manual de memoria. (Nota: Aquí y en lo siguiente solo estoy considerando los idiomas principales. Existen muchos lenguajes experimentales y especializados que proporcionarán contraejemplos a cualquier punto que haga).
Seguridad de la memoria : es una mejora de la productividad de la que no tiene que preocuparse por dispararse en el pie. Antes de los lenguajes estáticos "administrados" como Java, estático normalmente significaba acceso directo a la memoria. La depuración también es parte de la productividad, y el acceso inseguro a la memoria puede conducir a errores realmente oscuros.
Sistemas de tipo engorroso. Antes de la introducción de tipos parametrizados (como plantillas o genéricos) en lenguajes estáticos, las limitaciones de los sistemas de tipos estáticos solían ser una carga. Por ejemplo, en Java, tenía que rechazar explícitamente cada vez que seleccionaba un elemento de una colección. Entonces tienes la sobrecarga sintáctica de un elenco y ningún tipo de seguridad. Teniendo en cuenta lo ubicuas que son las colecciones en la programación, este fue un gran inconveniente.
Tener que declarar el tipo de todo es una gran cantidad de tipeo redundante, pero con la inferencia de tipos moderna, esto puede reducirse significativamente.
Gran biblioteca estándar. Python fue famoso como "baterías incluidas" debido a la gran biblioteca estándar. Esto en comparación con C, que tiene una biblioteca estándar muy minimalista. Pero con plataformas como Java y .net, una gran biblioteca estándar se está convirtiendo en estándar, y los lenguajes más nuevos como Scala y F # están heredando esto "gratis".
Estructuras de datos de primera clase. Los lenguajes dinámicos como Perl y Python tienen estructuras de datos integradas de primera clase como listas y mapas con atajos sintácticos convenientes para operaciones comunes. En comparación con esto, C no tiene colecciones integradas, excepto matrices de tamaño fijo.
Closures y sintaxis lambda : los lenguajes dinámicos suelen haber tenido esto desde el principio, pero los lenguajes estáticos lo han adoptado, Java más recientemente.
REPL la capacidad de probar rápidamente fragmentos de código de forma interactiva es una gran bendición. Pero aunque las herramientas IDE, como la ventana "inmediata" en Visual Studio, los lenguajes estáticos pueden emular esto hasta cierto punto.
Herramientas avanzadas : además de los puntos anteriores donde los lenguajes estáticos se están acercando a la conveniencia de los lenguajes dinámicos, los editores modernos están aprovechando el análisis estático de una manera que los lenguajes dinámicos tienen dificultades para hacer coincidir. Por ejemplo, los editores pueden proporcionar refactorizaciones automáticas seguras, algo que es estrictamente hablando imposible en un lenguaje dinámico.
En pocas palabras: Históricamente era cierto, pero hoy la respuesta es menos clara.
P: Entonces: ¿qué hay para decir sobre la productividad con la tipificación dinámica que realmente es una ventaja del modelo de tipo en sí?
Es algo difícil separar el modelo de escritura dinámica de los lenguajes dinámicos, pero como ejemplo, C # ha adoptado características más dinámicas con el tiempo, aunque su núcleo es un lenguaje estático. Esto es realmente una prueba de beneficio del modelo de tipo dinámico. Ejemplos:
Reflexión La
reflexión es fundamentalmente una característica de escritura dinámica. Usted inspecciona los tipos de objetos en tiempo de ejecución que en tiempo de compilación. Cuando se introdujo, estaba mal visto, pero en C # el uso de la reflexión se vuelve cada vez más omnipresente, por ejemplo, ASP.Net MVC usa la reflexión en gran medida.
Atributos Los
atributos son un ejemplo de tipeo dinámico. Puede agregar atributos arbitrarios a una clase en tiempo de compilación, y luego inspeccionar en tiempo de ejecución (a través de la reflexión) y manipular objetos basados en ella. Algo así como MEP es básicamente un marco de extensión basado en un modelo de tipo dinámico.
Linq a SQL, EF mv.
Los diversos transformadores Linq inspeccionan las consultas como objetos de tiempo de ejecución y generan sql sobre la marcha. No se vuelve más dinámico que inspeccionar el código en tiempo de ejecución. CodeDom es el otro lado de la moneda, donde se puede generar código en tiempo de ejecución
Roslyn
Roslyn básicamente implementa eval
, lo que alguna vez se consideró la característica definitoria de un lenguaje verdaderamente dinámico.
Dinámico
El dynamic
tipo es la característica más explícitamente dinámica en C #, y se anuncia para hacer que la interacción con objetos externos y lenguajes sea más simple y productiva. Pero también se usa en Asp.net MVC por conveniencia.
El beneficio de todas las características anteriores muestra que el modelo dinámico tiene ventajas definidas incluso en un lenguaje estático con tipos parametrizados, tipos estructurales e inferencia de tipos.