eskiuv0.9.2
Documentation

Changelog

All notable changes to Eskiu are documented in this file.

The format is based on Keep a Changelog. Versions follow MAJOR.MINOR.PATCH-stage (e.g. 0.0.9-alpha).


[0.9.2] - 2026-09-29

A full-project audit (codegen, type checker, self-host parity, stdlib, front end, driver and docs) found about a hundred latent bugs that the existing corpus did not reach. All are fixed lockstep in the C++ and self-hosted compilers unless noted, each with a regression test. A second pass added three fuzzers (a C oracle, a negative corpus and an ASan fuzzer for the stdlib parsers), which found about twenty more, and resolved the two known limitations left from 0.9.1 (R and S). Seven more blind audit rounds followed, each on a frozen tree and each fixed the same way, for about 500 fixes in total. The last rounds concentrated on the C ABI, generics, volatile and the HTTP servers under hostile input. What is still open is listed under Known issues.

Added

Changed (may reject or change the behavior of existing programs)

Deprecated

Fixed

Miscompiles of valid code

Type checker

Front end, driver and tooling

Standard library: memory safety

Standard library: logic

Second audit round

Third audit round

Fourth audit round

Fifth audit round

Sixth audit round

Seventh audit round

Eighth audit round

Final additions

Known issues

These are open in 0.9.2. None of them miscompiles a valid program.

[0.9.1] - 2026-09-09

Fixed

A correctness campaign (a multi-front bug hunt) closed a set of latent miscompiles and type-rule gaps. All are fixed lockstep in the C++ and self-hosted compilers unless noted.

[0.9.0] - 2026-09-08

Added

Fixed

[0.8.0] - 2026-08-21

Fixed

Added

Changed

[0.7.0]

Added

Fixed


[0.6.2]

Added

Fixed


[0.6.1]

Added

Fixed

Changed

[0.6.0]

Added

Fixed


[0.5.0]

Fills a set of basic C constructs the language was missing, so idiomatic C ports compile without workarounds. Each lands in lockstep across the C++ and self-hosted compilers and follows C semantics.

Added

Fixed


[0.4.0]

A correctness and type-strictness release. A four-front bug hunt (behavioral differential, sema soundness, synthesized-default audit, feature edges) across the C++ and self-hosted compilers found a batch of miscompiles, crashes, and soundness holes; this release fixes them and tightens the type system. The shipped (C++) compiler carries every fix below; the self-hosted compiler's matching sema checks are tracked for the promotion track.

Fixed

Changed


[0.3.1]

Fixed

Changed


[0.3.0]

The self-hosting milestone: the whole compiler (lexer, preprocessor, parser, semantic analyzer, and code generator) is reimplemented in Eskiu (selfhost/), reaches a 3-stage bootstrap fixpoint, and the self-hosted codegen is feature-complete against the C++ corpus (a full feature sweep is clean). All parity/self-host/bootstrap gates are CI-wired.

Fixed

Added


[0.2.5]

Added

Hardening

Fixed


[0.2.4]

Type unification: making the type checker the single resolver, so codegen stops re-deriving types independently (closing the two-evaluator risk). Internal soundness work; the only user-visible effect is three latent miscompiles it surfaced and fixed.

