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
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).
eskiu