eskiuv0.12.0
Paquetes

Paquetes oficiales

Bibliotecas de la organización eskiu-lang en GitHub. Cada una es un repositorio de git con un eskiu.toml, y se agrega a un proyecto con un solo comando.

Cómo usar un paquete

eskiuc add escribe la dependencia en eskiu.toml, la descarga con git y guarda su commit en eskiu.lock, así que los builds siguientes la reutilizan sin tocar la red. No hay un registro central: una dependencia es una URL de git con un rev (un tag, una rama o un commit) o una ruta local.

eskiuc new myapp
cd myapp
eskiuc add compress --git https://github.com/eskiu-lang/compress --rev v0.1.0
eskiuc run

Los módulos de un paquete se importan con el nombre del paquete y el del archivo, por ejemplo import <gpu/model>;. El capítulo 13 del libro explica los manifiestos, el lock y eskiuc test.

gpu

Cómputo en GPU, renderizado, modelos 3D y machine learning para Eskiu, sobre WebGPU.

Una sola API corre sobre Metal (macOS), Vulkan (Linux) y DirectX 12 (Windows) a través de wgpu-native, con shaders en WGSL. Dibuja modelos glTF y OBJ con sombreado físico (PBR), corre modelos Llama desde archivos GGUF o safetensors (Llama 2 7B Q4_0 a 45 tokens por segundo en un M4 Pro; llama.cpp da 58 en la misma máquina) y entrena redes pequeñas (97% de precisión en MNIST).

El primer build descarga wgpu-native 29 por ti. Las ventanas (el módulo <gpu/window>) también necesitan SDL3 del sistema: brew install sdl3 en macOS, y compilar con -L/opt/homebrew/lib.

Instalación

eskiuc add gpu --git https://github.com/eskiu-lang/gpu --rev v0.1.0
eskiuc build
Ejemplo del README
Gltf data = model_load("helmet.glb")?;   // or a .gltf, or an .obj
defer data.free();
GpuModel model = gpu.model(&data, surface.format)?;
defer model.release();

// every frame
data.animate(0, seconds);
model.update(mat4_identity());
GpuCamera cam = model.camera(aspect);
GpuPass pass = gpu.pass(frame.view, GpuColor{0.1, 0.1, 0.1, 1.0}, &depth);
model.draw(&pass, &cam);
pass.end()?;

onnx

Inferencia de modelos ONNX para Eskiu, sobre ONNX Runtime.

Un modelo exportado desde PyTorch, TensorFlow o scikit-learn corre en el CPU en cualquier sistema, y en CoreML, CUDA, DirectML o WebGPU cuando el build de ONNX Runtime los trae. Un nombre, tipo o shape de entrada equivocado regresa como mensaje de error.

Nada que instalar: el primer build descarga ONNX Runtime 1.31 (macOS arm64, Linux y Windows).

Instalación

eskiuc add onnx --git https://github.com/eskiu-lang/onnx --rev v0.1.0
eskiuc build
Ejemplo del README
import <io>;
import <onnx>;

Result<int, string> run() {
    OnnxSession s = onnx_session("model.onnx", null)?;
    defer s.release();
    float[4] x = {1.0, -2.0, 0.5, 3.0};
    int64[2] shape = {1, 4};
    OnnxTensor input = onnx_tensor_f32(&x[0], &shape[0], 2)?;
    defer input.release();
    OnnxTensor y = s.run1(&input)?;
    defer y.release();
    *float out = y.f32();
    for (i in 0..y.len()) printf("%f\n", (double)out[i]);
    return Ok<int, string>(0);
}

Result<int, string> r = run();
if (!r.ok) printf("error: %s\n", r.error);

tflite

Inferencia de modelos de TensorFlow Lite para Eskiu.

Un modelo .tflite convertido desde TensorFlow, Keras, JAX o PyTorch corre en el CPU con XNNPACK, y en la GPU con el delegado de Metal (macOS) o el de OpenCL/OpenGL (Linux). Las entradas y salidas cuantizadas se convierten solas.

Nada que instalar en macOS y Linux: el primer build descarga libtensorflowlite_c 2.21, que Google no publica para escritorio. En Windows lo baja el script tools/get_tflite.sh del paquete.

Instalación

eskiuc add tflite --git https://github.com/eskiu-lang/tflite --rev v0.1.0
eskiuc build
Ejemplo del README
import <io>;
import <tflite>;

Result<int, string> run() {
    TfliteInterpreter it = tflite_load("model.tflite", null)?;
    defer it.release();
    float[4] x = {1.0, -2.0, 0.5, 3.0};
    int[2] shape = {1, 4};
    it.set_f32(0, &x[0], &shape[0], 2)?;
    it.invoke()?;
    *TfliteTensor y = it.output(0);
    *float out = y.f32();
    for (i in 0..y.len()) printf("%f\n", (double)out[i]);
    return Ok<int, string>(0);
}

Result<int, string> r = run();
if (!r.ok) printf("error: %s\n", r.error);

compress

zlib, gzip, DEFLATE crudo y archivos ZIP para Eskiu, escrito en Eskiu.

DEFLATE en niveles del 0 al 9, zlib y gzip en los dos sentidos, y archivos ZIP con ZIP64. Cada lectura revisa sus límites y la salida tiene un tope de tamaño, así que un archivo chico no puede inflarse hasta llenar la memoria.

No hay que instalar nada: no usa zlib ni código en C.

Instalación

