Eskiueskiu v0.7.0

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.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, output operands, and clobber lists - 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)