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 | |
---|---|
Paradigmen: | objektorientiert |
Erscheinungsjahr: | 2006 |
Entwickler: | Rico Tzschichholz (Haupt-), Jürg Billeter, Raffaele Sandrini |
Aktuelle Version | 0.54.1[1] (21. September 2021) |
Typisierung: | statisch, stark |
Beeinflusst von: | Boo, C, C++, C#, D, Java |
Betriebssystem: | alle mit ANSI-C-Compiler, da Vala C-Code erzeugt |
Lizenz: | LGPL 2.1+ |
wiki.gnome.org/Projects/Vala |
Vala hat das Ziel, eine moderne Programmiersprache für die Entwicklung mit dem Objektsystem GObject (das Fundament aller GTK+-/Gnome-Anwendungen ist) 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 .NET/Mono 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 wird Vala zwischen Platz 51 und 100 gelistet.[2]
Dennoch bezeichnete GNOME-Entwickler Emanuelle Bassi Vala als tote Sprache und riet davon ab, Vala als Programmiersprache für neue Anwendungen zu wählen.[3][4]
Codebeispiele
Ein minimales Hallo-Welt-Programm:
void main() {
print("Hallo Welt!\n");
}
Eine komplexere Variante, die einige objektorientierte Eigenschaften von Vala demonstriert:
class Sample: Object {
void run() {
stdout.printf("Hallo Welt!\n");
}
static void main(string[] args) {
var sample = new Sample();
sample.run();
}
}
Dieses Codebeispiel demonstriert ein einfaches GTK+-Programm:
using Gtk;
int main (string[] args) {
Gtk.init(ref args);
var window = new Window();
window.title = "Ein einfaches GTK+ Programm";
window.set_default_size(300, 50);
window.window_position = WindowPosition.CENTER;
window.destroy.connect(Gtk.main_quit);
var button = new Button.with_label("Klick mich!");
button.clicked.connect(() => {
button.label = "Dankeschön";
});
window.add(button);
window.show_all();
Gtk.main();
return 0;
}
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.
Literatur
- Christian Meyer: Vala - Sprache und Compiler für das GObject-Typensystem. GObject ohne Kopfschmerzen. In: Linux-Magazin. Band 6, 7. November 2007 (Online [abgerufen am 13. August 2019]).
Weblinks
- Website des Vala-Projektes
- Vala-Tutorial
- Online-API-Dokumentation
- Vala-Beispielcode
- Programmieren mit Vala (PDF; 1,8 MB) – Artikel in freiesMagazin, Ausgabe 01/2011
- Vorteile kombinieren – Interview mit dem Vala-Autor Jürg Billeter (8. November 2007)
- Benchmarkvergleich zwischen C++, Mono, C und Vala (8. November 2011, englisch)
- Vala Tutorial für Java-Entwickler (2. April 2012)
Einzelnachweise
- vala 0.54.1.
- https://www.tiobe.com/tiobe-index/
- Emanuelle Bassi: halting problem : On Vala. In: bassi.io. 13. Februar 2017, abgerufen am 13. Februar 2017 (englisch).
- https://www.phoronix.com/scan.php?page=news_item&px=GNOME-Vala-Bassi