A low-level functional language

For exploring algebraic effects, safe shared mutability, and other novel features

Goals

Ante aims to help bridge the gap between low-level languages like C++/Rust and higher level garbage-collected languages like Java, OCaml, or Haskell. Ante aims to make developing programs easier by allowing patterns like shared mutability which allow for more design flexibility while still remaining thread safe and memory safe.

Safe Shared Mutability

Shared mutability is a common cause of bugs in other languages. In Ante, not only is it safe, it is zero-cost. The type system will prevent unsafe operations on mutably shared references at compile-time.

Expressive

Common patterns like looping and handling effects have syntax sugar to cut down on repetitive code while keeping things explicit.

Effects via Capabilities

Capabilities provide great code reuse and are both easier to use and understand when compared to monads.

Fast Compilation

Compared to similar compilers, Ante’s compiler is both incremental and does not require monomorphization in debug builds.

High & Low Level language

To try to bridge the gap between high and low level languages, ante adapts a high-level shell implemented in userland by a low-level core.

Easier Lifetime Variables

Instead of abstract or numbered names, Ante’s lifetime variables are named after the variable(s) they borrow, making error messages more clear

The compiler is on GitHub

All are welcome to contribute!

github.com/jfecher/ante

Recent posts

Read the latest blog posts

A Vision for Future Low-Level Languages

By Jake Fecher on 2025-10-24

A Vision for Future Low-Level Languages I’ve had this vision in my head for quite a while now on what code written in a low-level language could look like. This vision has shaped my design of Ante and although I’ve alluded to it before, I’ve never explicitly stated it until now. Now, what makes a language low-level is a bit contentious. I’m using it here to describe a group of languages I have no better descriptor for: C, C++, Rust, and Zig, among others.

Continue reading

Stable, Mutable References

By Jake Fecher on 2025-08-21

Introduction In my first blog post I introduced &shared mut references as a way to achieve safe, shared mutability in a language with unboxed types. For more information on those, start with the first blog post. As a brief summary though, &shared mut references can be aliased freely and mutate freely with the one restriction of not being able to be projected into any “shape-unstable” types. What is a shape-unstable type?

Continue reading

Why Algebraic Effects?

By Jake Fecher on 2025-05-21

Why Algebraic Effects Algebraic effects1 (a.k.a. effect handlers) are a very useful up-and-coming feature that I personally think will see a huge surge in popularity in the programming languages of tomorrow. They’re one of the core features of Ante, as well as being the focus of many research languages including Koka, Effekt, Eff, and Flix. However, while many articles or documentation snippets try to explain what effect handlers are (including Ante’s own documentation), few really go in-depth on why you would want to use them.

Continue reading

Simplification Through Addition

By Jake Fecher on 2024-03-17

Ante’s goal was always to be a slightly higher level language than Rust. I always imagined Ante to fill this gap in language design between higher-level garbage collected languages like Java, Python, and Haskell, and lower level non-garbage collected languages like C, C++, and Rust. I still think there’s room there for a language which tries to manage things by default but also allows users to manually do so if needed as an optimization.

Continue reading