El árbol Amber es una nueva estructura de datos para representar árboles sintácticos en Rust, diseñada como alternativa intermedia entre los árboles rojo y verde de la biblioteca Rowan. Su autor, g-plane, la concibió dentro del proyecto wasm-language-tools para superar las limitaciones de ambos enfoques sin sacrificar el rendimiento.
En Rowan, el árbol rojo ofrece una API rica que permite navegar hacia nodos padre y hermanos, pero sus referencias cíclicas obligan a asignar memoria en el heap y envolver los nodos en Rc, lo que penaliza el rendimiento. El árbol verde prescinde de esas referencias y resulta mucho más rápido, aunque a costa de una API menos cómoda: no distingue claramente entre nodos y tokens (devuelve un enum NodeOrToken) y no almacena el rango de texto, por lo que es imposible conocer la posición de un nodo en el código fuente. Ambos son vistas distintas del mismo dato subyacente.
El árbol Amber sacrifica la navegación hacia padres y hermanos, una capacidad que en la mayoría de casos prácticos no se necesita, y a cambio obtiene una API cercana a la del árbol rojo con un rendimiento próximo al del verde. Su definición es muy simple: un struct AmberNode contiene una referencia al GreenNode correspondiente y un TextRange con la ubicación en el código fuente. Gracias al borrow checker de Rust, la vida útil del AmberNode queda atada a la del GreenNode, lo que garantiza la seguridad de memoria sin coste en tiempo de ejecución. Al ser Copy, copiar un nodo no implica clonar datos.
En las pruebas del autor, comparadas con su propia implementación optimizada del árbol rojo, reemplazar partes del servicio de lenguaje redujo el tiempo de procesamiento de texto sin cambios de 15,469 µs a 7,609 µs (un 50,8% menos) y el de texto modificado de 224,73 µs a 172,39 µs (un 23,3% menos). El cambio también benefició a wat_formatter: al poder pasar &str directamente a tiny_pretty sin asignaciones en el heap, el tiempo de ejecución del formateador pasó de unos 85,191 µs a 34,808 µs, una reducción del 59% (aproximadamente 2,4 veces más rápido).
La conclusión es que, renunciando a la navegación ascendente, el árbol Amber ofrece un punto intermedio entre la ergonomía del árbol rojo y el rendimiento del árbol verde. Los detalles de implementación están disponibles en la pull request #36 del repositorio wasm-language-tools.
