# Vala (Programmiersprache)

Vala ist eine objektorientierte Programmiersprache, die ab 2006 von Jürg Billeter und Raffaele Sandrini, die an der ETH Zürich Informatik studierten, entwickelt wurde.
Vala hat das Ziel, eine moderne Programmiersprache für die Entwicklung mit dem Objektsystem GObject (das Fundament aller GTK+-/Gnome-Anwendungen) zu bieten, ohne die Notwendigkeit einer zusätzlichen Laufzeitbibliothek (im Gegensatz zu Mono oder Java). Zudem ist die Binärschnittstelle kompatibel mit Applikationen und Bibliotheken, die in C geschrieben sind.
Die Vala-Syntax ist stark an die von C# und damit auch an die von Java angelehnt.

## Compiler

Der Vala-Compiler übersetzt den Vala-Quelltext in C-Quelltext und lässt den Rest vom C-Compiler erledigen.
Diese Technik ist für viele Programmiersprachen weniger geeignet, weil sich damit z. B. Exceptions oder arithmetische Überläufe nicht effizient abfangen lassen. Da Vala aber ohnehin direkt auf C-Schnittstellen aufsetzt, fällt diese Einschränkung weniger ins Gewicht als bei Sprachen wie Eiffel oder Haskell.
Der Vorteil ist, dass der C-Compiler bereits Backends für sämtliche Prozessorarchitekturen mit sich bringt und Vala von dessen Optimierungen profitieren kann. Auch kann ein Entwickler die generierten C-Quelltexte zusätzlich zu den Vala-Quelltexten veröffentlichen, so dass nicht einmal der Vala-Compiler zum Kompilieren des Programms benötigt wird. Dies wird etwa beim Vala-Compiler getan, um das Henne-Ei-Problem zu lösen, da der Vala-Compiler selbst in Vala geschrieben ist (self-hosting).

## Sprache

Im Gegensatz zu Objective-C, sowie mit geringen Ausnahmen C++, ist Vala keine Erweiterung von C, da C keine Teilmenge der Vala-Syntax ist. Somit ist Vala auch kein C-Präprozessor.
Die Syntax ist stark an C# und damit auch Java angelehnt, jedoch ist weder Vala eine Teilmenge von C# noch umgekehrt. C#-Programme lassen sich also nicht mit Vala kompilieren, selbst wenn man von den erheblichen Unterschieden der Standardbibliotheken absieht.
Vala ist statisch und stark typisiert und erlaubt Typinferenz (implizites Typisieren) für lokale Variablen. Vala bietet unter anderem:
* OOP (Klassen, Vererbung, Virtuelle Methoden, Abstrakte Klassen, Schnittstellen/Mixins, Typ-Polymorphie)
* Namensräume
* Properties (automatische Getter und Setter)
* Signale
* Signalbenachrichtigungen bei Property-Änderungen
* Foreach-Schleifen
* Lambda-Ausdrücke / Closures
* Generische Typen
* Nicht-nullierbare Typen
* Assistierte Speicherverwaltung (automatische Referenzzählung)
* Deterministische Destruktoren (ermöglicht RAII)
* Ausnahmebehandlung (Checked Exceptions)
* Asynchrone Methoden (Koroutinen)
* Vorbedingungen und Nachbedingungen (Design by contract)
* Typinformation zur Laufzeit (RTTI)
* Verbatim Strings (Zeichenketten ohne Interpretation von Escape-Sequenzen und über mehrere Zeilen hinweg)
* Bedingte Kompilierung
* Statische und dynamische D-Bus-Unterstützung

### Speicherverwaltung

Vala nimmt dem Entwickler die manuelle Speicherverwaltung ab. Statt eines Garbage Collectors wie bei Java oder bei .NET kommt automatische Referenzzählung zum Einsatz. Referenzzählung hat den Vorteil, dass sie deterministisch und echtzeitfähig ist, jedoch müssen andererseits im Falle von Referenz-Zyklen diese manuell vom Entwickler durch den Gebrauch einer schwachen Referenz (weak reference) gebrochen werden; etwa dann, wenn in einer Baum-Datenstruktur ein Element eine Referenz auf sein Elternelement hält und dieses wiederum eine Referenz auf das Kindelement, beide also gegenseitig aufeinander verweisen.
Vala erlaubt optional auch manuelle Speicherverwaltung mit Zeigern.

## Bibliotheken
### Binärkompatibilität

In Vala entwickelte Bibliotheken sind valide C-Bibliotheken und können von C-Entwicklern direkt benutzt werden, da Vala im Gegensatz zu Sprachen wie C++ und D zur C-Binärschnittstelle (ABI) kompatibel ist.

### Standardbibliothek

