NURL

NURL

A compiled language without a virtual machine, garbage collector, or interpreter — designed as a target for LLM code generation, with deterministic builds and native LLVM performance.

99,373lines of NURL in the compiler
1,940compiler test programs
243stdlib modules
11tested targets
65registry packages
ContributorsHindurableiljasrb

WHY NURL

Built for generated code

NURL keeps generated code easy to parse. Fixed arity removes precedence ambiguity, short dependency windows limit context, and the grammar fits on one page.

Regular prefix-arity grammar

Every operator has a fixed arity. There is no infix syntax or precedence table.

Local semantics

A token’s meaning depends on a short span of preceding tokens.

Single-owner memory

Values auto-drop at scope exit. Borrow checking, an explicit unsafe/raw boundary, and a mechanized Lean 4 proof (formal/) guarantee memory safety.

Deterministic compiler

Bootstrap compiles the compiler twice and requires identical LLVM IR from both runs.

LLVM-backed

One LLVM pipeline targets desktops, servers, WebAssembly, RISC-V, and embedded systems.

Self-hosting

The compiler is written in NURL and builds itself from source.

SYNTAX

Prefix notation, end to end

NURL uses OP ARG1 ARG2 …. There is no operator precedence or infix syntax.

Add two integers

@ add i a i b → i { ^ + a b }

( add 3 4 )     // → 7

FizzBuzz

: ~ i i 1
~ <= i 100 {
    ? == 0 % i 15 { ( nurl_print `FizzBuzz\n` ) }
    ? == 0 % i 3  { ( nurl_print `Fizz\n` ) }
    ? == 0 % i 5  { ( nurl_print `Buzz\n` ) }
    { ( nurl_println_int i ) }
    = i + i 1
}

See the language reference for generics, traits, pattern matching, errors, channels, compile-time evaluation, and async runtime support.

BENCHMARKS

Measured runtime performance

25 verified benchmarks compare NURL with C, Rust, Node, and Python. Each implementation must produce the same output before timing.

5 languagesGitHub Actions ubuntu-latest runnerMeasured 2026-11-13Benchmark sources →CI run →
Benchmark runtime in milliseconds; lower is better.
BenchmarkNURLCRustNodePython
lcg20M-step 64-bit LCG + xorshift30 ms30 ms29 ms1,115 ms2,711 ms
packet_classifier25M unpredictable branches43 ms42 ms43 ms130 ms2,330 ms
ring_write20M ring-buffer stores31 ms30 ms31 ms52 ms3,404 ms
histogram_bins20M binned increments30 ms30 ms30 ms53 ms3,000 ms
prefix_scan1M 16-wide prefix scans17 ms17 ms17 ms48 ms2,231 ms
binary_search5M lower-bound searches16 ms16 ms16 ms70 ms3,653 ms
sort_window2M 8-element bubble sorts22 ms21 ms22 ms135 ms6,388 ms
bloom_filter4M Bloom-filter queries10 ms9.9 ms10 ms1,550 ms3,877 ms
hash_join5M hash-table probes18 ms18 ms20 ms1,865 ms4,079 ms
sieveSieve of Eratosthenes to 10M16 ms16 ms16 ms51 ms1,720 ms
fibRecursive fib(35)20 ms20 ms20 ms75 ms532 ms
collatzLongest Collatz chain below 100k12 ms13 ms13 ms43 ms404 ms
matmul256x256 integer matrix product27 ms26 ms27 ms64 ms1,934 ms
json_parse20 parses of a 64 KB document6.2 ms10 ms14 ms34 ms28 ms
nbody500k n-body integration steps22 ms35 ms23 ms74 ms1,682 ms
safe_record_array10M by-value record updates in a Vec55 ms49 ms55 msn/an/a
payload_state_machine10M events through an enum/result state machine84 ms77 ms74 msn/an/a
captured_closure_queue10M calls through a queue of 16 closures98 ms94 ms100 msn/an/a
dynamic_method_mix10M two-method calls on 64 trait objects117 ms115 ms115 msn/an/a
csv_table_pipeline4 parses + scans of a 100k-row RFC 4180 table70 ms79 ms69 msn/an/a
chacha20ChaCha20 over 16 MiB (RFC 8439)6.3 ms24 ms25 msn/an/a
poly1305Poly1305 MACs over 64 MiB (RFC 8439)9.6 ms20 ms20 msn/an/a
blake2bBLAKE2b-512 over 32 MiB (RFC 7693)33 ms53 ms58 msn/an/a
sha512SHA-512 over 16 MiB (FIPS 180-4)37 ms38 ms41 msn/an/a
x255191000 chained X25519 scalar mults (RFC 7748)26 ms38 ms39 msn/an/a

