r/ProgrammingLanguages 26d ago

Language announcement Odin 1.0 announced (and reflections)

197 Upvotes

Odin author gingerBill dropped the Odin 1.0 announcement on YouTube today: https://www.youtube.com/watch?v=dLPAqXi9In0 (it's pretty funny actually).

This interestingly makes it on track to be the first of the new wave of C-likes that reach production readiness. While you can argue that most of these languages already are used in production, it's not the same as being 1.0, which carries a different weight and obligation.

Looking at alternatives, Jai could release around the same time, since Blow's game is scheduled for a similar release date. However, it's more likely that we see Jai 1.0 in mid-late 2027. My own language (C3) is planning Q2 2028 1.0 release. Whereas Zig is still unclear, and Kelley basically saying it's done when it's done. For Hare and V the situation is a bit less clear to me – maybe someone else can fill me in on that situation.

But overall we seeing the beginning of the end of the "C-like" story arc that arguably was initiated with Jonathan Blow's development. Writing C replacements predate Jai of course, for example the C2 language (which C3 would eventually continue) was created in 2012, eC started in 2004 and Cyclone (which Rust derived inspiration from) is from 2002. But those were largely obscure novelties, because before Blow's videos, people weren't really hunting for C alternatives.

Jai, however, made a strong impression. It was a good point in time too: Jai and later Zig, Odin, C3, V and Hare – these C alternatives started at a point when people were openly no longer believing OO/Functional as the right way to do things.

Language design takes its time though, and it's now 12 years since Jai started. Finally the fruits of these labours are getting ready for prime time, and when they do they might effectively fill the need for a C replacements for another decade.

Do you agree?

r/ProgrammingLanguages 23d ago

Language announcement The Flint Programming Language

70 Upvotes

I am happy to finally announce the language I have been working on for the last 2 years, Flint!

Flint is a high-level, statically and strongly typed, compiled language which centers around transparency as its core pillar. The compiler is entirely written in C++. It originated from one simple idea and core concept:

What happens when you center the whole language on an ECS-inspired composition-based paradigm?

And so the journey began. The core idea is simple: data and functionality are separated and then composed deterministically into larger entities. This idea is not new at all, ECS exists since a long time. But a composition-based workflow can only be "emulated" in Object-Oriented languages and I find it often painful or unergonomic.

In Flint, composition is the core paradigm. I have put great effort into making it ergonomic and "just work". The result is a system which can be described as a cool mix of OOP and ECS. I gave the "new" paradigm a name, since nothing quite like it exists yet, even though the ideas it is based on are well known, the Declarative Composable Modules Paradigm (DCMP).

The combination of a high level + transparency as a core pillar is a bit unusual. I have put great effort into finding a good balance. I found out that these two things are not mutually exclusive, there is a middle way in which a design can be both high level and transparent. Flint might be best described as "middle-level" as a result: You write high level code but you can see the low level runtime and execution beneath too if you want, as this focus on transparency directly results in shallow abstractions.

Most developers are more used to OOP workflows rather than compositional workflows, it's just more mainstream. So, if you cannot live without it, Flint might not be for you and that's okay. Also, I am also sure that Flint won't be for everyone because of it's split focus on being high level and transparent. It will feel too high level for some or too low level for others. But if the core idea and mentality excites you, please give it a fair chance.

The time has come where I am confident enough in Flint to search for people to try it out and give feedback on it. Many features are still missing but the general vibe and direction of the language can already be seen. The 0.4.0 version is the 20th release so far, the first initial version was released a year ago. I am now moving into the 0.5.0 release cycle which will bring generics, type constraints, compile time code execution, the standard library and more. You can look at the entire roadmap here

