„Vala (Programmiersprache)“ – Versionsunterschied

[ungesichtete Version][gesichtete Version]
Inhalt gelöscht Inhalt hinzugefügt
Alter73 (Diskussion | Beiträge)
neues Logo
Markierungen: Mobile Bearbeitung Mobile Web-Bearbeitung
 
(78 dazwischenliegende Versionen von 53 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:

{{Infobox Programmiersprache
{{Infobox Programmiersprache
|Name = Vala
| Name =
| Logo = [[Datei:Vala Logo New.svg]]
|Logo =
|Beschreibung =
| Beschreibung = inoffizielles Logo
|Paradigma = [[Objektorientierte Programmierung|objektorientiert]]
| Paradigma = [[Objektorientierte Programmierung|objektorientiert]]
|Erscheinungsjahr = 2006
| Erscheinungsjahr = <!-- Wikidata -->
|AktuelleVersion = 0.22.1
| AktuelleVersion = <!-- Wikidata -->
|AktuelleVersionFreigabeDatum = 13. November 2013
| AktuelleVersionFreigabeDatum = <!-- Wikidata -->
| AktuelleVorabVersion =
|Entwickler = Jürg Billeter, Raffaele Sandrini
| Designer =
|Typisierung = [[Statische Typisierung|statisch]], [[Starke Typisierung|stark]]
| Entwickler = Rico Tzschichholz (Haupt-), Jürg Billeter, Raffaele Sandrini
|Implementierung =
| AktuelleVorabVersionFreigabeDatum =
|Dialekte =
| Typisierung = [[Statische Typisierung|statisch]], [[Starke Typisierung|stark]]
|Beeinflusst_von = [[C (Programmiersprache)|C]], [[C++]], [[C-Sharp|C#]], [[Java (Programmiersprache)|Java]]
| Implementierung =
|Beeinflusste =
| Dialekte =
|Betriebssystem = alle mit [[ANSI C]]-Compiler, da Vala C-Code erzeugt
| Standardisierungen =
|Lizenz = [[LGPL|LGPL 2.1+]]
| Beeinflusst_von = [[Boo (Programmiersprache)|Boo]], [[C (Programmiersprache)|C]], [[C++]], [[C-Sharp|C#]], [[D (Programmiersprache)|D]], [[Java (Programmiersprache)|Java]]
|Website = [http://live.gnome.org/Vala live.gnome.org/Vala]
| Beeinflusste =
| Betriebssystem = alle mit [[ANSI C|ANSI-C]]-Compiler, da Vala C-Code erzeugt
| Lizenz = [[LGPL|LGPL 2.1+]]
| Website = https://vala.dev/
}}
}}


'''Vala''' ist eine [[Objektorientierte Programmierung|objektorientierte]] [[Programmiersprache]], die ab 2006 von Jürg Billeter und Raffaele Sandrini, die an der [[ETH Zürich]] [[Informatik]] studierten, entwickelt wurde.
'''Vala''' ist eine [[Objektorientierte Programmierung|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-Projekt|Mono]] oder [[Java (Programmiersprache)|Java]]). Zudem ist die [[Binärschnittstelle]] kompatibel mit Applikationen und Bibliotheken, die in C geschrieben sind.
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 (Software)|Mono]] oder [[Java (Programmiersprache)|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-Sharp|C#]] und damit auch an die von [[Java (Programmiersprache)|Java]] angelehnt.
Die Vala-Syntax ist stark an die von [[C-Sharp|C#]] und damit auch an die von [[Java (Programmiersprache)|Java]] angelehnt.
Zeile 32: Zeile 37:


== Sprache ==
== 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]].

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-Sharp|C#]] und damit auch [[Java (Programmiersprache)|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 [[Standardbibliothek]]en absieht.
Die [[Syntax]] ist stark an [[C-Sharp|C#]] und damit auch [[Java (Programmiersprache)|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 [[Standardbibliothek]]en absieht.
Zeile 39: Zeile 43:
Vala ist [[Statische Typisierung|statisch]] und [[Starke Typisierung|stark]] [[Typisierung (Informatik)|typisiert]] und erlaubt [[Typinferenz]] (implizites Typisieren) für lokale Variablen. Vala bietet unter anderem:
Vala ist [[Statische Typisierung|statisch]] und [[Starke Typisierung|stark]] [[Typisierung (Informatik)|typisiert]] und erlaubt [[Typinferenz]] (implizites Typisieren) für lokale Variablen. Vala bietet unter anderem:


* [[Objektorientierte Programmierung|OOP]] ([[Klasse (Programmierung)|Klassen]], [[Vererbung (Programmierung)|Vererbung]], [[Virtuelle Methode]]n, [[Abstrakte Klasse]]n, [[Schnittstelle (Objektorientierung)|Schnittstellen]]/[[Mixin]]s, [[Polymorphie (Programmierung)|Typ-Polymorphie]])
* [[Objektorientierte Programmierung|OOP]] ([[Klasse (Objektorientierung)|Klassen]], [[Vererbung (Programmierung)|Vererbung]], [[Virtuelle Methode]]n, [[Abstrakte Klasse]]n, [[Schnittstelle (Objektorientierung)|Schnittstellen]]/[[Mixin]]s, [[Polymorphie (Programmierung)|Typ-Polymorphie]])
* [[Namensraum|Namensräume]]
* [[Namensraum|Namensräume]]
* Properties (automatische [[Zugriffsfunktion|Getter und Setter]])
* Properties (automatische [[Zugriffsfunktion|Getter und Setter]])
* [[Signal-Slot-Konzept|Signale]]
* [[Signal-Slot-Konzept|Signale]]
* Signalbenachrichtigungen bei Property-Änderungen
* Signalbenachrichtigungen bei Property-Änderungen
* [[Foreach#Die_Foreach-Schleife|Foreach-Schleifen]]
* [[Foreach#Die Foreach-Schleife|Foreach-Schleifen]]
* [[Lambda-Kalkül|Lambda-Ausdrücke]] / [[Closure]]s
* [[Lambda-Kalkül|Lambda-Ausdrücke]] / [[Closure (Funktion)|Closures]]
* [[Generischer Typ|Generische Typen]]
* [[Generischer Typ|Generische Typen]]
* Nicht-nullierbare Typen
* Nicht-nullierbare Typen
Zeile 58: Zeile 62:
* Statische und dynamische [[D-Bus]]-Unterstützung
* Statische und dynamische [[D-Bus]]-Unterstützung


== Speicherverwaltung ==
=== Speicherverwaltung ===
Vala nimmt dem Entwickler die manuelle Speicherverwaltung ab. Statt eines [[Garbage Collection|Garbage Collectors]] wie bei Java oder bei [[.NET (Plattform)|.NET]] kommt automatische [[Referenzzählung]] zum Einsatz. Referenzzählung hat den Vorteil, dass sie [[Determinismus (Algorithmus)|deterministisch]] und [[Echtzeitsystem|echtzeitfähig]] ist, jedoch müssen andererseits im Falle von [[Referenz (Programmierung)|Referenz]]-Zyklen diese manuell vom Entwickler durch den Gebrauch einer schwachen Referenz ''(weak reference)'' gebrochen werden; etwa dann, wenn in einer [[Baum (Graphentheorie)|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 nimmt dem Entwickler die manuelle Speicherverwaltung ab. Statt eines [[Garbage Collection|Garbage Collectors]] wie bei Java oder [[.NET]]/[[Mono-Projekt|Mono]] kommt automatische [[Referenzzählung]] zum Einsatz. Referenzzählung hat den Vorteil, dass sie [[Determinismus (Algorithmus)|deterministisch]] und [[Echtzeitsystem|echtzeitfähig]] ist, jedoch müssen andererseits im Falle von [[Referenz (Programmierung)|Referenz]]-Zyklen diese manuell vom Entwickler durch den Gebrauch einer schwachen Referenz (''weak reference'') gebrochen werden. Etwa, wenn in einer [[Baum (Graphentheorie)|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 [[Zeiger (Informatik)|Zeigern]].
Vala erlaubt optional auch manuelle Speicherverwaltung mit [[Zeiger (Informatik)|Zeigern]].


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


== Bibliotheken ==
=== 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ängigkeit|plattformunabhängiges]] [[Thread (Informatik)|Threading]], [[Eingabe und Ausgabe|Eingabe/Ausgabe]], Dateiverwaltung, Netzwerk-[[Socket (Software)|Sockets]], [[Plug-in]]s, [[Regulärer Ausdruck|Reguläre Ausdrücke]] und vieles mehr bietet. Des Weiteren gibt es eine in Vala geschriebene Bibliothek namens ''Gee'', die generische [[Container (Informatik)|Collection/Container]]-Klassen zur Verfügung stellt.


[[Grafische Benutzeroberfläche]]n können mit dem [[GUI-Toolkit]] [[GTK+]] und dem Oberflächen-Designwerkzeug [[Glade (Programmierwerkzeug)|Glade]] entwickelt werden.
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ängigkeit|plattformunabhängiges]] [[Thread (Informatik)|Threading]], [[Eingabe und Ausgabe|Eingabe/Ausgabe]], Dateiverwaltung, Netzwerk-[[Socket (Software)|Sockets]], [[Plug-in]]s, [[Regulärer Ausdruck|Reguläre Ausdrücke]] und vieles mehr bietet. Des Weiteren gibt es eine in Vala geschriebene Bibliothek namens ''Gee'', die generische [[Container (Informatik)|Collection/Container]]-Klassen zur Verfügung stellt.


=== Bindings ===
[[Grafische Benutzeroberfläche]]n können mit dem Widget-[[Toolkit]] [[GTK+]] und dem Oberflächen-Designwerkzeug [[Glade]] entwickelt werden.
Um eine C-Bibliothek mit Vala nutzbar zu machen, sind keine [[Sprachanbindung|Laufzeit-Bindings]] ([[Wrapper (Software)|Wrapper]]) nötig, sondern lediglich eine statische Beschreibung in einer sogenannten ''vapi''-Datei (Vala [[Programmierschnittstelle|API]]) mit [[Annotation (Programmierung)|annotierter]] Vala-Syntax, die dem Vala-Compiler zur [[Kompilierzeit]] sagt, wie Vala-[[Methode (Programmierung)|Methodenaufrufe]] in C-[[Funktion (Programmierung)|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 [[Simple DirectMedia Layer|SDL]], [[OpenGL]] etc.


== Codebeispiele ==
== Plattformen ==
Valas Basisbibliotheken GLib/GIO und Gee sind auf allen gängigen Plattformen verfügbar, wie etwa verschiedene [[Unix]]e, [[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 [[Maschinensprache|nativem Maschinencode]] vorliegt.


== Verbreitung ==
Anwendungen, die mit Vala entwickelt wurden und bereits einen gewissen Bekanntheitsgrad erlangt haben, sind etwa die Fotoverwaltung [[Shotwell (Programm)|Shotwell]], der [[Twitter]]-Client Pino und das [[Backup]]-Werkzeug Déjà-Dup. Alle drei sind Standard-Anwendungen der Linux-Distribution [[Fedora (Linux-Distribution)|Fedora]] ab Version 13. Auch in [[Ubuntu (Betriebssystem)|Ubuntu]] 10.10 ist Shotwell die vorinstallierte Fotoverwaltung und hat [[F-Spot]] ersetzt. Ubuntus ursprünglich für [[Netbook]]s entwickelte Oberfläche [[Unity (Benutzeroberflä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.<ref>https://www.tiobe.com/tiobe-index/</ref>

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.<ref>{{Internetquelle | autor=Emanuelle Bassi | url=https://www.bassi.io/articles/2017/02/13/on-vala/ | titel=halting problem : On Vala | werk=bassi.io | datum=2017-02-13 | abruf=2017-02-13 | sprache=en}}</ref><ref>https://www.phoronix.com/scan.php?page=news_item&px=GNOME-Vala-Bassi</ref>

Trotz dieser Ankündigung wird Vala auch nach dieseweiterhin 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]]:
Ein minimales [[Hallo-Welt-Programm]]:


<syntaxhighlight lang="vala">
<syntaxhighlight lang="vala">
void main () {
void main() {
print ("Hallo Welt!\n");
print("Hallo Welt!\n");
}
}
</syntaxhighlight>
</syntaxhighlight>
Zeile 87: Zeile 104:


<syntaxhighlight lang="vala">
<syntaxhighlight lang="vala">
class Sample : Object {
class Sample: Object {
void run () {
void run() {
stdout.printf ("Hallo Welt!\n");
stdout.printf("Hallo Welt!\n");
}
}


static void main (string[] args) {
static void main(string[] args) {
var sample = new Sample ();
var sample = new Sample();
sample.run ();
sample.run();
}
}
}
}
Zeile 105: Zeile 122:


int main (string[] args) {
int main (string[] args) {
Gtk.init (ref args);
Gtk.init(ref args);


var window = new Window ();
var window = new Window();
window.title = "Ein einfaches GTK+ Programm";
window.title = "Ein einfaches GTK+ Programm";
window.set_default_size (300, 50);
window.set_default_size(300, 50);
window.position = WindowPosition.CENTER;
window.window_position = WindowPosition.CENTER;
window.destroy.connect (Gtk.main_quit);
window.destroy.connect(Gtk.main_quit);


var button = new Button.with_label ("Klick mich!");
var button = new Button.with_label("Klick mich!");
button.clicked.connect (() => {
button.clicked.connect(() => {
button.label = "Dankeschön";
button.label = "Dankeschön";
});
});


window.add (button);
window.add(button);
window.show_all ();
window.show_all();


Gtk.main ();
Gtk.main();
return 0;
return 0;
}
}
Zeile 127: Zeile 144:


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-Slot-Konzept|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 [[Ereignisschleife|Hauptereignisschleife]] von GTK+.
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-Slot-Konzept|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 [[Ereignisschleife|Hauptereignisschleife]] von GTK+.

== Bindings ==

Um eine C-Bibliothek mit Vala nutzbar zu machen, sind keine [[Sprachanbindung|Laufzeit-Bindings]] ([[Wrapper (Software)|Wrapper]]) nötig, sondern lediglich eine statische Beschreibung in einer sogenannten ''vapi''-Datei (Vala [[Programmierschnittstelle|API]]) mit [[Annotation (Programmierung)|annotierter]] Vala-Syntax, die dem Vala-Compiler zur [[Kompilierzeit]] sagt wie Vala-[[Methode (objektorientierte Programmierung)|Methodenaufrufe]] in C-[[Funktion (Programmierung)|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 [[Simple DirectMedia Layer|SDL]], [[OpenGL]], etc.

== Plattformen ==

Valas Basisbibliotheken GLib/GIO und Gee sind auf allen gängigen Plattformen verfügbar, wie etwa verschiedene [[Unix]]e, [[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 [[Maschinensprache|nativem Maschinencode]] vorliegt.

== Verwendung ==

Anwendungen, die mit Vala entwickelt wurden und bereits einen gewissen Bekanntheitsgrad erlangt haben, sind etwa die Fotoverwaltung [[Shotwell (Programm)|Shotwell]], der [[Twitter]]-Client Pino und das [[Backup]]-Werkzeug Déjà-Dup. Alle drei sind Standard-Anwendungen der Linux-Distribution [[Fedora (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 [[Netbook]]s entwickelte Oberfläche [[Unity (Benutzeroberflä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 ==
== Sonstiges ==

Vala hat eine Schwestersprache namens ''[[Genie (Programmiersprache)|Genie]]'', die ebenfalls die Vala-Compiler-Infrastruktur nutzt und eine [[Python (Programmiersprache)|Python]]-ähnliche Syntax mit statischer Typisierung hat.
Vala hat eine Schwestersprache namens ''[[Genie (Programmiersprache)|Genie]]'', die ebenfalls die Vala-Compiler-Infrastruktur nutzt und eine [[Python (Programmiersprache)|Python]]-ähnliche Syntax mit statischer Typisierung hat.

== Literatur ==
* {{Literatur | Autor=Christian Meyer | Titel=Vala - Sprache und Compiler für das GObject-Typensystem | TitelErg=GObject ohne Kopfschmerzen | Sammelwerk=Linux-Magazin | Band=6 | Datum=2007-11-07 | Online=[https://web.archive.org/web/20170517210101/http://www.linux-magazin.de/Online-Artikel/GObject-ohne-Kopfschmerzen Online] | Abruf=2019-08-13}}


== Weblinks ==
== Weblinks ==
* [http://live.gnome.org/Vala Website des Vala-Projektes]
* [https://wiki.gnome.org/Projects/Vala Website des Vala-Projektes]
* [https://wiki.gnome.org/Projects/Vala/Tutorial Vala-Tutorial]
* [http://valadoc.org Online-API-Dokumentation]
* [https://valadoc.org Online-API-Dokumentation]
* [https://wiki.gnome.org/Projects/Vala/Examples Vala-Beispielcode]
* [http://www.freiesmagazin.de/ftp/2011/freiesMagazin-2011-01.pdf Programmieren mit Vala] (PDF; 1,8&nbsp;MB) – Artikel in ''freiesMagazin'', Ausgabe 01/2011
* [http://www.freiesmagazin.de/ftp/2011/freiesMagazin-2011-01.pdf Programmieren mit Vala] (PDF; 1,8&nbsp;MB) – Artikel in ''freiesMagazin'', Ausgabe 01/2011
* [http://www.linux-magazin.de/online_artikel/gobject_ohne_kopfschmerzen GObject ohne Kopfschmerzen] – Online-Artikel des Linux-Magazins (7. November 2007)
* [http://www.linux-magazin.de/Online-Artikel/Vorteile-kombinieren Vorteile kombinieren] – Interview mit dem Vala-Autor Jürg Billeter (8. November 2007)
* [https://jpaflacerda.wordpress.com/2011/11/08/vala-benchmarking/ Benchmarkvergleich zwischen C++, Mono, C und Vala] (8. November 2011, englisch)
* [http://www.linux-magazin.de/online_artikel/vorteile_kombinieren Vorteile kombinieren] – Interview mit dem Vala-Autor Jürg Billeter (8. November 2007)
* [http://jpaflacerda.wordpress.com/2011/11/08/vala-benchmarking/] Benchmark vergleich zwischen C++, Mono, C und Vala (8. November 2011)
* [https://valasprache.wordpress.com Vala Tutorial für Java-Entwickler] (2. April 2012)

* [http://valasprache.wordpress.com/] – Vala Tutorial für Java Entwickler (2. April 2012)
== Einzelnachweise ==
<references />


[[Kategorie:GTK (Programmbibliothek)]]
[[Kategorie:Objektorientierte Programmiersprache]]
[[Kategorie:Objektorientierte Programmiersprache]]

Aktuelle Version vom 28. Juni 2024, 23:26 Uhr

Vala

inoffizielles Logo
Basisdaten
Paradigmen: objektorientiert
Erscheinungsjahr: 2006
Entwickler: Rico Tzschichholz (Haupt-), Jürg Billeter, Raffaele Sandrini
Aktuelle Version 0.57.0[1] (11. April 2023)
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+
https://vala.dev/

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:

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.[2]

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.[3][4]

Trotz dieser Ankündigung wird Vala auch nach dieseweiterhin 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:

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]).

Einzelnachweise

  1. Release 0.57.0. 11. April 2023 (abgerufen am 4. Mai 2023).
  2. https://www.tiobe.com/tiobe-index/
  3. Emanuelle Bassi: halting problem : On Vala. In: bassi.io. 13. Februar 2017, abgerufen am 13. Februar 2017 (englisch).
  4. https://www.phoronix.com/scan.php?page=news_item&px=GNOME-Vala-Bassi