Median wall-clock time for the full process. Lower is better. NURL is highlighted only when its displayed time is lower than every other displayed time.

GET STARTED

Start with NURL

Install a release

curl -fsSL https://nurl-lang.org/install.sh | sh
irm https://nurl-lang.org/install.ps1 | iex
Install guide →

Editor support

The VS Code extension also works in Cursor and Windsurf, with diagnostics, completion, and formatting.

Editor guide →

TARGETS

One LLVM pipeline across targets

The compiler emits target-agnostic LLVM IR for desktop, server, browser, unikernel, and embedded targets.

Linux x86_64
Windows x86_64
macOS x86_64 and ARM64
FreeBSD x86_64
WebAssembly
Linux ARM64
Linux RISC-V64
Unikernel x86_64, ARM64, and RISC-V64
Milk-V Duo
ESP32 Xtensa
ESP32-C3/C6

Embedded hardware. NURL runs an HTTP file server on the Milk-V Duo and drives ESP32 GPIO through memory-mapped registers.

Browser builds. The playground compiles to wasm32-wasi in your tab and can cross-compile downloadable native binaries.

Bootable programs. The unikernel path links NURL programs without a host OS for x64, ARM64, and RISC-V targets.

STANDARD LIBRARY

243 modules, included with the toolchain

The standard library is plain NURL source: core types, general-purpose modules, and optional higher-level integrations.

Network

TCP, UDP, Post-Quantum TLS 1.3, QUIC, HTTP/1.1, HTTP/2, HTTP/3, WebSocket, MQTT, SMTP, and peer-to-peer networking.

Data

JSON, Protobuf, Zstandard, TOML, YAML, XML, MessagePack, CBOR, CSV, PostgreSQL, and SQLite.

Concurrency

Threads, mutexes, channels, atomics, and a stackful M:N async runtime.

Core

Collections, arbitrary-precision numbers, regex, crypto, compression, UUIDs, paths, and processes.

AI and MCP

Anthropic API support plus MCP clients, servers, sessions, and registries.

Tooling

LSP, formatter, documentation tools, test and benchmark runners, and a differential fuzzer.

Browse the standard library →

PROJECTS

NURL projects

The compiler itself

A self-hosting compiler that produces identical LLVM IR in two compilation rounds.

Explore →

A Game Boy emulator

A complete DMG emulator compiled to WebAssembly for the browser.

Explore →

The playground backend

NURL serves the playground, build service, MCP endpoint, and package registry.

Explore →

Examples

Examples include Game of Life, HTTP/2, MCP servers, agents, and embedded targets.

Explore →

PACKAGES

Packages, one command away

The registry supports semver ranges, reproducible lockfiles, and signed tarballs verified by nurlpkg before unpacking.

nurllama
whisper
onnx
tensor
grad
yoloe
nwasm
image
nq

MCP SERVER

NURL tools for agents

Connect an MCP client to build, run, and cross-compile NURL without a local toolchain.

claude mcp add --transport http nurl https://play.nurl-lang.org/mcp
Read the MCP setup guide →

REFERENCES

Source, specification, and release history

Documentation

Guides and language reference for installing, writing, and running NURL.

Read the docs →

README

A repository overview of the language, runtime, and build pipeline.

Open README →

Formal grammar

The versioned EBNF grammar and historical snapshots.

Open grammar →

Formal proof (Lean 4)

60,000+ lines of Lean 4 mechanizing NURL’s memory model (A1, A2 & A3): structs, enums, closures, panics, concurrency, data-race freedom, and leak freedom.

Package registry

Browse packages, source, and generated API documentation.

Open registry →