El lenguaje de programación Valen, un proyecto experimental que busca proporcionar alias mutables seguros en memoria, está implementando un borrow checker que opera recorriendo las funciones hacia atrás. Mientras que la mayoría de los compiladores y borrow checkers (como los de Rust o Vale) realizan un paso hacia adelante para determinar la inferencia de regiones o la seguridad, la arquitectura de Valen procesa la función desde la declaración final hasta el principio. Esta inversión está diseñada para abordar obstáculos técnicos específicos en la seguridad de memoria, particularmente en lo que respecta a la identificación del último punto de uso de una variable y las complejidades de la invalidación basada en bucles.
El mecanismo se basa en un proceso de compilación de múltiples fases. Después de analizar el código fuente en un Árbol de Sintaxis Abstracta (AST) y realizar el tipado estático, el compilador lleva a cabo una 'agrupación estática'. Esta fase determina exactamente a qué parte de una variable o estructura de datos apunta una referencia, integrando efectivamente información de 'ruta' en el tipo de la variable. En la fase final de verificación de seguridad, el compilador realiza el escaneo hacia atrás. Mantiene una lista de variables 'pendientes' que se utilizan más adelante en la función. Cuando el escaneo encuentra un evento de 'USE', la variable se añade a la lista de pendientes. Cuando encuentra un evento de 'MUTATE', el compilador verifica que ninguna de las variables en la lista de pendientes sea invalidada por esa mutación. Si una mutación afecta a una variable pendiente, el compilador marca un error de uso después de la liberación. Esto permite al compilador identificar conflictos de inmediato porque ya sabe qué variables deben permanecer válidas hasta el final de la función.
Una de las motivaciones principales de este enfoque inverso es el manejo de bucles y la evitación de operaciones complejas de 'obtención y navegación'. En un escaneo hacia adelante, identificar el último uso de una variable puede ser difícil si ese uso está anidado dentro de un bucle o requiere anticiparse para ver si una variable es 'revivida' por una asignación posterior. Un escaneo hacia atrás identifica naturalmente el uso más reciente primero, simplificando la contabilidad necesaria para determinar si una variable sigue siendo válida. Sin embargo, este enfoque enfrenta sus propios desafíos, como mantener el rendimiento al escanear el código múltiples veces para diferentes objetivos de prueba. Al alejarse de los modelos de resolución de restricciones utilizados en lenguajes como Rust, Valen busca un algoritmo más dirigido por la sintaxis que simplifique las reglas de seguridad de memoria manteniendo la compatibilidad con el ecosistema de Rust.
