Una formulación alternativa del borrow checker de Rust basada en alias

Fuentes: An alias-based formulation of the borrow checker

Niko Matsakis presenta una propuesta experimental para reformular el borrow checker de Rust. El objetivo es superar algunas limitaciones del diseño actual (NLL) y, a la vez, mejorar su velocidad de cómputo. Matsakis ya cuenta con un prototipo implementado que supera la suite completa de pruebas de NLL y resuelve casos que el análisis vigente no maneja, aunque su rendimiento es todavía inferior y requiere optimización.

Desde el punto de vista del usuario final de Rust, la propuesta no cambia el comportamiento observable del compilador: el borrow checker debería seguir funcionando de forma equivalente a NLL. La diferencia está en cómo el compilador representa internamente los programas.

El cambio central es que las regiones, en lugar de corresponder a porciones del código fuente o del grafo de flujo de control, pasan a representar conjuntos de préstamos (loans). Un préstamo es una expresión de borrow como &x o &mut v. Si un préstamo del conjunto se invalida —por ejemplo, al acceder directamente a la variable prestada—, la referencia completa deja de ser válida. Las reglas de subtipado también cambian: ya no se acorta una vida, sino que se amplía el conjunto de préstamos.

El análisis se define mediante reglas Datalog, un sublenguaje de Prolog orientado a una ejecución eficiente y sin ciclos negativos. Para implementarlo, Matsakis utiliza la crate differential-dataflow, que permite traducir las reglas de forma casi directa y obtener prototipos funcionales en pocas horas.

El artículo introduce además el concepto de variables de región numeradas ('0, '1…) y explica cómo el sistema de tipos genera relaciones de subconjunto entre ellas (por ejemplo, '4: '5) al aplicar las reglas habituales. Es un primer paso hacia un borrow checker más expresivo y eficiente.