Al elaborar el diseño de un nuevo sistema, ¿es mejor comenzar con un lenguaje de tipo estático (como Haskell) o un lenguaje de tipo dinámico (como Ruby)?
Argumentos en los que puedo pensar:
Con un lenguaje estático, puede crear rápidamente una especificación y alcance para lo que hará el programa. Con un lenguaje dinámico, puede crear rápidamente una demostración funcional para presentar al cliente para su revisión.
Con un lenguaje dinámico, a menudo evita tener que reorganizar las estructuras de datos y refactorizar el código cuando cambia su diseño. Con un lenguaje estático, puede definir tipos antes de la implementación, manteniendo el código para mantenerlo muy pequeño.
Con un lenguaje estático, debe averiguar de antemano qué hará su programa. Con un lenguaje dinámico, puede comenzar a escribir código y dejar que el diseño crezca orgánicamente. Como dice Paul Graham en Hackers and Painters :
Un lenguaje de programación es para pensar en programas, no para expresar programas que ya has pensado.
Con un lenguaje estático, el compilador puede ayudar a identificar muchos tipos de errores. Con un lenguaje dinámico, puede comenzar a probar y encontrar errores antes.
La tipificación estática y dinámica tiene ventajas y desventajas en lo que respecta a la creación de prototipos. Sin embargo, ambos me parecen enfoques igualmente válidos. Según sus experiencias, ¿cuál es mejor en última instancia?
Notas
Prototipos en lenguaje natural
Un tercer tipo de lenguaje a considerar: el lenguaje natural. En lugar de crear prototipos en el código, uno puede crear un prototipo por escrito. El cliente puede leer su documentación y criticar su diseño desde el principio, pero no puede jugar con una demostración funcional. Si está bien escrito, la documentación puede facilitar la implementación en cualquier idioma. Advertencias:
La documentación puede ser tediosa de leer y difícil de digerir sin poder verla. Especulo que un cliente preferiría experimentar con algo que funciona en lugar de leer un muro de texto (e imágenes).
Crear prototipos de una aplicación en inglés en lugar de en definiciones de tipo es más detallado y menos concreto.
Los tipos de Haskell son descriptivos
Tenga en cuenta que los tipos son particularmente descriptivos en Haskell, más que en muchos lenguajes estáticos como C ++ y Java. Por ejemplo, supongamos que tengo una función con este tipo de firma en Haskell:
foo :: forall a. [a] -> a
Una función que, para cualquier tipo a
, toma una lista de elementos de tipo a
y devuelve un valor de tipo a
.
Incluso sin saber el nombre de la función, sé con certeza que:
No realiza entrada / salida ni modifica ningún valor (bueno, a menos que use unsafePerformIO incorrectamente), porque Haskell es puramente funcional.
No puede tratar los elementos como, por ejemplo, enteros, porque tiene que admitir cualquier tipo.
Se tiene que utilizar la lista de entrada (que, o lanzar una excepción o entrar en un bucle infinito). De lo contrario, ¿de dónde obtendría un valor de tipo
a
?
Por lo tanto, lo único que podría hacer esta función (aparte de fallar) es extraer un elemento de la lista de entrada y devolverlo. Aunque todavía no sé qué artículo usará, [a] -> a
me cuenta casi todo lo demás.