Eskiueskiu v0.8.0

eskiu

a self-hosting systems language · a ReactVision project

Eskiu is a statically typed, compiled systems language with the power of C (explicit memory, direct C interop, native output via LLVM) and the immediacy of a scripting language: eskiuc run file.esk compiles and executes in one step. It already runs in shipping software, from ReactVision's ViroReact renderer to a Nintendo 3DS, and builds the same on Linux, macOS, and Windows. Self-hosting since v0.3.0.

Eskiu mascot

1.In production

Eskiu already runs in shipping software. It replaces memory-sensitive native code with no garbage collector, keeps a C ABI so it drops straight into an existing C or C++ codebase, and reaches hardware a young systems language rarely meets. The same source builds on Linux, macOS, and Windows, including the async networking stack. It is the systems language of ReactVision, and the first place it shipped is the family's own XR renderer.

ProjectResultDetail
ViroReact ≈85% less memory ReactVision's AR/VR renderer: rendering modules migrated from C++, preserving C ABI interop. case study
Nintendo 3DS on-device AR demo Camera-and-gyroscope AR rendered through ViroCore on citro3d, its logic in Eskiu on the ARM11. case study

Early adopters: ReactVision, The Morrow Digital.

2.The language

Eskiu compiles through LLVM to a standalone native binary, with no garbage collector or managed runtime. The surface syntax is C-style, so the basics are familiar; the semantics add sum types, generics with bounds, operator overloading, async/await, channels, and atomics. The compiler is written in Eskiu.

Sum types and exhaustive match

An enum carries data per variant, and match is checked for exhaustiveness at compile time, so a forgotten case fails to compile.

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

Generics and operators

Types are parameterised with interface bounds and monomorphised at compile time. A type can also overload operators as ordinary methods, resolved by operand type, so vector math reads like arithmetic and lowers to a direct call with no runtime cost.

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;   // + and * resolve to the overloads

Async and channels

async functions return a Future; await suspends until a value is ready. Typed channels (Chan<T>) move values between tasks. The reactor runs on kqueue, epoll, or WSAPoll, so the same code drives Linux, macOS, and 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.Toolchain

One binary, eskiuc, drives everything. eskiuc run compiles and executes in a step; eskiuc build emits a native binary. The stdlib is bundled, so imports resolve out of the box.

$ eskiuc run app.esk          # compile + run in one step
$ eskiuc build app.esk -o app  # emit a standalone native binary
$ eskiuc --version

Try it

Edit the program below and run it. The server compiles it with LLVM and runs it through the same eskiuc run.

main.eskeditor
outputstdout
Output appears here. Press Run (or ⌘/Ctrl + Enter).

sandboxed: no network, time- and memory-limited, output capped.

4.Install

On macOS or Linux, install the latest release with one command:

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

It downloads the prebuilt binary for your platform, verifies its checksum, and installs it. Or grab a binary directly and untar it into /usr/local:

Windows is validated end to end on a native CI runner: the compiler builds and links, and exceptions plus the blocking and async networking stacks all pass. It is not yet part of the release gate, so the Windows build tracks a little ahead of the Linux and macOS ones.

# or build from source
$ git clone https://github.com/doranteseduardo/eskiu
$ cd eskiu && make