Single type resolver (kills codegen's independent re-derivation)


[0.2.3]

Completing bounded generics, plus a typed internal type representation that replaces ad-hoc type-string surgery: the foundation for keeping the compiler sound as it grows.

Bounded generics: primitives can satisfy a constraint

Typed Type representation (soundness foundation, no behavior change)


[0.2.2]

Exclusively hardening + traits, no new stdlib surface. The goal: make the compiler trustworthy and close the generics gap before the self-hosting arc.

Compiler hardening

Traits / constraints (bounded generics)

Hardening + maintainability (0.2.2 re-cut, no behavior change)


[0.2.1]

Hardening and ergonomics, shaken out by building a real service (an INE-QR HTTP API) on 0.2.0.

Compiler

Standard library


[0.2.0]

Backend-services phase: async/await, the full HTTP/2 stack (framing, HPACK with Huffman, streams and flow control, a multiplexed server, and TLS/ALPN), sum types with match, and a broad async/networking standard library, built on the v0.1.0 systems foundation.

Language

Compiler fixes

Standard library

Tooling

Documentation

Compiler correctness (consistency audit)


[0.1.0]

Eskiu is a systems language built to replace the C + Go + C++ + Python stack that compute-intensive backend services typically require. C-style syntax, structural interfaces, monomorphic templates, and explicit memory, compiled to native via LLVM with no garbage collector and no runtime.

This is the first release. It includes everything needed to write real backend services and bare-metal systems code, validated against a cryptographic pipeline running at 74 ms on arm64 (2.5× faster than the reference C implementation) and a bare-metal ARM64 kernel booting in QEMU without libc.

Closures and threads

int base = 10;
let add: fn(int)->int = int(int x) { return x + base; };  // captures base

*void t = thread_create(void() { printf("hello\n"); });
thread_join(t);

Exception handling

try {
    throw "division by zero";
} catch (string e) {
    printf("caught: %s\n", e);
} finally {
    printf("cleanup\n");
}

Language completeness

Forward declarations and declaration order

Compound assignment

Template ergonomics

Iteration, error propagation, and richer strings

Compiler robustness and fixes

One-step linking

Enums, type aliases, bitfields, and the preprocessor

Tooling

Standard library

Networking-enabling language features

Release


Systems milestone

Bare-metal ARM64 kernel written in Eskiu boots in QEMU (-M virt) and prints to serial without libc or a C runtime.

[0.0.14-alpha]

Added

Inline assembly - asm("cli");: simple form; passes the string verbatim to the assembler with no inputs, outputs, or clobbers - asm("outb %0, %1" :: "a"(val), "Nd"(port) : "memory");: extended form with GCC-compatible constraint syntax; supports input operands and clobber lists (no output operands) - Lowers to LLVM inline asm nodes; "memory" clobber emits a compiler barrier

Freestanding mode - --freestanding CLI flag: redirects alloc to call esk_alloc and free to call esk_free instead of the libc malloc/free - User provides both symbols in their kernel or bare-metal runtime; the compiler emits declare stubs and the linker resolves them

volatile qualifier - volatile let reg: *uint8 = (uint8*) ADDR;: marks all LLVM loads and stores through the pointer as volatile, preventing the optimiser from caching, reordering, or eliminating MMIO accesses

Cross-compilation - --target TRIPLE CLI flag: sets the LLVM target triple for the output object file - Both AArch64 and X86 LLVM backends are included in the Eskiu build - eskiuc file.esk --target x86_64-pc-linux-gnu produces an ELF x86-64 object file

v0.1 prerequisites complete - All compiler prerequisites for the kernel-on-QEMU milestone are implemented and tested

[0.0.13-alpha]

Fixed


[0.0.12-alpha]

Added

Lambdas and function pointer types - fn(T,...)->R function pointer type syntax: first-class function types usable in variable declarations, struct fields, and parameter lists - Anonymous function expressions: int(int x) { return x * 2; }, C-like syntax producing a function pointer value - Lambda variables: let double_it: fn(int)->int = int(int x) { return x * 2; }; - Higher-order functions: lambdas can be passed as arguments to functions expecting fn(...) parameters - LambdaExpr AST node; full visitor chain (parser, type checker, codegen, AST printer) - Codegen: each lambda expression is lowered to a uniquely-named private llvm::Function; the expression value is the function pointer

VS Code extension: real-time diagnostics, hover, and go-to-definition - --hover-at LINE:COL CLI flag: prints the inferred Eskiu type of the expression at the given source position; consumed by the VS Code extension for hover tooltips - --definition-at LINE:COL CLI flag: prints the file:line:col of the definition of the symbol at the given position; consumed for go-to-definition - VS Code extension (editor/vscode/) upgraded from syntax-only to a full language client: spawns eskiuc --test-typechecker on save for real-time error squiggles; hover provider calls --hover-at; definition provider calls --definition-at - TextMate grammar already present from v0.0.11 provides syntax highlighting

switch/case type checking - The type checker now validates that each case value is compatible with the switch subject expression type; mismatched case types are reported as errors at the case token position

[0.0.11-alpha]

Added

Decoder rewritten in Eskiu (no C pipeline code) - ine_decoder/crypto.esk (541 lines): AES-256-CBC + RSA-8192 pipeline, hex/base64 decoders, PKCS#1 stripper, 6-bit decoder, WebP reconstruction, run_no_so_pipeline(); all in Eskiu calling OpenSSL via extern - ine_decoder/output.esk (186 lines): Spanish character table, field splitter, growable JSON buffer, decode_to_buffers(); pure Eskiu - ine_decoder/crypto.c and output_decode.c removed: replaced entirely by Eskiu - Only C remaining: qr_extract.c shim (12 lines) + qr_extract_impl.cpp (CoreGraphics + zxing-cpp) - Runtime: 80ms on arm64, identical output to reference

String literal adjacent concatenation - "abc" "def" on consecutive lines (or the same line) are now concatenated into a single string at parse time; enables readable multi-line constant definitions

Fixed (compiler bugs found during Eskiu crypto port)


[0.0.10-alpha]

Added

Global variables - VarDecl at module scope now emits llvm::GlobalVariable instead of alloca - Constant initializers folded at compile time: int, float, double, bool, char, string, null - Non-constant initializers zero-initialize the global (assign in main() for complex expressions) - globalVarTypes map tracks Eskiu type strings for globals (complement to function-scoped varTypeStack) - evaluateConstantExpr(): folds literal expressions to llvm::Constant* - visit(IdentExpr*) now loads from llvm::GlobalVariable as well as AllocaInst - IMAGE_PATH, OUT_JSON, OUT_WEBP in ine_decoder/main.esk moved to module scope

sret (large struct return) - needsSret(type): returns true for aggregates > 16 bytes (arm64 register limit) - visit(FunctionDecl*) rewrites large-return functions: prepends hidden ptr sret.ptr parameter, changes return type to void, tracks struct type in funcSretTypes - visit(ReturnStmt*) stores result to currentSretParam and emits ret void for sret functions - Call sites (regular + template): alloca sret buffer, prepend as arg 0, call, load result - currentSretParam saved/restored across template instantiation

Integer argument widening at call sites - Automatically SExt/Trunc integer arguments to match function parameter widths - Fixes i32 1712 passed to int64 param (was LLVM verification error)

Fixed

Planned


[0.0.9-alpha]

Added

Fixed


[0.0.8-alpha]

Added

Fixed


[0.0.7-alpha]

Added

Fixed


[0.0.6-alpha]

Added

Fixed


[0.0.5-alpha]

Added

Fixed


[0.0.4-alpha]

Added

Fixed


[0.0.3-alpha]

Added

Fixed


[0.0.2-alpha]

Added

Fixed


[0.0.1-alpha]

Added

Fixed

Known limitations (resolved in later releases)