A systems programming language for explicit native software.
Direct control, predictable code generation, and practical interoperability from hosted applications to freestanding systems.
Website · Documentation · Releases · Community · Sponsor
Wave is built for software where the machine matters. It combines familiar structured programming with explicit low-level facilities and native target control.
- Native by design. Compile to executables, objects, assembly, LLVM IR, or bitcode.
- Low-level when needed. Use pointers, C ABI boundaries, inline assembly, and freestanding targets when system contracts must stay visible.
- Structured language features. Build with functions, generics, structs, enums,
proto, arrays, and explicit mutable or immutable bindings. - Cross-target compilation. Generate code for x86-64, AArch64, and RISC-V 64 from supported compiler hosts.
- Tool-friendly interfaces. Query targets and compiler capabilities in human-readable or JSON form for build tools and editors.
Wave is under active pre-beta development. Syntax and toolchain contracts are being stabilized and may still change between releases.
fun main() {
let language: str = "Wave";
var count: i32 = 1;
println("Hello from {} #{}", language, count);
}
Save this as main.wave, then run it directly:
wavec run main.waveLinux and macOS:
curl -fsSL https://wave-lang.dev/install.sh | bash -s -- latestWindows PowerShell:
irm https://wave-lang.dev/install.ps1 -OutFile install.ps1
powershell -ExecutionPolicy Bypass -File .\install.ps1 -LatestSee the installation guide for platform requirements and release selection.
# Check without producing a binary.
wavec check main.wave
# Build and run.
wavec run main.wave -- arg1 arg2
# Build an optimized hosted executable.
wavec -O2 build main.wave -o app
# Emit a freestanding RISC-V object.
wavec --target=riscv64-unknown-none-elf build kernel.wave --freestanding --emit=objThe compiler exposes its current capabilities instead of requiring tools to maintain hard-coded lists:
wavec print supported-targets
wavec print supported-input-types
wavec print supported-emit-kinds
wavec print target-spec --target riscv64-unknown-linux-gnu --format=jsonRun wavec --help for the complete CLI contract.
| Architecture | Hosted targets | Freestanding target |
|---|---|---|
| x86-64 | Linux GNU, macOS, Windows GNU | x86_64-unknown-none-elf |
| AArch64 | Linux GNU, macOS | aarch64-unknown-none-elf |
| RISC-V 64 | Linux GNU | riscv64-unknown-none-elf |
Hosted cross-linking requires a compatible linker, system libraries, and sysroot for the selected target. Freestanding builds omit the default hosted runtime assumptions and are intended for kernels, firmware, boot code, and other no-OS environments.
Follow the Wave development setup, then build with the locked dependency graph:
git clone https://github.com/wavefnd/Wave.git
cd Wave
cargo build --lockedThe development compiler is written to target/debug/wavec. Before submitting compiler changes, run:
cargo fmt --all --check
cargo test --locked --all-targets
cargo clippy --locked --all-targets -- -D warnings
python3 tools/run_tests.py| Project | Role |
|---|---|
| Wave | Language frontend, compiler driver, LLVM backend, and standard library source |
| Vex | Manifest-based package manager and build tool |
| Whale | Native assembler, object tooling, and linker under development |
Useful project references:
Contributions are welcome through GitHub pull requests and email patches. Read CONTRIBUTING.md before submitting changes; all commits require a DCO Signed-off-by line.
- The compiler and repository components outside
std/are licensed under the Mozilla Public License 2.0. - The standard library in
std/is licensed separately under the Apache License 2.0, allowing modification, redistribution, and embedding under that license.
Wave is developed in public with support from individuals and organizations. You can contribute monthly or once through OpenCollective.
Thank you to everyone who contributes code, documentation, testing, funding, or time to Wave.