eskiuc add compress --git https://github.com/eskiu-lang/compress --rev v0.1.0
Ejemplo del README
ZipReader z = ZipReader_open("pack.zip")?;
defer z.close();
for (i in 0..z.count()) {
    ZipEntry* e = z.entry(i);
    printf("%10llu  %s\n", e.size, e.name.data);
}
Bytes readme = z.read_name("docs/readme.txt")?;
defer readme.free();
z.extract_all("out")?;

audio

Sonido para Eskiu: archivos WAV, un mezclador y salida con SDL3.

Lee archivos WAV en todas las codificaciones comunes (PCM, float, ADPCM de IMA y de Microsoft) igual que los decodifica ffmpeg, mezcla todas las voces que quieras con volumen, paneo, tono y loops, y manda la mezcla a la salida de audio predeterminada.

<audio/wav> y <audio/mixer> son Eskiu puro; <audio/device> necesita SDL3 (brew install sdl3 en macOS).

Instalación

eskiuc add audio --git https://github.com/eskiu-lang/audio --rev v0.1.0
eskiuc build -L/opt/homebrew/lib
Ejemplo del README
import <time>;
import <audio>;

Result<int, string> run() {
    Sound jump = wav_load("jump.wav")?;
    defer jump.free();
    AudioDevice out = audio_open(48000)?;
    defer out.close();
    Mixer mixer = mixer_new(out.rate);
    defer mixer.free();
    uint32 voice = mixer.play(&jump, AudioPlay{volume: 0.8, pan: -0.25});
    while (mixer.playing(voice)) {
        out.pump(&mixer, 50)?;      // keeps 50 ms of audio queued
        time_sleep_ms(10);
    }
    return Ok<int, string>(0);
}

font

Fuentes TrueType para Eskiu: contornos de glifos, renderizado con antialiasing, acomodo de texto y atlas.

Lee archivos .ttf, convierte los glifos en bitmaps de cobertura con antialiasing, acomoda líneas de texto UTF-8 con kerning y empaca un conjunto de caracteres en una sola textura para dibujar texto en la GPU.

No hay que instalar nada.

Instalación

eskiuc add font --git https://github.com/eskiu-lang/font --rev v0.1.0
Ejemplo del README
import <font>;

Result<int, string> run(*uint8 rgba, int width, int height) {
    Font f = font_load("DejaVuSans.ttf")?;
    defer f.free();
    f.draw("Hola, Eskiu", 32.0, rgba, width, height, 10.0, 40.0, 0xFFFFFFFF);

    GlyphBitmap g = f.render(f.glyph('g'), 64.0)?;   // one glyph
    defer g.free();
    // g.pixels: g.width * g.height coverage values, 0 to 255, top row first;
    // g.left and g.top place it from the pen on the baseline.
    return Ok<int, string>(0);
}

jni

Métodos nativos para Android y la JVM, escritos en Eskiu.

Un método nativo de una clase de Java o Kotlin es una función de Eskiu con el nombre de JNI, sin pegamento en C: los strings cruzan como UTF-8 de verdad, las búsquedas regresan como Result y toda la tabla de JNIEnv está debajo. Corre en Android y en las JVM de escritorio de macOS, Linux y Windows.

No hay que instalar nada: la VM le pasa sus tablas a la biblioteca.

Instalación

eskiuc add jni --git https://github.com/eskiu-lang/jni --rev v0.1.0
eskiuc build --target aarch64-linux-android24 -o libhello.so
Ejemplo del README
import <string>;
import <jni>;

// package com.example.hello; class Greeter { static native String greet(String name); }
*void Java_com_example_hello_Greeter_greet(*void env, *void cls, *void name) {
    JniEnv e = jni_env(env);
    String who;
    defer String_free(&who);
    e.string(name, &who);
    String out;
    defer String_free(&out);
    String_appendf(&out, "Hello, %s, from Eskiu", who.data);
    return e.new_string(out.data);
}

nds

Formatos de archivo de la Nintendo DS para Eskiu: ROMs, archivos NARC, sonido, gráficos 2D y texturas 3D.

Sistemas de archivos y overlays de ROMs, archivos NARC, compresión LZ, sonido SDAT con un sintetizador del driver de sonido de la DS, gráficos 2D y texturas 3D, todo en Eskiu puro. Se portó de las herramientas y el motor de Tallgrass y se comparó contra ellos.

No hay que instalar nada.

Instalación

eskiuc add nds --git https://github.com/eskiu-lang/nds --rev v0.1.0
Ejemplo del README
NdsRom rom = NdsRom_open("game.nds")?;
defer rom.close();
printf("%s (%s), %d files\n", rom.title, rom.code, rom.count());
Narc n = rom.narc("a/0/0/4")?;            // views into the ROM
defer n.close();
Bytes f = nds_unpack(n.file(12).data, n.file(12).len)?;   // LZ data decompressed
Bytes ov = rom.overlay(12)?;              // decompressed when compressed

vision

privado por ahora

Esquinas, flujo óptico, geometría multivista y planos, en Eskiu puro. Sale de tinyvio, el tracker detrás del AR web de ViroReact, y calcula los mismos bits que su C++. El repositorio es privado por ahora. Qué hace y cómo se verificó →

Todos los paquetes necesitan Eskiu 0.12 o más nuevo. En el README de cada uno están la lista completa de módulos, más ejemplos y los detalles para cada sistema operativo (en inglés).

Empieza en un minuto.

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