Version: 0.1.0-alpha
Sterling is a low-level, strongly typed, systems programming language designed for performance, ABI stability, C interoperability, and full control over memory and hardware. It supports metaprogramming, hot-reloading, inline and raw assembly, and is built for multi-file compilation. It also introduces memory safety primitives and modern low-abstraction control flow enhancements.
.stg.sthEvery function must declare its linkage explicitly:
fn // globally visible, default linkage
fn_static // translation unit-local only
fn_inline // inline-only, no symbol emitted
fn_asm // raw assembly function, globally visible
fn_static_asm // raw assembly function, TU-local only
All functions must explicitly declare their return type. The only exception is void, which may be omitted for brevity when no return value is intended.
fn u32 add(u32 a, u32 b) {
return (a + b);
}
fn_extern i32 printf(const char* fmt, ...);
fn_inline u32 max(u32 a, u32 b) {
return ((a > b) ? a : b);
}
fn exit() {
// equivalent to fn void exit()
}
Write raw x86_64 assembly using fn_asm or fn_static_asm. Symbol, section, and global declaration are implicit.
fn_asm void* memset(void* dst, u8 value, u64 size) {
test rdx, rdx
je .done
mov rax, rsi
mov rdi, rdi
mov rcx, rdx
rep stosb
.done:
mov rax, rdi
ret
}
System calls are allowed via fn_asm or wrapped using concrete ABI-aware interfaces. Example:
fn_asm void exit() {
mov rax, 60 ; syscall: exit
mov rdi, 0 ; exit code
syscall
ret
}
Sterling supports explicitly sized, ABI-stable primitive types. Signed and unsigned integer types are defined as follows:
i8, i16, i32, i64 // signed integers
u8, u16, u32, u64 // unsigned integers
f32, f64 // 32-bit and 64-bit IEEE floats
bool // 1-byte boolean, 0 or 1 only
char // 1-byte character (UTF-8)
Pointer types:
T* // Pointer to type T
ptr* // Special pointer with implicit coercion allowed (e.g., for GC, reflective systems)
void* // Opaque pointer with explicit cast required
All types have explicitly defined size and alignment. Structs support default values and zero-initialization rules:
typedef struct {
u32 x = 5;
u32 y;
} vec2u;
vec2u a = {}; // x = 5, y = 0
vec2u b = {0}; // x = 0, y = 0
vec2u c; // x = 0, y = 0 (default zero-init)
To opt out of default zero-initialization:
@raw u32 raw_val; // uninitialized
Sterling uses explicit, manual memory management by default. All variables are zero-initialized unless explicitly marked with @raw. Heap allocation is done via standard system or custom allocators.
Alignment and packing are controllable per type (TBD syntax). All layout is predictable and optimized for cache behavior. There are no hidden fields, vtables, or RTTI overhead.
reg.rax, reg.cr3, etc.memory_fence_acquire(), memory_fence_release()fn_isr for IRQ, fn_trap for fault handlersfn_syscall with ABI-safe handlingfn_asm to write boot routines and context switches inlineoutb(port, val), inw(port), etc.CR0_PG, MSR_EFERembed_binary("boot.bin")TODO: Describe 'meta' keyword, templating, compile-time codegen, restrictions on type inference.
TODO: Specify ABI model (System V AMD64), calling convention details, struct/pointer representation rules.
TODO: Describe standard threading model, scheduler integration, context switching, green threads API.
TODO: Describe native rendering interface, GPU abstraction layer, and access to OpenGL/DirectX backends.
TODO: AOT compilation, linker behavior, multi-file project structure, module system (if any).