Jürg Billeter ist Autor der Programmiersprache Vala und des Vala-Compilers. Sie erleichtern die Entwicklung von Gtk+- und Gnome-Programmen. Linux-Magazin Online sprach mit dem Entwickler, der kurz vor dem Abschluss seines Infomatikstudiums an der ETH Zürich steht, über das Design seiner Sprache.
Linux-Magazin Online: Was waren die ausschlaggebenden Gründe, eine neue Sprache zu erschaffen?
Jürg Billeter: Ich finde das Schreiben von GObject-Code in C zu aufwändig. Auf der einen Seite muss man einiges mehr schreiben als in modernen Programmiersprache und andererseits kann man mit GObject/C auch einiges nicht statisch, also zur Compile-Zeit, überprüfen.
Linux-Magazin Online: Wieso setzt Du nicht auf Mono oder Java? Es gibt ja bereits recht gute Bindings für diese Sprachen?
Jürg Billeter: Mono, Java und Python als Alternativen haben vor allem zwei Nachteile, der eine ist, dass man auf Bibliotheken, welche in diesen Sprachen geschrieben wurden, nicht vernünftig von C und anderen Programmiersprachen aus zugreifen kann. Der andere Grund ist, dass jede zusätzliche Runtime einen gewissen Speicher- und Startup-Overhead mit sich bringt. Gnome startet um einiges langsamer, wenn sich im Panel neben Applets in C auch noch Applets in Python und Mono befinden. Daher habe ich mir gedacht, dass ich die Vorteile von GObject/C und höheren Programmiersprachen kombinieren möchte.
Zur Compile-Zeit prüfen
Linux-Magazin Online: Du hast vorhin angesprochen, dass sich mit GObject/C nicht alles zur Übersetzungszeit überprüfen lässt. Geht das mit Vala? Wie wird das realisiert?
Jürg Billeter: Ein Beispiel sind Upcasts. Wenn du in C zum Beispiel "gtk_widget_show()" mit einem "GtkButton" aufrufen möchtest, so musst du das explizit casten. Also "gtk_widget_show (GTK_WIDGET (button))". Ob das korrekt ist oder nicht kann der C-Compiler nicht entscheiden, das überprüft GObject erst zur Laufzeit. Der Vala-Compiler hat hier mehr Informationen. "button.show()" reicht völlig und wird zur Compile-Zeit überprüft. Das Problem hier ist einfach, dass C die Typen-Hierarchie nicht kennt und deshalb keine impliziten Upcasts wie beispielsweise von "GtkButton" zu "GtkWidget" zulässt.
Linux-Magazin Online: Der Compiler weiß also, dass "button" vom Typ "GtkButton" ist?
Jürg Billeter: Ja, er weiß das und vor allem weiß er, dass "GtkButton" ein "GtkWidget" ist. Einige weitere Checks sind mit Vala möglich, aber noch nicht im aktuellen Compiler eingebaut.
Linux-Magazin Online: Wie wird das konkret realisiert, wo merkt sich Vala die Hierarchie?
Jürg Billeter: Der Vala-Compiler benötigt für alle Libraries eine API-Definitionsdatei, VAPI genannt. In dieser Datei sind alle erforderlichen Informationen über die Library enthalten.
Linux-Magazin Online: Also auch die Klassenhierarchie?
Jürg Billeter: Ja, auch die Klassenhierarchie.
Ein kurzes Code-Beispiel aus den Vala-Webseiten. Die Syntax lehnt sich an Java und C# an.
Speicherverwaltung
Linux-Magazin Online: Ein weiteres Problem bei C beziehungsweise auch bei C++ ist die Speicherverwaltung. Wird da was in Vala getan und wenn ja, was genau? Wo gibt es noch Probleme bei der Umsetzung?
Jürg Billeter: Vala unterstützt den Programmierer bei der Speicherverwaltung. Dazu benutzt Vala das Reference-Counting von GObject. In C muß bei jeder Zuweisung entschieden werden, ob möglicherweise "g_object_ref()" oder "g_object_unref()" aufgerufen werden sollte, um Abstürze und Speicherlecks zu verhindern. Vala arbeitet ähnlich wie Smart-Pointer in C++, das heißt, dass bei jeder Zuweisung der Referenzzähler korrigiert wird. Dies gibt vor allem in einem Punkt Probleme: zyklischer Garbage kann nicht erkannt werden.
Linux-Magazin Online: Gibt es Bereiche, wo der Programmierer noch selbst Hand anlegen muß, also der Compiler nicht intelligent genug ist?
Jürg Billeter: Dazu gibt es die Möglichkeit, Variablen und Felder mit dem "weak"-Modifier zu versehen. "weak"-Referenzen können das Problem in den meisten Fällen lösen, jedoch ist es manchmal nicht ganz einfach zu entscheiden, welche Referenzen als "weak" markiert werden müssen. Das gleiche Problem betrifft auch GObject-/C-Programme, ist also kein zusätzliches Problem von Vala-Programmen.
Linux-Magazin Online: In C# gibt es unter anderem die Möglichkeit, "unsafe"-Code zu schreiben. Bietet Vala dieses Feature an?
Jürg Billeter: Es gibt keine speziellen "unsafe"-Code-Abschnitte in Vala, es ist jedoch experimentell möglich, in beschränktem Maße direkt Zeiger zu verwenden.
