Wer Programme in C schreiben möchte und dennoch etwas Komfort erwartet, kommt nicht um eine vernünftige C-Bibliothek herum. GObject, das in der GLib enthalten ist, zeichnet sich seit Jahren als der Standard in diesem Bereich aus. GObject bietet moderne objektorientierte Konzepte wie Klassen, Interfaces, virtuelle Methoden, Unterstützung für Callback-Funktionen und vieles mehr. Praktisch alle Gtk+-Programme, enthalten GObject-Code. Aufgrund seiner C-Natur muss der Programmierer jedoch unweigerlich mehr Code schreiben, als das beispielsweise in Java der Fall ist. Der so genannte Boilerplate-Code ist für manch einen Entwickler zu komplex und schwer zu verstehen, besonders wenn er die Grundlagen zu GObject nicht kennt. Der Schritt in die Richtung, auf C++, C# oder Java zu setzen, scheint auch nicht immer eine geeignete Lösung zu sein. Also am besten eine neue Sprache erfinden?
Eine neue Sprache
Es ist keine triviale Aufgabe, eine neue Programmiersprache zu erfinden, und die meisten Entwickler schrecken zu Recht davor zurück. Schon einfache Sprachen, wie zum Beispiel C, sind in der Umsetzung äußerst komplex. Jürg Billeter, ein Informatik-Student der ETH-Zürich, schuf Mitte Juli 2006 Vala. Dabei kam etwas heraus, das in Features und Syntax an eine Mischung aus C++, C# und Java erinnert. Ziel war es jedoch nicht, einen neuen Konkurrenten für die bereits etablierten Sprachen zu erschaffen, sondern Entwicklern eine Möglichkeit zu geben, GObject-basierende Anwendungen ohne Kopfschmerzen umzusetzen. Dies ist mitunter einer der Gründe, weshalb Vala viele Eigenschaften enthält, die üblicherweise nur in GObject zu finden sind. Anders als gängige Compiler übersetzt Vala den Quelltext des Programmierers nicht direkt in maschinenlesbaren Binärcode, sondern in ANSI-C. Mit der Ausgabeoption "valac -o test test.vala" besteht allerdings die Möglichkeit, den resultierenden "Zwischencode" direkt an den C-Compiler zu übergeben.
Dieses Stückchen Vala-Code bildet das Grundgerüst für ein Plugin für den Mediaplayer Rhythmbox.
Vala-Features
Vala unterstützt sämtliche moderne Features aus der Welt der Objektorientierung, die heutige Programmiersprachen beherrschen. Dazu zählen, um nur einige zu nennen:
- Interfaces (Java und C#)
- abstrakte Klassen (Java, C++, C#)
- virtuelle Methoden (Java, C++, C#)
- Properties (C#),
- Generics/Templates (Java, C++, C#)
- Non-null-Typen
- Polymorphismus (Java, C++, C#)
- Ausnahmebehandlung (Java, C++, C#)
Zusätzlich, und hier zeigt sich die Verbindung zu GObject, existiert das Schlüsselwort "signal". Methoden die Sie damit einleiten, verbinden Sie im weiteren Programmablauf mit einem Slot. Mit den von C# her bekannten "delegate"-Methoden kann Vala ebenfalls umgehen: Genauer gesagt handelt es sich hier im eigentlichen Sinne nur um die von C bekannten Funktionszeiger, die Sie an Funktionen übergeben. Bisher unterstützt Vala nur statische Handler-Methoden, die einer bestimmten Klasse beziehungsweise eines Typs zugeordnet sind. Ein Nachteil, der dadurch entsteht ist, dass sich der Zugriff auf eine Instanz nicht realisieren lässt. In einer der nächsten Versionen weiß der Compiler aber auch mit Instanzmethoden, die Sie per Parameter übergeben, umzugehen. In C ist das durch die Übergabe eines Funktionszeigers samt Funktionsparameter bereits gängige Praxis und taucht auch in vielen Stellen der GLib auf: "g_hash_table_foreach (GHashTable *htable, GHFunc func, gpointer user_data)".
