Sustituir un enum de Rust por una palabra de 64 bits acelera un intérprete un 17%

Fuentes: Replacing a Rust Enum with a 64-bit Word Made My Interpreter 17% Faster

El desarrollador Maxime Chevalier-Boisvert detalla en la sexta entrega de su serie sobre el intérprete y la máquina virtual del lenguaje Plush cómo reemplazó el tipo de valor basado en un enum etiquetado de Rust por una palabra de 64 bits con un esquema de etiquetado de bits bajos (low-bit tagging). El cambio redujo el tamaño de cada valor de 128 a 64 bits y, según sus mediciones, aceleró el intérprete alrededor de un 17%.

Plush es un lenguaje dinámicamente tipado inspirado en Python, JavaScript, Ruby, Lua y Lox. Su tipo de valor original debía representar más de una docena de variantes (enteros, flotantes, cadenas, funciones, closures, objetos, arrays, diccionarios, etc.), lo que debido a la alineación de memoria ocupaba 16 bytes por valor. En arrays grandes eso generaba gran cantidad de bytes desaprovechados.

La nueva representación codifica cinco tipos de valores en 64 bits: enteros con signo de 62 bits (fixnums), flotantes con esquema de autoetiquetado, inmediatos con un subtag de 5 bits (nil, true, false, undef, identificadores de función y clase, funciones huésped), punteros a objetos y punteros a handles. Un bit del etiquetado distingue los valores que pueden compararse directamente con una sola instrucción de comparación, lo que agiliza condiciones de bucle y comprobaciones frente a nil.

El artículo, coescrito con la asistencia de Claude, explica las decisiones de diseño, las particularidades del tratamiento de flotantes y cadenas, y cómo el nuevo tipo, implementado como newtype de Rust sobre un u64 con métodos always inline, se integra en el bucle del intérprete sin pérdidas de rendimiento. El objetivo final es que Plush, aun siendo interpretado, pueda renderizar animaciones 3D en tiempo real.