Als Standardbibliothek verwendet Vala die GLib samt ihren Unter-Modulen GIO, GObject, GModule, die für die meisten Systeme verfügbar ist und Dinge wie plattformunabhängiges Threading, Eingabe/Ausgabe, Dateiverwaltung, Netzwerk-Sockets, Plug-ins, Reguläre Ausdrücke und vieles mehr bietet. Des Weiteren gibt es eine in Vala geschriebene Bibliothek namens Gee, die generische Collection/Container-Klassen zur Verfügung stellt.
Grafische Benutzeroberflächen können mit dem GUI-Toolkit GTK+ und dem Oberflächen-Designwerkzeug Glade entwickelt werden.

### Bindings

Um eine C-Bibliothek mit Vala nutzbar zu machen, sind keine Laufzeit-Bindings (Wrapper) nötig, sondern lediglich eine statische Beschreibung in einer sogenannten vapi-Datei (Vala API) mit annotierter Vala-Syntax, die dem Vala-Compiler zur Kompilierzeit sagt, wie Vala-Methodenaufrufe in C-Funktionsaufrufe transformiert werden sollen. Diese Dateien lassen sich für GObject-basierte Bibliotheken semi-automatisch generieren, für nicht auf GObject basierende C-Bibliotheken müssen sie von Hand geschrieben werden. Für eine Vielzahl von Bibliotheken sind bereits Bindings vorhanden, unter anderem auch für nicht auf GObject basierende C-Bibliotheken wie die Multimediabibliothek SDL, OpenGL etc.

## Plattformen

Valas Basisbibliotheken GLib/GIO und Gee sind auf allen gängigen Plattformen verfügbar, wie etwa verschiedene Unixe, Linux, macOS und Windows. Die einzigen Voraussetzungen für Vala sind die GLib und ein C-Compiler. Vala ist also nicht an Gnome gebunden. Sofern der Entwickler Dinge wie plattformabhängige Pfadangaben und nicht-plattformübergreifende Bibliotheken vermeidet und stattdessen die Abstraktionen der GLib nutzt, kann er mit Vala plattformübergreifende Anwendungen entwickeln. Auch GTK+ gibt es für die verschiedenen Betriebssysteme. Ein zu Binärcode kompiliertes Vala-Programm ist an die jeweilige Plattform gebunden, da es dann in Form von nativem Maschinencode vorliegt.

## Verbreitung

Anwendungen, die mit Vala entwickelt wurden und bereits einen gewissen Bekanntheitsgrad erlangt haben, sind etwa die Fotoverwaltung Shotwell, der Twitter-Client Pino und das Backup-Werkzeug Déjà-Dup. Alle drei sind Standard-Anwendungen der Linux-Distribution Fedora ab Version 13. Auch in Ubuntu 10.10 ist Shotwell die vorinstallierte Fotoverwaltung und hat F-Spot ersetzt. Ubuntus ursprünglich für Netbooks entwickelte Oberfläche Unity wird in Vala entwickelt, ebenso der DLNA/UPnP-Medienserver Rygel, der unter anderem beim GNOME-Projekt eingesetzt wird. Der Vala-Compiler selbst ist ein Beispiel für ein größeres, in Vala geschriebenes Kommandozeilen-Projekt.
Im TIOBE-Index Stand April 2018 wurde Vala zwischen Platz 51 und 100 gelistet.
Dennoch bezeichnete GNOME-Entwickler Emanuelle Bassi Vala als tote Sprache und riet 2017 davon ab, Vala als Programmiersprache für neue Anwendungen zu wählen.
Trotz dieser Ankündigung wird Vala auch weiterhin für Gtk+ basierende Programme eingesetzt, beispielsweise ist es die bevorzugte Sprache der elementary OS Entwickler und erhielt im Juni 2022 auch eine eigene Website.

## Codebeispiele

Ein minimales Hallo-Welt-Programm:
Eine komplexere Variante, die einige objektorientierte Eigenschaften von Vala demonstriert:
Dieses Codebeispiel demonstriert ein einfaches GTK+-Programm:
Dieses Programm initialisiert GTK+, erzeugt ein Hauptfenster, setzt dessen Titel, Größe und Position, fügt dem Fenster eine Schaltfläche hinzu und verbindet deren Signal, das bei einem Mausklick ausgelöst wird, mit einer anonymen Rückruffunktion, welche die Beschriftung der Schaltfläche ändert, und startet schließlich die Hauptereignisschleife von GTK+.

## Sonstiges

Vala hat eine Schwestersprache namens Genie, die ebenfalls die Vala-Compiler-Infrastruktur nutzt und eine Python-ähnliche Syntax mit statischer Typisierung hat.