Vala (Programmiersprache)

aus Wikipedia, der freien Enzyklopädie
Wechseln zu: Navigation, Suche
Vala
Paradigmen: objektorientiert
Erscheinungsjahr: 2006
Entwickler: Jürg Billeter, Raffaele Sandrini
Aktuelle Version: 0.24.0  (24. März 2014)
Typisierung: statisch, stark
Beeinflusst von: C, C++, C#, Java
Betriebssystem: alle mit ANSI C-Compiler, da Vala C-Code erzeugt
Lizenz: LGPL 2.1+
live.gnome.org/Vala

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 auch Grundlage vieler Bibliotheken der Linux- und Unix-Arbeitsumgebung Gnome 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[Bearbeiten]

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[Bearbeiten]

Im Gegensatz zu Objective-C und, 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:

Speicherverwaltung[Bearbeiten]

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, 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.

Binärkompatibilität[Bearbeiten]

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++, Objective-C und D zur C-Binärschnittstelle (ABI) kompatibel ist.

Bibliotheken[Bearbeiten]

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 Widget-Toolkit GTK+ und dem Oberflächen-Designwerkzeug Glade entwickelt werden.

Codebeispiele[Bearbeiten]

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.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+.

Bindings[Bearbeiten]

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[Bearbeiten]

Valas Basisbibliotheken GLib/GIO und Gee sind auf allen gängigen Plattformen verfügbar, wie etwa verschiedene Unixe, Linux, Mac OS X, 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 natürlich an die jeweilige Plattform gebunden, da es dann in Form von nativem Maschinencode vorliegt.

Verwendung[Bearbeiten]

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 seit 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.

Sonstiges[Bearbeiten]

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

Weblinks[Bearbeiten]