Est. 2006 Intermediate

Vala

A C#-inspired object-oriented language for the GNOME ecosystem that compiles to plain C and GObject, producing native binaries with no virtual machine or added runtime.

Created by Jürg Billeter, Raffaele Sandrini

Paradigm Multi-paradigm: Object-Oriented, Imperative, Structured
Typing Static, Strong
First Appeared 2006
Latest Version Vala 0.56.19 (March 2026)

Vala is a statically typed, object-oriented programming language created for the GNOME desktop ecosystem. Its pitch is unusual and elegant: give programmers the syntax and conveniences of C# — classes, interfaces, properties, signals, generics, lambdas, async/await — but compile everything down to plain C code targeting GObject, the object system that underpins GTK and the rest of the GNOME platform. The result is a native binary with no virtual machine, no garbage-collected runtime, and no dependencies beyond the GLib libraries that GNOME software links against anyway. For nearly two decades Vala has been the pragmatic middle path for Linux desktop developers: far more expressive than GObject C, far lighter than Mono or the JVM.

History and Origins

Vala was conceived by Jürg Billeter and implemented by Billeter together with Raffaele Sandrini, two Swiss developers who wanted a modern, high-level language for writing GNOME applications. Writing GObject-based code in C was (and is) famously verbose — defining a single class involves pages of boilerplate macros, manual reference counting, and hand-wired signal machinery. The pair admired the syntax and semantics of C#, but adopting it would have meant depending on the Mono runtime, which was both a heavyweight addition to the desktop and, at the time, a source of patent anxiety in the free-software community.

Their answer was to keep the language and discard the runtime. The first Vala compiler was completed in May 2006, initially bootstrapped in C. By July 2007, with the release of version 0.1.0, the compiler had become self-hosting: valac has been written in Vala ever since — a strong early proof that the language was ready for real work.

In 2008 the same compiler infrastructure gained a second front end: Genie, a dialect with Python-like indentation-based syntax that compiles through the identical pipeline. Vala and Genie code can be mixed freely in one project, an early demonstration of how cleanly the compiler separates surface syntax from its GObject-centric core.

Design Philosophy

Vala’s design flows from one central decision: the compiler is a transpiler. valac translates Vala source into C code that uses the GObject type system directly, then hands that C to GCC or Clang. Everything else follows:

  • No added runtime. A Vala program is, after compilation, indistinguishable from a hand-written GObject C program. It links against GLib and whatever libraries it uses — nothing more. There is no VM to start, no JIT to warm up, no tracing garbage collector.
  • Perfect two-way C interoperability. Vala consumes C libraries through lightweight binding files (VAPI files), which describe an existing C API to the compiler. Hundreds of library bindings ship with the compiler, and writing new ones requires annotation, not wrapper code. In the other direction, a library written in Vala exposes an ordinary GObject C API (with a generated header) that C, Python, JavaScript, Rust, and other languages can call — often via GObject Introspection with no extra effort.
  • Memory management without a collector. Vala uses GObject’s reference counting, automated by the compiler. Ownership annotations (owned, unowned, weak) let programmers control when references are counted, and the compiler inserts the ref/unref calls a C programmer would write by hand. Reference cycles are the programmer’s responsibility to break — a deliberate trade-off for deterministic, pause-free behavior.
  • The platform is the standard library. Rather than inventing its own ecosystem, Vala embraces GLib and GIO as its standard library and GTK as its natural UI toolkit. The language is a better way to use the GNOME platform, not a replacement for it.

Because the generated code is ordinary GObject C, a Vala program’s runtime characteristics are essentially those of the equivalent hand-written C — the language adds abstraction at compile time, not execution time.

Key Features

Vala reads like C#, and most of the features a C# or Java programmer expects are present:

  • Classes with single inheritance, interfaces (which may carry default implementations, giving mixin-like reuse), and abstract and virtual methods
  • Properties with get/set blocks and automatic backing fields, mapped onto GObject properties
  • Signals as first-class language members — the observer pattern that pervades GTK programming is a keyword, not a library convention
  • Generics, type inference with var, nullable types (string?), and compile-time null checking
  • Lambdas/closures and delegates
  • async/await asynchronous methods built on GIO’s asynchronous I/O machinery — coroutine-style code without threads
  • Exception-like error handling (throws, try/catch) mapped onto GLib’s GError convention
  • String templates (@"Hello, $name!"), foreach, operator-accessible collections via the Gee library, and D-Bus client/server support generated directly from interface definitions

A small example showing classes, properties, signals, string templates, and type inference:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
public class Greeter : Object {
    public string name { get; set; default = "World"; }

    public signal void greeted (string message);

    public void greet () {
        var message = @"Hello, $name!";
        print ("%s\n", message);
        greeted (message);
    }
}

void main () {
    var greeter = new Greeter ();
    greeter.greeted.connect ((msg) => {
        print ("(signal received: %s)\n", msg);
    });
    greeter.greet ();
}

Compiled with valac greeter.vala, this produces a native executable. Behind the scenes, Greeter becomes a full GObject class — with a registered type, a real GObject property, and a real GObject signal — that any other GNOME-platform language could instantiate and connect to.

Genie

The Genie dialect deserves its own mention: it targets the same compiler and object model but swaps the curly-brace syntax for an indentation-based one reminiscent of Python, with def for methods and init as the entry point. Genie never approached Vala’s adoption, but it remains part of the compiler to this day and stands as one of the few production examples of two syntaxes sharing one language core.

Evolution

