Parámetros y SIMD
22 pasos en 5 series de Mojo.
Mojo parte cada función en dos mitades: lo que el compilador puede resolver y lo que le toca hacer a la máquina. Los corchetes llevan los parámetros de compilación, así que un tamaño o un tipo queda fijado antes de que el programa arranque y al código generado no le queda nada por revisar. SIMD es la otra mitad — un tipo vector que cae sobre un registro real del hardware, donde una sola instrucción suma cuatro carriles a la vez.
Juntos son la razón de ser de Mojo. Este tour va de las vinculaciones `comptime` y los structs paramétricos a las máscaras, los casts y las reducciones, baja después a los punteros crudos y los spans, y termina con el render de mandelbrot que hizo famoso al lenguaje.
Mojo en tiempo de compilación
- Constantes de tiempo de compilaciónLas vinculaciones
comptimese pliegan antes de que el programa corra: costo cero. - Funciones paramétricasLos corchetes toman parámetros de compilación; los paréntesis, argumentos de ejecución.
- Structs paramétricosUn parámetro de struct fija un tamaño en compilación, y así no sobrevive ningún chequeo.
- Expresiones de tiempo de compilaciónUna función común corre en compilación cuando su resultado alimenta una vinculación
comptime. - Ramificar en tiempo de compilación
comptime ifycomptime forlos resuelve el compilador, sin dejar ninguna rama atrás.
SIMD
- Vectores SIMD
SIMDes un vector de ancho fijo que cae directo sobre un registro del hardware. - Aritmética SIMDLa aritmética sobre
SIMDtoca todos los carriles a la vez, en una sola instrucción. - Reducciones SIMDLas reducciones colapsan un vector entero a un solo escalar en pasos de profundidad logarítmica.
- Máscaras SIMDComparar da una máscara por carril, y
selectla usa para mezclar dos vectores. - El cast de los carriles SIMD
castconvierte cada carril a otroDTypesin salir del vector. - Difundir un escalarDarle un solo valor al constructor de
SIMDlo difunde a todos los carriles.
Números y tiempo
- Funciones matemáticas
std.mathtrae las funciones escalares de siempre y las aplica carril por carril aSIMD. - Números aleatoriosSembrar primero hace reproducible una corrida aleatoria, que es lo que pide un benchmark.
- Cronometrar un bucle
perf_counter_nsencierra un bloque de trabajo para medir cuánto tardó de verdad. - Operaciones bit a bitLos desplazamientos y las máscaras son como se manejan banderas, hashes y formatos empacados.
- Float32 frente a Float64Los floats más angostos son más rápidos y más chicos, pero cargan menos dígitos.
Memoria
- Punteros inseguros
allocdevuelve memoria cruda que indexas directo y que tienes que liberar tú. - Aritmética de punterosSumarle a un puntero lo mueve por elementos completos, nunca por bytes.
- Capacidad de una listaUn
Listduplica su buffer al crecer, y por eso los append salen baratos. - Vistas con SpanUn
Spantoma prestada una ventana sobre una lista, sin copiar nada de ella.
Bis
- Mandelbrot en ASCIILa demo por la que se conoce a Mojo: render por tiempo de escape, cuatro columnas a la vez.
- Criba de primos cronometradaUna criba de Eratóstenes con un cronómetro de nanosegundos alrededor.