Eskiueskiu v0.8.0

eskiu

un lenguaje de sistemas que se compila a sí mismo · un proyecto de ReactVision

Eskiu es un lenguaje de sistemas compilado y con tipado estático. Te da el poder de C (memoria explícita, interoperabilidad directa con C, código nativo con LLVM) con la agilidad de un lenguaje de scripting: eskiuc run file.esk compila y ejecuta de una sola vez. Ya corre en software en producción, desde el renderer ViroReact de ReactVision hasta una Nintendo 3DS, y compila igual en Linux, macOS y Windows. Se compila a sí mismo desde la v0.3.0.

Mascota de Eskiu

1.En producción

Eskiu ya corre en software en producción. Reemplaza código nativo sensible a la memoria sin recolector de basura, mantiene un ABI de C para entrar directo en una base de código C o C++ existente, y llega a hardware que un lenguaje de sistemas joven rara vez toca. El mismo código compila en Linux, macOS y Windows, incluida la pila de red async. Es el lenguaje de sistemas de ReactVision, y el primer lugar donde se envió es el propio renderer XR de la familia.

ProyectoResultadoDetalle
ViroReact ≈85% menos memoria El renderer AR/VR de ReactVision: módulos de renderizado migrados desde C++, preservando la interoperabilidad con el ABI de C. caso de estudio
Nintendo 3DS en hardware demo de AR AR con cámara y giroscopio renderizada con ViroCore sobre citro3d, su lógica en Eskiu sobre el ARM11. caso de estudio

Ya lo usan: ReactVision, The Morrow Digital.

2.El lenguaje

Eskiu compila con LLVM a un binario nativo independiente, sin recolector de basura ni runtime administrado. La sintaxis es de estilo C, así que lo básico se siente familiar; a eso la semántica le suma tipos suma, genéricos con restricciones, sobrecarga de operadores, async/await, canales y atómicos. El compilador está escrito en el propio Eskiu.

Tipos suma y match exhaustivo

Un enum lleva datos por variante, y el match se verifica por exhaustividad en tiempo de compilación, así que un caso olvidado no compila.

parse_port.esk

enum ParseResult {
    Port(int),
    InvalidRange(int),
    NotANumber,
}

ParseResult parse_port(string s) {
    let n: int = atoi(s);
    if (n == 0) { return NotANumber; }
    if (n < 1 || n > 65535) { return InvalidRange(n); }
    return Port(n);
}

match parse_port("8080") {
    Port(p)         -> printf("listening on :%d\n", p);
    InvalidRange(n) -> printf("%d out of range\n", n);
    NotANumber      -> printf("not a number\n");
}

Genéricos y operadores

Los tipos se parametrizan con restricciones de interfaz y se monomorfizan en tiempo de compilación. Un tipo también puede sobrecargar operadores como métodos ordinarios, resueltos por el tipo de los operandos, así que la matemática de vectores se lee como aritmética y baja a una llamada directa sin costo en runtime.

vec.esk

struct V3 { float x; float y; float z; }

V3 operator +(V3 a, V3 b) {
    let r: V3;
    r.x = a.x + b.x;
    r.y = a.y + b.y;
    r.z = a.z + b.z;
    return r;
}

V3 operator *(V3 v, float s) {
    let r: V3;
    r.x = v.x * s;
    r.y = v.y * s;
    r.z = v.z * s;
    return r;
}

let mid: V3 = (a + b) * 0.5;   // + y * resuelven a las sobrecargas

Async y canales

Las funciones async devuelven un Future; await suspende la ejecución hasta que haya un valor listo. Los canales tipados (Chan<T>) pasan valores entre tareas. El reactor corre sobre kqueue, epoll o WSAPoll, así que el mismo código maneja Linux, macOS y Windows.

sum_squares.esk

import <future>;
import <channel>;

async int sum_squares(Chan<int>* ch) {
    let a: int = await chan_recv(ch);
    let b: int = await chan_recv(ch);
    let c: int = await chan_recv(ch);
    return a + b + c;
}

Chan<int>* ch = chan_new<int>(8);
for (i in 1..4) { chan_send(ch, i * i); }   // 1, 4, 9 -> 14

3.Herramientas

Un solo binario, eskiuc, se encarga de todo. eskiuc run compila y ejecuta de una vez; eskiuc build genera un binario nativo. La biblioteca estándar viene incluida, así que los imports funcionan sin configurar nada.

$ eskiuc run app.esk          # compila + ejecuta en un paso
$ eskiuc build app.esk -o app  # emite un binario nativo independiente
$ eskiuc --version

Pruébalo

Edita el programa de abajo y córrelo. El servidor lo compila con LLVM y lo ejecuta con el mismo eskiuc run.

main.eskeditor
salidastdout
La salida aparece aquí. Presiona Ejecutar (o ⌘/Ctrl + Enter).

aislado (sandbox): sin red, con límites de tiempo y memoria, salida acotada.

4.Instalación

En macOS o Linux, instala el último release con un comando:

$ curl -fsSL https://eskiu-lang.org/install.sh | sh

Descarga el binario para tu plataforma, verifica su checksum y lo instala. O baja un binario directamente y descomprímelo en /usr/local:

Windows está validado de punta a punta en un runner nativo de CI: el compilador compila y enlaza, y las excepciones junto con las pilas de red bloqueante y async pasan todas. Todavía no es parte del gate de releases, así que el build de Windows va un poco adelante de los de Linux y macOS.

# o compila desde el código fuente
$ git clone https://github.com/doranteseduardo/eskiu
$ cd eskiu && make