Vala’s development has tracked the GNOME platform it serves. After the self-hosting milestone in 2007, the 0.x series advanced steadily — 0.10 in September 2010, 0.20 in March 2013, 0.30 in September 2015 — adding language polish (chained relational expressions, improved async support, better generics) and, release after release, refreshed bindings for the ever-moving GNOME library stack.

From 0.40 (March 2018) onward the project adopted a cadence of long-term support series aligned with GNOME releases, with 0.48 (March 2020) and 0.56 (March 2022, released alongside GNOME 42) following. The 0.56 series brought support for declaring main as an async method and bindings for newer platform libraries such as libsoup 3 and the GTK4-era WebKit. It has remained the current stable series for an unusually long stretch — patch releases continued through 0.56.19 in March 2026 — reflecting a mature language whose changes are now mostly refinement, tooling, and bindings rather than redesign.

Around the compiler, the ecosystem grew practical amenities: first-class support in the Meson build system (the GNOME standard), a community Vala Language Server for IDE integration, the Gee collections library, and the online Vala Playground. Development moved with the rest of GNOME to GitLab (gitlab.gnome.org), where the project is maintained today.

Vala and Its Alternatives

Vala occupies a distinctive point in the design space, best seen by comparison:

ApproachRuntime costGNOME integrationTrade-off
GObject CNoneNativeExtreme boilerplate
ValaNone (compiles to GObject C)NativeSmaller community, GNOME-centric
Python + PyGObjectInterpreterVia introspectionSlower startup, runtime dependency
JavaScript (GJS)JS engineVia introspectionVM overhead, dynamic typing
Rust + gtk-rsNoneVia bindingsSteeper learning curve

For developers committed to the GNOME platform who want static typing and native compilation without C’s ceremony, Vala remains the most direct route.

Current Relevance

Vala is a niche language by industry measures, but an unusually productive niche. Its center of gravity is the elementary OS project, which has built an entire desktop — the Pantheon shell, the Granite framework, AppCenter, and dozens of first-party apps — in Vala, and whose developer documentation teaches Vala as the platform language. Within GNOME proper, applications including Shotwell, Geary, GNOME Boxes, and GNOME Calculator are Vala codebases, and many third-party GTK applications on Flathub are as well. Because Vala apps compile against GLib, they run wherever GLib does; the project has long documented use on Linux, other Unix-like systems, Windows, and macOS, though the desktop-Linux ecosystem is where the language genuinely lives.

Development is active but calm: the compiler sees regular maintenance releases, bindings track new GNOME platform libraries, and the documentation reportedly saw a significant refresh in 2026, the language’s twentieth-anniversary year. The honest caveats are the flip side of its focus — a small contributor base, competition from Rust and GJS for new GNOME code, and limited applicability outside the GObject world.

Why It Matters

Vala matters for two reasons. Practically, it lowered the barrier to native GNOME development for a generation of Linux desktop programmers: whole ecosystems of polished applications — most visibly elementary OS — exist because writing a GObject class stopped requiring a hundred lines of C. Conceptually, it is one of the most successful demonstrations of a transpiled systems language: proof that a language can offer modern, garbage-collection-free ergonomics by compiling onto an existing C object system rather than shipping a runtime. That idea — meet an established ABI where it lives, and let the compiler absorb the boilerplate — prefigured a design conversation that languages keep having. Twenty years on, Vala still does exactly what it promised in 2006: C# comfort, C footprint, GNOME fluency.

Timeline

2006
Jürg Billeter and Raffaele Sandrini complete the first Vala compiler in May 2006, seeking a higher-level alternative to C for GNOME development with C#-like syntax but without depending on Mono
2007
Vala 0.1.0 is released in July 2007 and the compiler becomes self-hosting — valac is from then on written in Vala itself
2008
Genie, a companion dialect with Python-like indentation-based syntax, is created on top of the Vala compiler infrastructure
2010
Vala 0.10.0 is released in September 2010; the following month Ubuntu 10.10 ships the Vala-based photo manager Shotwell as its default, replacing F-Spot
2011
elementary OS publishes its first release, 'Jupiter', in March 2011 and goes on to build its Pantheon desktop, Granite framework, and core applications largely in Vala
2013
Vala 0.20.0 is released in March 2013 as the language matures alongside the GNOME 3 platform
2018
Vala 0.40.0 arrives in March 2018 and becomes a long-term support series widely adopted by Linux distributions
2020
Vala 0.48.0 is released in March 2020 as a new long-term support series
2022
Vala 0.56.0 is released in March 2022, alongside GNOME 42, adding support for async main functions and new library bindings such as libsoup 3.0
2026
The 0.56 long-term support series remains current, with Vala 0.56.19 released in March 2026 as the language marks its 20th anniversary

Notable Uses & Legacy

elementary OS

The Linux distribution builds its Pantheon desktop environment, Granite widget library, AppCenter, and nearly all of its bundled applications in Vala, making it the largest single showcase of the language.

Shotwell

The photo organizer, originally developed by the Yorba Foundation, is written in Vala and served as the default photo manager in Ubuntu (from 10.10) and Fedora for years.

Geary

The lightweight GNOME email client, also begun at Yorba and now maintained under the GNOME umbrella, is implemented in Vala.

GNOME Boxes

GNOME's virtualization and remote-desktop application, which fronts QEMU/KVM and libvirt with a simple interface, is written in Vala.

GNOME Calculator

The stock GNOME calculator is implemented in Vala and C, one of several core GNOME applications that adopted the language.

Budgie

The Budgie desktop environment, originally created for the Solus distribution, has had substantial portions of its components — panel applets and the Raven sidebar among them — written in Vala.

Language Influence

Influenced By

C# C C++ D Java Boo

Influenced

Running Today

Run examples using the official Docker image:

docker pull
Last updated: