NaN boxing es una técnica de representación de datos que explota la especificación IEEE 754 para números de punto flotante de doble precisión (double). Un double utiliza 64 bits, y los valores NaN tienen un patrón de bits específico en su exponente (todos unos) y un bit 'quiet' o 'signaling' en la mantisa. Esto deja un número significativo de bits en la mantisa disponibles para codificar otros tipos de datos, como enteros pequeños, punteros a objetos, o incluso referencias a tipos específicos, sin colisionar con valores numéricos válidos. La idea es que, si un valor no es un número de punto flotante real, se puede 'boxear' otro tipo de dato dentro de su representación NaN.
Esta técnica es ampliamente utilizada en la implementación de motores de JavaScript, como V8 (Google Chrome y Node.js), JavaScriptCore (Safari) y SpiderMonkey (Firefox). Estos motores necesitan representar de manera eficiente tipos dinámicos como números, objetos, booleanos y null, a menudo dentro de un mismo registro o slot de memoria. NaN boxing permite que un valor JavaScript (JSValue) se almacene como un double, donde los números reales son doubles directos, y otros tipos se codifican como NaN con la información adicional en la mantisa. Por ejemplo, un puntero a un objeto JavaScript se puede almacenar en los bits de la mantisa de un NaN, mientras que valores como true, false, null o undefined pueden tener sus propios patrones de bits NaN predefinidos.
Para un arquitecto de sistemas, NaN boxing es una técnica crucial para entender los trade-offs entre rendimiento, uso de memoria y complejidad de implementación en sistemas que manejan tipos de datos dinámicos. Permite reducir significativamente el overhead de memoria al evitar la necesidad de 'cajas' (wrappers) de objetos separadas para cada tipo primitivo, lo que a su vez mejora la localidad de caché y reduce la presión sobre el recolector de basura. Sin embargo, introduce complejidad en el código de bajo nivel para 'unboxing' y 'boxing' los valores, y puede hacer que la depuración sea más desafiante. La decisión de emplear NaN boxing es estratégica en el diseño de máquinas virtuales y runtimes de lenguajes dinámicos, donde la eficiencia en la representación de datos es fundamental para alcanzar un alto rendimiento.