Systems programming language

NovaC. Systems code with modern ergonomics.

NovaC is a systems programming language. Its compiler turns NovaC into clean C99, which GCC or Clang builds into a native program, so you keep your existing C toolchain and gain memory safety checked at compile time.

In the language

  • Ownership checked at compile time
  • No garbage collector
  • Readable C99 output
  • A content-addressed build cache

Who it is for

C runs almost everywhere, and memory bugs in C are costly. NovaC keeps the output and the toolchain, and moves the checking into the compiler.

  • Embedded and systems developers

    Target anything a C compiler supports, without a runtime or garbage collector in the way.

  • Teams with C toolchains

    Keep GCC or Clang, your build system and your optimisation flags.

  • Language and compiler enthusiasts

    Read the C that your program turns into, and see exactly what the compiler did.

What it offers

Safety in the compiler, speed from your C toolchain.

  • Memory safety

    Ownership and borrowing are checked at compile time, which rules out use-after-free and similar mistakes without a garbage collector.

  • Abstractions that compile away

    Iterators, closures and generics are designed to turn into the C you would have written by hand.

  • Readable C99 output

    The generated C is human-readable, so you can inspect it and debug it with familiar tools.

  • Native through your compiler

    GCC or Clang does the final build, so its optimisations and flags are available to you.

  • A content-addressed build cache

    Results are cached by a hash of the source, so identical code is not compiled twice, on one machine or across a team.

  • Written in Rust

    The compiler itself is a Rust program with a parser, a high-level and a mid-level representation, and a C code generator.

Compiler pipeline

From a source file to a native binary.

  1. Write NovaC

    Source files use the .nc extension and read like modern systems code, with functions, ownership and types.

  2. Compile to C99

    The NovaC compiler parses and checks the program, then emits clean C99.

  3. Build natively

    Your C compiler turns that C into a native binary, using the optimisation settings you choose.

NovaC

Interested in NovaC?

Tell us what you would like to build with it, and we will tell you where it stands.