Regular prefix-arity grammar
Every operator has a fixed arity. There is no infix syntax or precedence table.
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.
WHY NURL
NURL keeps generated code easy to parse. Fixed arity removes precedence ambiguity, short dependency windows limit context, and the grammar fits on one page.
Every operator has a fixed arity. There is no infix syntax or precedence table.
A token’s meaning depends on a short span of preceding tokens.
Values drop at scope exit. Borrow checking rejects use-after-move, double-free aliases, and escaping captures.
Bootstrap compiles the compiler twice and requires identical LLVM IR from both runs.
One LLVM pipeline targets desktops, servers, WebAssembly, RISC-V, and embedded systems.
The compiler is written in NURL and builds itself from source.
SYNTAX
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 ) // → 7FizzBuzz
: ~ 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
15 verified benchmarks compare NURL with C, Rust, Node, and Python. Each implementation must produce the same output before timing.
| Benchmark | NURL | C | Rust | Node | Python |
|---|---|---|---|---|---|
lcg20M-step 64-bit LCG + xorshift | 39 ms | 39 ms | 39 ms | 2,056 ms | 5,224 ms |
packet_classifier25M unpredictable branches | 56 ms | 56 ms | 56 ms | 162 ms | 4,327 ms |
ring_write20M ring-buffer stores | 42 ms | 42 ms | 42 ms | 67 ms | 6,282 ms |
histogram_bins20M binned increments | 40 ms | 41 ms | 40 ms | 67 ms | 6,220 ms |
prefix_scan1M 16-wide prefix scans | 22 ms | 22 ms | 22 ms | 64 ms | 4,452 ms |
binary_search5M lower-bound searches | 39 ms | 38 ms | 37 ms | 106 ms | 5,967 ms |
sort_window2M 8-element bubble sorts | 27 ms | 27 ms | 27 ms | 198 ms | 11,534 ms |
bloom_filter4M Bloom-filter queries | 17 ms | 18 ms | 18 ms | 2,866 ms | 7,870 ms |
hash_join5M hash-table probes | 27 ms | 28 ms | 29 ms | 3,450 ms | 8,689 ms |
sieveSieve of Eratosthenes to 10M | 21 ms | 20 ms | 21 ms | 70 ms | 3,748 ms |
fibRecursive fib(35) | 26 ms | 31 ms | 26 ms | 131 ms | 1,391 ms |
collatzLongest Collatz chain below 100k | 12 ms | 12 ms | 12 ms | 52 ms | 731 ms |
matmul256x256 integer matrix product | 33 ms | 33 ms | 33 ms | 78 ms | 3,245 ms |
json_parse20 parses of a 64 KB document | 10 ms | 9.0 ms | 12 ms | 36 ms | 39 ms |
nbody500k n-body integration steps | 25 ms | 40 ms | 24 ms | 102 ms | 3,081 ms |
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
Write, build, and run NURL in your browser.
Open the Playground →curl -fsSL https://nurl-lang.org/install.sh | sh
irm https://nurl-lang.org/install.ps1 | iexInstall guide →git clone https://github.com/nurl-lang/nurl
cd nurl && ./build.shView the repository →The VS Code extension also works in Cursor and Windsurf, with diagnostics, completion, and formatting.
Editor guide →TARGETS
The compiler emits target-agnostic LLVM IR for desktop, server, browser, unikernel, and embedded targets.
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
The standard library is plain NURL source: core types, general-purpose modules, and optional higher-level integrations.
TCP, UDP, TLS, HTTP/1.1, HTTP/2, WebSocket, MQTT, SMTP, and peer-to-peer networking.
JSON, TOML, YAML, XML, MessagePack, CBOR, CSV, PostgreSQL, and SQLite.
Threads, mutexes, channels, atomics, and a stackful M:N async runtime.
Collections, arbitrary-precision numbers, regex, crypto, compression, UUIDs, paths, and processes.
Anthropic API support plus MCP clients, servers, sessions, and registries.
LSP, formatter, documentation tools, test and benchmark runners, and a differential fuzzer.
PROJECTS
A self-hosting compiler that produces identical LLVM IR in two compilation rounds.
Explore →A complete DMG emulator compiled to WebAssembly for the browser.
Explore →NURL serves the playground, build service, MCP endpoint, and package registry.
Explore →Examples include Game of Life, HTTP/2, MCP servers, agents, and embedded targets.
Explore →PACKAGES
The registry supports semver ranges, reproducible lockfiles, and signed tarballs verified by nurlpkg before unpacking.
nurlpkg search whisper
nurlpkg install nq
nurlpkg add tensor
nurlpkg publishBrowse the registry →MCP SERVER
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/mcpRead the MCP setup guide →REFERENCES
Guides and language reference for installing, writing, and running NURL.
Read the docs →A repository overview of the language, runtime, and build pipeline.
Open README →The versioned EBNF grammar and historical snapshots.
Open grammar →A release-by-release record of changes.
Read changelog →Current work and plans toward 1.0.
Read roadmap →Browse packages, source, and generated API documentation.
Open registry →