eskiuv0.12.0
Proyectos

Hecho con Eskiu

Programas que ya corren: los módulos de renderizado y el AR web de ReactVision en producción, un modelo de lenguaje en la GPU, un visor de modelos 3D y el mismo compilador. En Labs están los experimentos, como un demo de realidad aumentada en una consola portátil.

ReactVision

ReactVision desarrolla ViroCore, el motor nativo de renderizado de AR/VR detrás de @reactvision/react-viro en iOS, Android, Meta Quest y visionOS. El equipo reemplaza componentes de C++ sensibles a la memoria con módulos en Eskiu que se enlazan por la ABI de C, un módulo a la vez, sin tocar el resto del motor. Los módulos de renderizado que ya se migraron usan alrededor de 85% menos memoria.

El núcleo de detección de objetos de react-viro-onnx, que estaba escrito dos veces en Objective-C++ y Java, ahora es un solo módulo de Eskiu para las dos plataformas en producción, con su capa JNI de Android escrita en Eskiu con el paquete jni.

Lee el caso de estudio de ReactVision →

tinyvio: tracking de AR en el navegador

tinyvio es el tracker visual-inercial detrás del AR web de ViroReact: esquinas, flujo óptico, cálculo de pose, bundle adjustment, planos y anclas, compilado a WebAssembly. Todo su motor, unas 9,000 líneas de C++, se portó a unas 7,400 líneas de Eskiu que implementan la misma API de C, y el motor en Eskiu es el que está en producción. Calcula los mismos bits que el C++, cuadro por cuadro, a la misma velocidad:

DóndeContra el C++
macOSidéntico
WebAssemblyidéntico, e idéntico al nativo
Simulador de iOSidéntico
Emulador de Androididéntico

Su núcleo de visión por computadora también es un paquete de Eskiu, vision, comparado bit por bit con el C++ de tinyvio en cada commit.

Cómo se verificó →

Llama 2 sobre Metal

examples/llama2.esk, en el paquete gpu, hace inferencia de Llama 2 siguiendo el llama2.c de Andrej Karpathy. Lee checkpoints de llama2.c, archivos GGUF de llama (Q4_0 y Q8_0 corren cuantizados en la GPU) y directorios de modelos de Hugging Face con safetensors, y corre en la GPU con WebGPU, que en una Mac es Metal:

eskiuc build && ./build/llama2 llama-2-7b.Q4_0.gguf -t 0 -i "The capital of France is"
ModeloEskiuReferencia
stories110M (llama2.c, f16)350 tokens/sllama2.c en el CPU: 22 tokens/s
TinyLlama 1.1B Q4_0 (GGUF)178 tokens/sllama.cpp (Metal): 260 tokens/s
Llama 2 7B Q4_0 (GGUF)45 tokens/sllama.cpp (Metal): 58 tokens/s

Medido en un Apple M4 Pro con decodificación greedy. En los prompts que se probaron, la salida coincide byte por byte con la de llama2.c, y token por token con la de llama.cpp y la de Hugging Face transformers. El forward pass es un programa de operaciones de <gpu/nn> que se graba una vez y se repite como un solo compute pass por token.

El mismo paquete entrena redes: examples/mnist.esk entrena con <gpu/train> una red de dos capas sobre MNIST hasta 97% de precisión en tres épocas, y guarda los pesos como safetensors, que PyTorch carga con la misma precisión.

Un visor de glTF y OBJ con PBR

El modelo glTF DamagedHelmet dibujado por el paquete gpu
DamagedHelmet de theblueturtle_, CC BY 4.0

examples/model.esk, en el paquete gpu, abre archivos glTF 2.0 (.gltf y .glb) y OBJ de Wavefront en una ventana: arrastras para girar alrededor del modelo, con la rueda haces zoom y la barra espaciadora pausa la animación. <gpu/model> sombrea con el modelo metallic-roughness de glTF bajo una luz direccional y un término de luz ambiental hemisférica, con normal maps, modos de alpha, skinning y animación. El mismo código corre sobre Metal, Vulkan y DirectX 12.

github.com/eskiu-lang/gpu →

El compilador, escrito en Eskiu

Eskiu tiene dos implementaciones de su compilador. El eskiuc que se publica está escrito en C++ y enlaza LLVM. La segunda, en selfhost/, está escrita en Eskiu: cubre el mismo pipeline y la misma línea de comandos, escribe el IR de LLVM como texto y llama a clang para ensamblarlo y enlazarlo. CMake la compila como eskiuc-esk, y el CI revisa que los dos compiladores coincidan en cada programa ejecutable de las pruebas.

preprocessor → lexer → parser → sema → async lowering → codegen (LLVM IR text) → clang

También se revisa contra sí mismo. El eskiuc de C++ compila cc0, cc0 compila cc1 y cc1 compila cc2; el bootstrap llega a un punto fijo cuando cc1 y cc2 generan el mismo IR para el código fuente del compilador.

Cómo se verifica el self-hosting →

Labs

Experimentos para ver hasta dónde llega Eskiu. Funcionan, y no son productos.

Un demo de realidad aumentada en la Nintendo 3DS

Una New Nintendo 3DS con el demo: un modelo 3D low-poly sobre la imagen en vivo de la cámara en la pantalla de arriba, con controles y diagnósticos en la de abajo.
El demo en una New Nintendo 3DS.

Un demo de realidad aumentada con cámara y giroscopio mantiene un modelo 3D fijo sobre la imagen en vivo de la cámara. Su lógica está escrita en Eskiu y compilada para el ARM11 de 32 bits de la consola, y el renderizado pasa por ViroCore sobre citro3d. Se probó en una 3DS real.

Lee el caso de estudio de la 3DS →

Empieza en un minuto.

Instala el compilador con un comando, o corre un programa en el navegador primero.