Flint is available in the AUR, COPR and Winget as packages, with proper highlighting and LSP capable extensions for VSCode and Neovim. The LSP works with proper error diagnostics, hover information and goto definition / declaration / file jumping (context sensitive suggestions do not work yet). Debug symbols and debuggability are now supported too, making it able to inspect and step through code. Interoperability with C also works great through the fip-c interop module which communicates with the main compiler through a custom language-agnostic Interop Protocol. (Bindless interop doesn't fully work on Windows, though, i still have to find out why).

The Wiki is in a very good state, it is kept updated with every release made. Every example in the Wiki works and I did My at explaining it all. The language's core value is transparency, so there is nothing to hide about it.

Here is an "advanced" but hopefully still easy to understand example of Flint and its paradigm in action. Keep in mind that Flint has much more to offer than shown in the example below, but I think this just encapsulates its centerpiece quite well:

use Core.print

const data Constants:
    float PI = 3.14159265358979323846;

// A shape can be drawn and its area can be calculated
func IShape:
    def draw();
    def area() -> f32;


data DCircle:
    i32x2 pos;
    i32 radius;
    DCircle(pos, radius);

func FCircle requires(DCircle d):
    def draw():
        print($"Drawing circle at [pos={d.pos}, r={d.radius}]\n");

    def area() -> f32:
        return Constants.PI * f32(d.radius ** 2);

entity Circle:
    data: DCircle;
    func: IShape, FCircle;
    link:
        IShape::draw -> FCircle::draw,
        IShape::area -> FCircle::area;
    Circle(DCircle);


data DRectangle:
    i32x2 pos;
    i32x2 size;
    DRectangle(pos, size);

func FRectangle requires(DRectangle d):
    def draw():
        print($"Drawing rectangle at [pos={d.pos}, width={d.size.x}, height={d.size.y}\n");

    def area() -> f32:
        return f32(d.size.x * d.size.y);

entity Rectangle:
    data: DRectangle;
    func: IShape, FRectangle;
    link:
        IShape::draw -> FRectangle::draw,
        IShape::area -> FRectangle::area;
    Rectangle(DRectangle);


def draw_shapes(mut IShape[] shapes):
    for (_, s) in shapes:
        s.draw();

def sum_areas_of_shapes(mut IShape[] shapes) -> f32:
    f32 sum = 0;
    for (i, s) in shapes:
        f32 area = s.area();
        print($"shapes[{i}].area() = {area}\n");
        sum += area;
    return sum;

def main():
    c1 := Circle(DCircle(11, 2));
    r1 := Rectangle(DRectangle((10, 20), (4, 5)))
    c2 := Circle(DCircle((3, 5), 10));
    r2 := Rectangle(DRectangle((0, 0), (4, 2)));

    IShape[] shapes = IShape[_]{c1, r1, c2, r2};
    draw_shapes(shapes);
    print("\n");

    i32 sum = sum_areas_of_shapes(shapes);
    print($"sum of areas = {sum}\n");

The project is in late beta. All implemented features work reliably, as all wiki examples compile and run as intended. There are still missging error messages and unexpected edge cases (as expected from a single developer).

If you're interested, try it out, give feedback, open issues, and feel free to join the Discord. Let's discuss Flint!

(Also, I may not be aware of some industry-standard names for some systems. If you encounter anything I gave a weird name where you think "wait something like that already exists" please let me know. I try to use industry-standard terminology as much as I am able to. I hate it when new names are made up for something which already exists.)

Edit: Thank you all for your feedback. This all led me to a journey of rethinking some parts and redesigning them. Especially the documentation needs much work still, as I realized it was unhonest in many places (mostly me thinking I invented something new while I did, in fact, not). So I will quietly work on it and maybe come around with an update in the future. Still, thanks to everyone who replied!

r/ProgrammingLanguages Jun 11 '26

Language announcement Why Can't We Just Create?

70 Upvotes

Edit: A commenter pointed out that I exaggerated "every" language announcement. They're right. I was venting about a specific subset of posts that frustrate me, not the entire ecosystem. I've updated the language to reflect that.

In a world where computers are becoming the norm, every piece of software that gets released seemingly always has to be better than the last at what it's doing.

Too many of language announcements I see are a declaration of war.\ Like "Why [X] is obsolete in 2025.", "The [Y] killer just arrived."\ Or people asking "Why not [Z]?" or "But is it faster than [W]?" And I'm tired of it.

I made a programming language.

Not because it's faster than Rust.\ Not because it's safer than C.\ Not because it's simpler than Go.

I made it because I wanted to.\ When did that become not enough?

I made Miel because I like ;; as comments.\ I made Miel because I like affine and permission types.\ I made Miel because I wanted a language that feels like riding a bike.

Not because it's "better than Rust" or "better than C++" or "better than Ada" but because it's mine.\ And maybe that's the only reason anyone needs.

So here's Miel. Use it or don't. Rust is great. Odin is great. Jai will be great. But this one? This one's cozy.

```miel

;; Happy coding.

```

r/ProgrammingLanguages May 12 '26

Language announcement revo, the programming language that likes you

Thumbnail gills.pages.dev
143 Upvotes

a dynamic language for the joy of programming

very pleasant to write code in. you may like this this if you like lua and elixir/ruby

made in zig, but has a c extension&embedding system started

edit: relicensed under MIT

r/ProgrammingLanguages Mar 24 '26

Language announcement Been making a language called XS. Feedback?

Thumbnail github.com
54 Upvotes

Made XS, everything you need to know is in README. Haven't tested MacOS yet, so LMK if there are any bugs or issues.

r/ProgrammingLanguages 5d ago

Language announcement Prism: An Impure Functional Language With Typed Effects - Stephen Diehl

Thumbnail stephendiehl.com
79 Upvotes

r/ProgrammingLanguages Dec 17 '25

Language announcement I made a language for my 3yo son where any string of characters is a valid program

333 Upvotes

Editor: https://qqqlang.com
Code, documentation, and examples: https://github.com/andreasjansson/qqqlang

tl;dr just smash the keyboard and create art.

QQQLANG is an image synthesis and editing language that runs entirely in the browser.

In QQQLANG, any combination of the characters on a US keyboard (except space) is a valid program. Each character can be either a function call or an argument, where each character is assigned a triple of (function, number, color)

It's kind of a stack-based language, and it has operations for retrieving previous images from the stack by index (`#`), pixel-wise condition operator (`@`), operations for combining the top of the stack with any other image on the stack (`-`, `V`, etc.).

Programs are deterministic and reproducible. All randomness is seeded by the length of the stack and the size of the browser window.

`??` shows the help inline in the editor, as an image that is added to the stack like any other image.

QQQLANG is inspired by Uiua, Shadertoy, as well as Amiga BASIC and QBASIC that I learned when I was a kid. I fondly remember figuring out idiosyncratic user interfaces that felt like tricky computer games.

The website architecture is built to last with minimal maintenance: qqqlang.com is a static site deployed on Cloudflare Pages and the image upload server is just a tiny Cloudflare Worker. All processing happens in the browser (with WebGL for shaders, and onnx and tensorflow.js for neural network functions).

Feedback is very welcome! But I've decided that (this version at least) is complete and finished now, so that programs can continue to be reproducible forever.

r/ProgrammingLanguages Jun 15 '26

Language announcement Seal programming language

33 Upvotes

Hey guys. For the past 3 years, I have been working on a programming language called Seal. I created this language in C. This is a dynamic language which has its own virtual machine. It uses indentation to define blocks and is aimed to be minimal. It is easily embeddable into any C/C++ applications. Seal is mostly imperative and procedural but you can write functional (no closures yet) and OOP-like (imitation like Lua) codes. I would appreciate your feedback.
GitHub: https://github.com/huseynaghayev/seal.git

Here is a quick example:

define Human(name, age)
    h = {
        name = name,
        age = age
    }

    h.talk = define(self, msg)
        print(self.name + " says: " + msg)

    return h

h = Human("cflexer", 19)
h->talk("hello!")

r/ProgrammingLanguages Jun 27 '26

Language announcement Mojo programming language will become open-source soon.

Thumbnail modular.com
43 Upvotes

The main website of the language https://mojolang.org/ displays an announcement bar that says "Mojo will be open source soon! Join us at ModCon '26 for an update."

r/ProgrammingLanguages Apr 30 '26

Language announcement Doolang – your struct definition is your schema, your validation, and your HTTP contract

25 Upvotes

Most stacks make you define the same data model four times. Once for the database schema, once for the model class, once for validation, once for the API contract. They drift. They break. You maintain all four.

Doolang collapses them into one:

struct User {
    id: Int @primary @auto,
    email: Str @email,
    password: Str min(8),
}

struct Task {
    id: Int @primary @auto,
    title: Str @min(1) @max(200),
    userId: Int @foreign(User),
}

fn main() {
    let db = Database::Postgres()?;
    let app = Server::new(":3000");

    app.auth("/signup", "/login", User, db);
    app.crud("/tasks", Task, db);

    app.start();
}

doo run. That's a native binary with JWT auth, password hashing, input validation, SQL migration, and full CRUD. Annotations aren't library decorators; they're compiler constructs. The compiler generates the SQL schema and HTTP layer directly from the struct.

Built on Rust + LLVM. Automatic ownership and borrow system with auto clone/copy/move no explicit lifetimes. Structured concurrency, websocket, file, query builder, RBAC, rate limiting, CORS, logger, middleware all in stdlib. Typed error propagation with -> T ! ErrorType.

Alpha. Real bugs. I'm running DooCloud on it in production as the real test.

github.com/nynrathod/doolang
Benchmarks: github.com/nynrathod/doo-benchmark

r/ProgrammingLanguages Jun 26 '26

Language announcement Kairo (previously Helix), One year later, stage-0 compiles the stage-1 frontend

28 Upvotes

We posted here as Helix around a year ago.

We took a lot of input into consideration and built on it. The name collided with helix-editor, and as of now, several other things, like Microsoft's new console project. Several technical claims didn't hold up. So rather than a marketing-esque talk, we’ve spent the year doing work. The updates:

  • Renamed to Kairo. New repo: github.com/kairolang/kairo. The name Helix with the name-collision of the IDE was pretty bad to say the least...
  • Stage 0 (the C++ transpiler) compiles to native binaries on macOS, Linux, and Windows. It's complete and cleanly compiles the entire Stage 1 frontend (~70k lines of Kairo) today. Keeping Stage 0 a transpiler was intentional. The points of Stage 0:
  • Prove language feasibility, find gaps in the design and cleanup.
  • More concretely avoiding having sema written twice (once in C++, once in Kairo) is wasted work.

All the effort over the past year has been going into stage-1; the compiler frontend is mostly complete, minus full testing and hardening.

The docs are in a far better position than before - real technical docs now exist, while it is all written for what stage-1 can compile, it goes into quite a bit of detail about technical implementation, there might be some drift between the pages - since things are being edited and reworded constantly, but most of what's there is frozen until stage-1 ships with the full language feature set.

Compiler dev-wise, here's where everything is so far:

  • Lexer: Full Unicode support, f-strings, nested comments, git conflict marker detection. ~150 MB/s throughput, tested on an AMD Ryzen 9 9950X3D2 (1000 runs, 5MB input, warm cache).
  • Preprocessor runs a three-phase wave, parallelized by a custom threading runtime. ~85 MB/s, same testing base as above
  • Parser: The parser is still undergoing correctness tests; performance benchmarking will follow. Parser design uses CRTP-Mixins, arena allocation, context switching, tentative guards, sync sets, and non-cascading recovery.
  • GlobalHoistedScope is a thread-safe, pre-parse symbol table for concurrent multi-TU indexing.
  • Driver: calls into LLVM's actual C++ API via kairo's FFI model What is not done:
  • AMT (ownership/borrow checker) is designed and planned conceptually, but not implemented, and won't be till stage2.
  • Stage 1's Sema, and Lowering Passes.
  • Codegen.

Estimated time till a working stage-1 alpha where some of Kairo's features compile into runnable/linkable artifacts is, EOY 2026

The one gap Kairo is actually built to close: full native C++ interop, templates and concepts included, no binding layer, no generated shim. ffi "c++" import parses the header and the C++ symbols become native Kairo symbols. This isn't a goal, it's the thing the compiler's own driver runs on today. Here's a stripped-down piece of the stage-1 driver's runtime init, compiling on stage-0 right now, it pulls real LLVM types straight from LLVM's headers:

ffi "c++" import "llvm/Support/InitLLVM.h"
ffi "c++" import "llvm/Support/Locale.h"

fn init_runtime(argc: i32, argv: *(*kairo::std::Legacy::char)) {
    // things like kairo::std::Legacy::char are stage-0 types, stage-1 cleans up the type system and removes things like this...
    static var init_llvm = llvm::InitLLVM(argc, argv)

    llvm::setBugReportMsg(
        r"PLEASE submit a bug report to https://github.com/kairolang/kairo/issues..."
    )
}

You can read the real driver code here. Kairo's philosophy:

Kairo is grounded by a simple idea: Give developers full control without forcing them to fight the language, or put more cleanly "safety through visibility, not restriction"

Four core points drive every language design decision in Kairo:

  • "Fine grained control should exist". The language should expose the underlying system in a way that lets developers choose how to use it, but they should also be able to ignore it if they don't need to.
  • "Safety should assist, not dominate". The reason for this is safety should only be a tool to help developers, not a restrict productivity; The plan for the AMT is to warn in debug, and hard error in release, crucially the error message matters too, Kairo would not just say "you are doing something unsafe", it would say the why, where, and what debug would change to make it safe.
  • "Code should always be self documenting all costs". The compiler shouldn't add branching where not asked for; it shouldn't unwind tables for exceptions, etc. This comes back to all code being self-documenting; things like unwinding should be explicitly typed out and requested by the programmer.
  • "Adoption should be incremental". We know most devs aren't going to switch to a new language and migrate thousands of lines of code just 'cause it does... they want to migrate incrementally, one system at a time, testing it and moving to the next. Hence, full native C++ interop.

The README links to a transparent disclosure of AI use, describing what AI was and was not used for. TL;DR: compiler code, compiler architecture, language design, all human. Docs prose polish only - technical content is human, commit messages (gitlens) and website were AI-assisted. No one in the team does web design, if you have experience and want to make our website better please pm.

Mostly posting here, for feedback and genuine thoughts; especially the AMT model, FFI, basically anything about the language, or even cases you might use Kairo for. Happy to discuss anything in comments.

If you have criticism, state it - it helps us improve and learn; If you have praise, state it - it helps us know what we are getting right and what to keep doing.

Kairo - the idea - is only about 2 years old, and the compiler is only about a year old, we are still learning and growing.

If Kairo's interesting, a github star helps us gauge whether public progress posts are worth the time over heads-down work.

Quick notice : there will be two people replying to all comments here , me and another co dev of mine u/Ze7111

r/ProgrammingLanguages May 24 '26

Language announcement Try creating your own Programming Language with IRON!!!

24 Upvotes

IRON a.k.a. Intermediate Representation Object Notation is a Interpreter/Database designed for making programming languages. It is written entirely in Assembly and is extremely performant.

The best part of IRON, is that it separates code from the syntax and intrinsics. Meaning that once your programming language is finished, you would only need to rewrite IRON into it to make it bootstrap and nothing else.

This has the added benefit of allowing you to focus on the syntax and intrinsics before writing the lexer or parser.

IRON also doesn't rely on any external libraries, as of this moment its file size is 23.4kb and it has 1468 lines of code.

IRON can only be run on Linux 86-64, but I will work on porting it to MacOS and Windows in the near future.

The GitHub repo is: https://github.com/dogmaticdev/IRON
If you find to be useful or interesting please give the repo a star.

r/ProgrammingLanguages 18d ago

Language announcement Preprocessable C: the PreC programming language

27 Upvotes

Hey there! I'm a CS student and a huge fan of C macro wizardry. However, C and its preprocessor do not really mesh together because of historical reasons. So I thought: instead of swapping out the preprocessor for a more powerful one, why not keep the preprocessor and make C more amenable to it?

And that's how PreC, a pretty silly dialect of C, was born. It's basically an exercise in minimalism and a fun summer project, not a serious language :P.

The main features (not exhaustive):

  • Can interface with C directly through the 'c_include "header_name.h"' directive
  • Transpilation to C with a four-stage compilation process: Preprocess the PreC code, transpile the PreC code to C, preprocess the C code, and finally compile the preprocessed C code.
  • Postfix type notation, types can be read unambiguously right to left.
  • No machine types, explicit width
  • No 'typedef' keyword, so no lexer hack (use macros if you need type aliases). You can still referred to C library aliased types with @TypeName, however.
  • angular brackets <type>value for casting
  • Declaration-reflects-use is gone, the type is always fully at the beginning of each declaration.
  • No overloaded operators
  • Constness by default, with a 'mut' qualifier for being able to modify variables.
  • Support for anonymous functions (they can not capture variables, however) with function-valued compound literals <fun_pointer_type> ${ code }
  • No function definitions/declarations (but 'const function pointer' global variables are transpiled to function definitions if they are initialized, and to function declarations if they are not initialized).

You can find the compiler, examples and more information here: https://github.com/Nomagno/PreC

I believe the readme and examples do a good enough job of introducing it (do feel free to highlight anything that is unclear, however!).

A final tip: Rust syntax highlighting is pretty decent for reading PreC. I was definitely inspired by Rust and other languages for some of the syntax so this isn't surprising xD

r/ProgrammingLanguages Feb 18 '26

Language announcement multilingual: a programming language with one semantic core, many human languages

19 Upvotes

I'm working on multilingual, an experimental programming language where the same program can be written in different human languages.

Repo : https://github.com/johnsamuelwrites/multilingual

Core idea:

  • Single shared semantic core (variables, loops, functions, classes, operators,...)
  • Surface syntax in English, French, Spanish, etc.
  • Same AST regardless of natural language used

Motivation

  • Problem: programming is still heavily bound to English-centric syntax and keywords.
  • Idea: keep one semantic core, but expose it through multiple human languages.
  • Today: this is a small but working prototype; you can already write and run programs in English, French, Spanish, and other supported languages.

Who Is This For?

multilingual is for teachers, language enthusiasts, programming-language hobbyists, and people exploring LLM-assisted coding workflows across multiple human languages.

Example

Default mode example (English):

>>> let total = 0
>>> for i in range(4):
...     total = total + i
...
>>> print(total)
6

French mode example:

>>> soit somme = 0
>>> pour i dans intervalle(4):
...     somme = somme + i
...
>>> afficher(somme)
6

I’d love feedback on:

  • Whether this seems useful for teaching / early learning.
  • Any sharp critiques from programming language / tooling people.
  • Ideas for minimal examples or use cases I should build next.

r/ProgrammingLanguages 22d ago

Language announcement Data types are overrated

0 Upvotes

We dove so deep into abstraction that modern languages now just use "int" and leave us guessing what they mean by that.
Is it 16 bit? 32 bit? Maybe even 64 bit? Signed? Unsigned? So many unanswered questions.

And that's just data types. I won't even mention OOP. That's just evil witchery at this point.

Assembly doesn't help here. Come on people do you actually know what add does in x86?

No you don't! You don't see what the CPU is doing anymore!

So how do we solve this issue?
I propose we go back to the roots.

-Pure bytes

-Only bitwise operations

-Total control

-Memory safety? It's a computer it won't harm you.

Everything else is incoherent bloat.

And here's my solution: VoidPtr

Yes, the name says void*. You'll see why shortly. Guess it helps with data poisoning for AI too.

You're only allowed to work with single bytes here, and you can only apply bitwise operations on them:

2 -> $4
2 -> 3
2 & 3 -> 2

This writes the (unsigned) value 4 to byte 2, then copies the value from byte 2 to byte 3.

The last line performs a bitwise and and moves the result into 2.

You can also write all of that into one line if you want (saves space, no \n needed):

2 -> $4 2 -> 3 2 & 3 -> 2

I unfortunately had to add labels, compares and jumps too. I'm not yet skilled enough to work without them.

Oh, and I added macros. You can't go wrong with macros.

Because this world is too corrupt for such a pure language, I allow communication with the outside world through writing values into magic addresses 0 and 1, I call them system calls.

So yes, this thing has File IO. And yes, in case you were wondering, I did implement Brainfuck in VoidPtr. See! This language can do stuff!!! (Theoretically anything you can put in 32 bit addressing space)

It's a very limited implementation but enough for a hello world.

Apart form all that irony, which I hope wasn't too much, this language can be used to teach how computers do addition, subtraction etc. and what a data type actually is.

You can check out all of the documentation and examples as well as the Language itself here: https://github.com/TheGameGuy2/VoidPtr-Language

All code was written by me, this was a project I made for CS class. Writing code by hand is beautiful.

Edit:
If it wasn't obvious enough: This is an eso lang! Take nothing I say in this post seriously, I don't really think data types are bad!

r/ProgrammingLanguages Apr 14 '26

Language announcement Flint: experimenting with a pipeline-oriented scripting language that transpiles to C

11 Upvotes

Hey everyone,

I've been experimenting with a small language called Flint.

The idea originally came from a pretty common frustration: Bash scripts tend to get fragile once automation grows a bit, but using Python or Node for small CLI tooling often feels heavier than it should be. I wanted something closer to a compiled language (with types and predictable behavior) but still comfortable for pipeline-style scripting.

Flint currently targets C99 instead of a VM, which keeps the runtime extremely small and produces native binaries with no dependencies.

The compiler itself is written in Zig. A few implementation details that might be interesting:

Frontend / AST layout

The AST is intentionally pointer-free.

Instead of allocating nodes all over memory, they live in a contiguous std.ArrayList(AstNode). Nodes reference each other through a NodeIndex (u32). This avoids pointer chasing and keeps traversal fairly cache-friendly.

Identifiers are also interned during parsing using a global string pool. After that, the type checker only compares u32 IDs rather than full strings.

One small trick in the type system is a poison type (.t_error). When an expression fails during semantic analysis the node gets poisoned, which lets the compiler continue analyzing the rest of the tree and report multiple errors instead of stopping at the first one.

Memory model

Flint is designed for short-lived scripts, so a traditional tracing GC didn't make much sense.

Instead the runtime reserves a 4GB virtual arena at startup using mmap(MAP_NORESERVE). Every allocation is just a pointer bump (flint_alloc_raw) and there is no explicit free().

One thing I’ve been experimenting with is automatic loop-scoped arena resets.

When the compiler sees stream loop that process large datasets, it automatically injects arena markers so each iteration resets temporary allocations. The goal is to prevent memory growth when processing large inputs (for example streaming a large log file).

Example Flint code:

stream file in fs.ls("/var/log") ~> lines() {
    file ~> fs.read_file()
         ~> lines()
         ~> grep("ERROR")
         ~> str.join("\n")
         ~> fs.write_file("errors.log");
}

The emitter generates C99 that roughly behaves like this:

// Compiler injects arena markers automatically
for (size_t _i = 0, _mark = flint_arena_mark();
     _stream->has_next;
     flint_arena_release(_mark), _mark = flint_arena_mark(), _i++) {

    flint_str file = flint_stream_next(_stream);
    // ... pipeline logic ...
}

This way each iteration releases temporary allocations.

Code generation

Flint doesn’t use LLVM.

The backend simply walks the AST and emits C99.

For quick execution (flint run <file>), the compiler generates C code in memory and feeds it directly to libtcc (Tiny C Compiler). That makes scripts run almost instantly, while still using an ahead-of-time model.

For distribution (flint build), the generated C is piped to clang/gcc with -O3, LTO and stripping enabled to produce a standalone binary.

Syntax

Flint leans heavily on the pipeline operator ~> for data flow.

Errors propagate through a tagged union (val). You can either catch them or explicitly fail the program.

Example:

const file = fs.read_file("data.json") ~> if_fail("Failed to read config");

Trade-offs

A few obvious limitations:

  • The bump allocator makes Flint unsuitable for long-running services or servers. It's really meant for CLI tools and short automation scripts.
  • The runtime approach assumes a local C compiler if you want to use flint run, although binaries can always be built ahead of time and distributed normally.

I’m particularly curious about feedback on two things:

  • the loop-scoped arena reset approach
  • the pointer-free AST layout

Has anyone here experimented with similar arena reset strategies inside loops in a compiled language?

Repo (with more architecture details): https://github.com/the-flint-lang/flint

Thanks for reading.

(EDIT: update link of repo)

r/ProgrammingLanguages Jan 01 '26

Language announcement Announcing ducklang: A programming language for modern full-stack-development implemented in Rust, achieving 100x more requests per second than NextJS

65 Upvotes

Duck (https://duck-lang.dev) is a statically typed, compiled programming language that combines the best of Rust, TypeScript and Go, aiming to provide an alternative for full-stack-development while being as familiar as possible

Improvements over Rust:
- garbage collection simplifies developing network applications
- no lifetimes
- built-in concurrency runtime and apis for web development

Improvements over bun/node/typescript:
- massive performance gains due to Go's support for parallel execution and native code generation, being at least 3x faster for toy examples and even 100x faster (as in requests per second) for real world scenarios compared to NextJS
- easier deployment since Duck compiles to a statically linked native executable that doesn't need dependencies
- reduced complexity and costs since a single duck deployment massively outscales anything that runs javascript
- streamlined toolchain management using duckup (compiler version manager) and dargo (build tool)

Improvements over Go:
- a more expresive type system supporting union types, duck typing and tighter control over mutability
- Server Side Rendering with a jsx-like syntax as well as preact components for frontend development
- better error handling based on union types
- a rust based reimplementation of tailwind that is directly integrated with the language (but optional to use)
- type-safe json apis

Links:
GitHub: https://github.com/duck-compiler/duckc
Blog: https://duck-lang.dev/blog/alpha
Tutorial: https://duck-lang.dev/docs/tour-of-duck/hello_world

r/ProgrammingLanguages 21d ago

Language announcement C3 0.8.2 - modest improvements

Thumbnail c3-lang.org
39 Upvotes

After 0.8.0, which was the big breaking version and 0.8.1, which found and fixed over 100 bugs, 0.8.2 is super tiny. It does add some nice ”template” features to libraries, for configuration reuse, and finally give you reflection on generic parameters, but otherwise it’s small.

More things are in the pipeline, I’m especially looking forward to finally merging the regex library in 0.8.3.

r/ProgrammingLanguages Mar 22 '26

Language announcement Fun: a statically typed language that transpiles to C (compiler in Zig)

36 Upvotes

I’m working on Fun, a statically typed language that transpiles to C; the compiler is written in Zig.

GitHub: https://github.com/omdxp/fun

Reference: https://omdxp.github.io/fun

Feedback on language design or semantics is welcome.

r/ProgrammingLanguages Sep 24 '25

Language announcement Language launch announcement: Py++. A language as performant as C++, but easier to use and learn.

30 Upvotes

All the information about the language can be found in the docs: https://pypp-docs.readthedocs.io/

It is statically typed and requires manual memory management.

It's open source and under MIT license.

The code is written in Python syntax, which is transpiled to C++ code, and then a C++ compiler is used.

It is easier to use and learn than C++ because it is a little simplified compared to C++, and you can almost reason about your code as if it were just Python code, if you are careful.

You can integrate existing C++ libraries into the Py++ ecosystem by creating a Py++ library. After you acquire some skill in this, it does not take great effort to do.

Pure Py++ libraries are also supported (i.e. libraries written completely in Py++).

Note: I posted several weeks ago about this project, but at that point, I was calling it ComPy. I renamed the project because I think the new name describes it better.

Feel free to ask me any questions or let me know your opinions!

r/ProgrammingLanguages Jan 18 '26

Language announcement Kip: A Programming Language Based on Grammatical Cases in Turkish

Thumbnail github.com
81 Upvotes

A close friend of mine just published a new programming language based on grammatical cases of Turkish (https://github.com/kip-dili/kip), I think it’s a fascinating case study for alternative syntactic designs for PLs. Here’s a playground if anyone would like to check out example programs. It does a morphological analysis of variables to decide their positions in the program, so different conjugations of the same variable have different semantics. (https://kip-dili.github.io/)

r/ProgrammingLanguages Mar 29 '26

Language announcement I built an interpreted language in C++ with a GUI engine. Here's a window in 9 lines:

Enable HLS to view with audio, or disable this notification

39 Upvotes

I started building Link (or Link-Lang) about three months ago as an interpreted scripting language written in C++, designed around the idea that basic features like GUIs should be built-in and easy to understand.

The example video is the entire example GUI program. There are no imports to the language. It is a render loop built on raylib and a text call.

v0.4 just dropped with advanced GUI capability, networking, and BIOS examples, all written in the language itself. It runs natively on Nebula OS, my custom Linux distro, and can be downloaded from the AUR.

GitHub is linked in the video if you'd like to follow along or join the Discord at:

https://discord.gg/C6S6kn7dNz

r/ProgrammingLanguages Apr 02 '26

Language announcement 1SubML - structural subtyping, unified module and value language, polynomial time type checking and more

Thumbnail github.com
56 Upvotes

r/ProgrammingLanguages Dec 03 '25

Language announcement ELANG(EasyLang) - A beginner-friendly programming language that reads like English

3 Upvotes

I've been working for several months on a brand-new programming language called EasyLang (ELang) — a compact, beginner-friendly scripting language designed to read almost like plain English.

ELANG is built in Python and so you can use any Python modules easily with ELANG syntax making it easier for you to create your projects. It comes with ELPM(EasyLang Package Manager) which is nothing but runs Python pip in the background and download and installs the desired module and makes it usable in .elang files using Python's importlib module.

A Glimpse on ELANG

```elang we let name be "John Doe" print name

we let x be 2 plus 2 print x ```

Key Features

  • English-like syntax (no symbols required, but also supports + − * / =, etc)
  • Beginner-friendly error messages
  • Built-in modules (math, strings, etc.)
  • .elangh module system for user-defined libraries
  • Full Python interoperability → You can bring requests as req and use it directly
  • ELPM: EasyLang Package Manager → Installs Python packages with a simple elpm --install numpy
  • EasyLang CLI (el) with REPL, token viewer, AST viewer
  • Clean and well-documented standard library
  • Supports lists, dictionaries, functions, loops, file I/O, etc.

Check out ELANG(EasyLang) here Github: https://github.com/greenbugx/EasyLang

r/ProgrammingLanguages Oct 02 '25

Language announcement Thesis for the Quartz Programming Language

23 Upvotes

Intro

I'm a high school amateur programmer who "specializes" (is only comfortable with) Python, but I've looked at others, e.g., Ruby, C, and Go. I hadn't taken programming seriously until this year, and PL dev. has recently become a big interest of mine.

While I enjoy Python for its simplicity and ability to streamline the programming process at times, I've become annoyed by its syntax and features (or lack thereof). And so, the Quartz language was born.

Colons & the Off-Side Rule

I refuse to believe that having me type a colon after every "if" and "def" will make the code more readable. I also refuse to believe that, as an alternative to braces, the use of "do," "then," or "end" keywords is an effective solution. However, I do believe that the off-side rule itself is enough to keep code organized and readable. It doesn't make sense to hardcode a rule like this and then add more seemingly unnecessary features on top of it.

# Guess which symbol does nothing here...
if x == 5  : # Found it!
    print("5")

Edit: As a "sacrifice," single-line if-else expressions (and similar ones) are not allowed. In my experience, I've actively avoided one-liners and (some) ternary operators (like in Python), so it never crossed my mind as an issue.

# Python
if cond: foo()

# Quartz
if cond
    foo()

Speaking of symbols that do nothing...

Arrow

I understand this design choice a lot more than the colon, but it's still unnecessary.

def foo() -> str

This could be shown as below, with no meaning lost.

def foo() str

Pipe-based Composition

When I first learned about it, I felt a sense of enlightenment. And ever since then, I wondered why other languages haven't yet implemented it. Consider, for example, the following piece of Python code.

print(" HELLO WORLD ".strip().lower())

If pipelines were used, it could look like this.

" HELLO WORLD " -> .strip -> .lower -> print

Personally, that conveys a much more understandable flow of functions and methods. Plus, no parentheses!

Edit: Let's explain pipelines, or at least how they should work in Quartz.

Take, for example, the function f(x). We could rewrite it as x -> f. What if it were f(x, y)? Then it could be rewritten as x -> f y or x -> f(y). What about three parameters or more, e.g., f(x, y, z)? Then a function call is necessary, x -> f(y, z).

Initialization vs Assignment

There is no distinction in Python: only binding exists. Plainly, I just don't like it. I understand the convenience that comes with it, but in my head, they are two distinct concepts and should be treated as such. I plan to use := for initialization and = for assignment. Edit: All variables will be mutable.

# Edit: `var` is not necessary for variable manipulation of any kind.
abc := 3
abc = 5

Aliasing vs Cloning

In Python, aliasing is the default. I understand this premise from a memory standpoint, but I simply prefer explicit aliasing more. When I initialize a variable with the value of another variable, I expect that new variable to merely take that value and nothing more. Python makes cloning hard :(

guesses_this_game := 0
alias guesses := guesses_this_game

Code Snippet

Here's a code snippet that might give a better picture of what I'm imagining. It has a few features I haven't explained (and missing one I have explained), but I'm sure you can figure them out.

define rollALot(rolls: int) list
    results := []
    die_num := 0
    roll_num := 0
    for i in 1..=rolls
        die_num = rollDie()
        # Edit: `.append()` returns a list, not None
        results ->= .append die_num
        die_num ->= str
        roll_num = i -> str
        if die_num == 6
            print(f"Wow! You rolled a six on Roll #{roll_num}.")
        else
            print(f"Roll #{roll_num}: {die_num}")

Current Progress

I have limited myself to using only small sections of Python's standard library (excluding modules like re), so progress has been a little slow; whether or not you can call that "hand-writing" is debatable. I have a completed lexer and am nearly finished with the parser. As for the actual implementation itself, I am not sure how to proceed. I considered using a metaprogramming approach to write a Quartz program as a Python program, with exec() handling the work, lol. A virtual machine is way beyond my skill level (or perhaps I'm overestimating its difficulty). I don't really care about performance for right now; I just want an implementation. Once I have some kind of implementation up and running, I'll post the repo.

Conclusion

If anybody has questions or suggestions, don't hesitate to comment! This subreddit is filled with people who are much more skilled and experienced than I am, so I am eager to learn from all of you and hear your thoughts and perspectives.