Eskiueskiu v0.7.0

eskiu

un lenguaje de sistemas que se compila a sí mismo

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. Se compila a sí mismo desde la v0.3.0.

Mascota de Eskiu

1.Vista general

Eskiu compila con LLVM a un binario nativo independiente. No trae recolector de basura ni un runtime administrado, así que lo único que despliegas es ese binario. 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, async/await, canales, atómicos y una biblioteca estándar de HTTP/2. El compilador está escrito en el propio Eskiu.

hello.esk

extern int printf(string fmt, ...);

int add(int a, int b) {
    return a + b;
}

int main() {
    printf("Hello from Eskiu!\n");
    printf("2 + 3 = %d\n", add(2, 3));
    return 0;
}
$ eskiuc run hello.esk
Hello from Eskiu!
2 + 3 = 5

2.Tipos y matching

Los tipos suma (enum) llevan datos en cada variante, y el match se verifica por exhaustividad en tiempo de compilación: el compilador rechaza un match al que se le olvida un caso.

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");
}

3.Genéricos

Las funciones y los tipos se parametrizan por tipo, con restricciones de interfaz. Una restricción como <T: Ord> obliga a que T implemente la interfaz, así que las llamadas se verifican y se monomorfizan en tiempo de compilación.

max.esk

interface Ord { int cmp(Ord* o); }

struct Coin {
    int value;
    int cmp(Coin* o) { if (self.value < o.value) { return -1; } return 1; }
}

T max<T: Ord>(T* a, T* b) {
    if (a.cmp(b) > 0) { return a[0]; }
    return b[0];
}

let hi: Coin = max<Coin>(&x, &y);   // hi.value == 7

4.Concurrencia

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.

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

5.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.

6.En producción

Eskiu ya se usa para reemplazar código nativo sensible a la memoria y pipelines criptográficos en software que ya está en producción, y para llegar a hardware que un lenguaje de sistemas joven rara vez toca.

ProyectoResultadoDetalle
ReactVision ≈85% menos memoria Módulos de renderizado AR/VR migrados desde C++, preservando la interoperabilidad con el ABI de C. caso de estudio
INE decoder 2.5× más rápido que C Pipeline de QR de credencial (AES-256 + RSA-8192), idéntico bit a bit a otras cinco implementaciones. 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.

7.Instalación

Descarga un binario precompilado, descomprímelo en /usr/local y ejecuta eskiuc --version.

Windows es experimental: el compilador corre y emite objetos; el linking end-to-end, las excepciones y la red aún se están portando en 0.7.x.

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