Tres conceptos de lenguajes que mejoran la seguridad y la expresividad del código
Flow typing, borrow checking y contract programming son ideas que reducen errores y hacen más legible el desarrollo en lenguajes modernos.
Pranoy Dutta repasa tres características de lenguajes que, según él, merecen más atención. La primera es el flow typing, popularizado por Crystal y también presente en TypeScript. Consiste en que el compilador sigue la pista del tipo de una variable a lo largo de su vida y permite que el mismo identificador cambie de tipo. Cuando el tipo no está garantizado, el compilador obliga a una comprobación explícita (is_a?) antes de usar métodos específicos, lo que brinda la flexibilidad de un lenguaje dinámico sin el coste de tiempo de ejecución de una verificación dinámica.
La segunda idea es el borrow checking de Rust. El compilador verifica, en tiempo de compilación, que las referencias a datos no sobrevivan al propietario y que sólo exista una referencia mutable o cualquier número de referencias inmutables simultáneas. Esta regla elimina los data races sin necesidad de un recolector de basura y sin introducir bloqueos en tiempo de ejecución. La complejidad está en el propio código, pero es un coste aceptable cuando se escribe software concurrente.
Por último, D ofrece contract programming. Más allá del clásico assert, el lenguaje distingue entre invariantes de programa (assert) y condiciones de error externo (enforce). Además, permite especificar pre‑ y post‑condiciones en funciones y invariantes a nivel de clase. El ejemplo de una cuenta bancaria muestra cómo los contratos garantizan que el saldo nunca sea negativo y que las operaciones de depósito y retiro respeten sus precondiciones, reduciendo la necesidad de comprobaciones manuales dispersas.
Estas tres ideas comparten un objetivo: trasladar más verificaciones al compilador para evitar errores en producción. Cada una aparece en lenguajes con comunidades distintas, pero el patrón es claro: mayor seguridad está al alcance sin sacrificar la productividad.
Queda observar cómo otras plataformas adoptan estos conceptos. TypeScript ya incorpora el análisis de flujo, Rust sigue ampliando su modelo de préstamo y D continúa explorando contratos más expresivos. Si tu stack incluye alguno de estos lenguajes, vale la pena revisar la documentación y considerar integrar estas técnicas en los procesos de revisión de código.


