El puntero dual de Mojo: seguro por defecto, inseguro por operación

Fuentes: Exploring Mojo's raw pointer type

Mojo, lenguaje orientado al cálculo de alto rendimiento, introduce un tipo de puntero bruto con un comportamiento singular: puede ser seguro o inseguro según la operación que se le aplique, en lugar de exigir variantes separadas como hace Rust. Esta dualidad es posible gracias al modelo de propiedad, destrucción ASAP y 'orígenes' que el compilador utiliza para rastrear el tiempo de vida y la exclusividad de los argumentos.

Un puntero declarado sobre una variable existente, con origen derivado de esa variable, es seguro por defecto: garantiza que apunta a un valor inicializado, nunca nulo, y permanece vivo mientras el puntero esté en uso. El compilador detecta además violaciones de exclusividad (dos referencias mutables simultáneas) en tiempo de compilación. Los punteros nulos se modelan con NoneType, que admite optimización de nicho para interoperar con interfaces FFI, mientras que dentro de Mojo se usa Optional[Pointer[...]].

La seguridad cambia cuando el programador realiza operaciones marcadas explícitamente como unsafe, como un acceso con offset arbitrario. Además, al asignar memoria dinámica mediante alloc, el puntero resultante lleva el origen MutUntrackedOrigin, que indica que no está ligado a ningún valor del sistema de tipos y mantiene únicamente la verificación de exclusividad. Mojo, sin embargo, no detecta accesos a memoria no inicializada procedente de asignación dinámica, a diferencia de lo que ocurre en contextos estáticos: es responsabilidad del programador. El artículo describe estos casos con ejemplos de código y errores de compilación, y compara el enfoque con el de Rust en bloques unsafe.