Idris es un lenguaje muy poderoso que tiene un sistema de tipos realmente restrictivo. También tenemos Haskell con un sistema de tipos muy restrictivo, y Rust también. Rust tiene muchas garantías en tiempo de compilación sobre la gestión de memoria.
Al mismo tiempo, sin embargo, puede ser realmente difícil enviar rápidamente un programa en Rust, porque tienes un compilador que te impone algunas restricciones para tener un sistema predecible. Necesita establecer algunas limitaciones.
Por otro lado, tenemos lenguajes muy dinámicos como JavaScript y Ruby. Son excelentes para prototipos rápidos, pero al mismo tiempo, no tenemos un compilador que pueda cuidarnos y asegurarse de que no cometamos errores tontos.
TypeScript está en algún punto intermedio. TypeScript es genial en general. TypeScript nos ayuda a obtener lo mejor de ambos mundos. Y podemos equilibrar usando diferentes indicadores de rigurosidad de TypeScript. Por ejemplo, si tienes verificaciones estrictas de nodos, nos inclinaremos ligeramente más hacia el lado estático en comparación con el dinámico.
Otra observación importante sobre estático versus dinámico es que es muy fácil pasar de estático a dinámico. Esto significa que solo debes relajar algunas de las restricciones, y tu sistema pasará de predecible a más flexible. Sin embargo, es realmente difícil pasar de un sistema muy dinámico a un sistema muy estático sin romper la infraestructura existente.
Si lo ponemos en términos más prácticos, podemos pensar en los sistemas estáticos como sistemas que son realmente bien optimizables en tiempo de compilación. El compilador puede razonar sobre tu programa mucho mejor si tiene metadatos sobre tus anotaciones de tipo. Puede analizar tu programa y transformarlo en una versión más eficiente de sí mismo. Los editores de texto y los IDE también pueden aprovechar esta función. Pueden examinar tu código fuente utilizando su servicio de lenguaje y brindarte sugerencias de autocompletado realmente excelentes e incluso mostrarte errores de verificación de tipos en línea que tengas.
La visualización del código fuente es una característica muy emocionante. En una de mis primeras ng-conf, presenté una charla llamada `La ciencia loca con el compilador de Angular`. Allí, implementé un compilador que toma tu aplicación de Angular y la compila a una realidad virtual. Puedes caminar dentro de esta realidad virtual con, digamos, Google Cardboard, y puedes mirar a tu alrededor y explorar tu aplicación en el mundo 3D, donde tus componentes son árboles con coronas que representan sus plantillas, y así sucesivamente. Sé que este es un ejemplo muy tonto y no muy práctico en un escenario del mundo real, pero muestra que un sistema estático puede ayudarte a lograr esto. Te permite realizar un análisis estático muy profundo de tu aplicación y hacer cosas locas.
Esto aplicado en un escenario del mundo real para una aplicación realmente útil podría ser un sistema para la ingeniería inversa de una aplicación. Puedes construir un visualizador de código fuente que muestre los módulos individuales en tu sistema, los componentes individuales y su relación entre sí. Este es un concepto realmente importante, especialmente cuando estás incorporando nuevos desarrolladores, porque visualmente es mucho más conveniente para nosotros, como humanos, razonar sobre sistemas. Por otro lado, por supuesto, si tienes un sistema estático, esto significa que necesitas tener un compilador que imponga algunas garantías y esta compilación lleva tiempo.
Comments