Vala (Programmiersprache) - Vala (programming language)

Vala
Vala Logo.svg
Paradigma Multiparadigma : Imperativ , Strukturiert , Objektorientiert
Entwickler Jürg Billeter, Raffaele Sandrini
Erstmals erschienen 2006 ; vor 15 Jahren ( 2006 )
Stabile Version
Schreibdisziplin Statisch , stark , abgeleitet , strukturell
Betriebssystem Plattformübergreifend, alle von GLib unterstützt , aber nur als Quellcode vertrieben.
Lizenz LGPLv2.1+
Dateinamenerweiterungen .vala, .vapi
Webseite wiki .gnome .org /Projekte /Vala
Beeinflusst von
C , C++ , C# , D , Java , Boo

Vala ist eine objektorientierte Programmiersprache mit einem selbsthostenden Compiler , der C- Code generiert und das GObject- System verwendet.

Vala ist C# syntaktisch ähnlich und enthält bemerkenswerte Funktionen wie anonyme Funktionen , Signale , Eigenschaften , Generika , unterstützte Speicherverwaltung , Ausnahmebehandlung , Typrückschluss und foreach- Anweisungen. Die Entwickler, Jürg Billeter und Raffaele Sandrini, wollten diese Funktionen mit geringem Overhead und ohne spezielle Laufzeitunterstützung in die einfache C- Laufzeit bringen, indem sie auf das GObject- Objektsystem abzielen . Anstatt direkt in Maschinencode oder Assembler zu kompilieren, kompiliert es in eine niedrigere Zwischensprache . Es wird von Source zu Source nach C kompiliert , das dann mit einem C-Compiler für eine bestimmte Plattform wie GCC oder Clang kompiliert wird .

Mit Funktionalität von nativen Code - Bibliotheken erfordert vapi Schreiben von Dateien, die Bibliothek zu definieren Schnittstellen . Das Schreiben dieser Schnittstellendefinitionen ist für C-Bibliotheken gut dokumentiert, insbesondere wenn sie auf GObject basieren. Für eine Vielzahl von Bibliotheken sind bereits Bindings verfügbar, auch für C-Bibliotheken, die nicht auf GObject basieren, wie die Multimediabibliothek SDL , OpenGL usw.

Beschreibung

Vala ist eine Programmiersprache, die die High-Level- Build-Time-Performance von Skriptsprachen mit der Run-Time-Performance von Low-Level- Programmiersprachen kombiniert . Es zielt darauf ab, GNOME- Entwicklern moderne Programmiersprachenfunktionen zur Verfügung zu stellen , ohne zusätzliche Laufzeitanforderungen aufzuerlegen und ohne eine andere ABI zu verwenden , im Vergleich zu Anwendungen und Bibliotheken, die in C geschrieben sind. Die Syntax von Vala ähnelt C# , wurde jedoch modifiziert, um besser zum GObject-Typsystem zu passen .

Geschichte

Vala wurde von Jürg Billeter konzipiert und von ihm und Raffaele Sandrini implementiert, der sich eine höherwertige Alternative für die Entwicklung von GNOME- Anwendungen anstelle von C wünschte . Sie mochten die Syntax und Semantik von C#, wollten aber Mono nicht verwenden , also machten sie fertig ein Compiler im Mai 2006. Zunächst wurde er mit C gebootet , und ein Jahr später (mit der Veröffentlichung der Version 0.1.0 im Juli 2007) wurde der Vala-Compiler selbst gehostet . Ab 2021 ist der aktuelle stabile Release-Zweig mit langfristigem Support 0.48, und die Sprache befindet sich in der aktiven Entwicklung mit dem Ziel, eine stabile Version 1.0 zu veröffentlichen.

Ausführung Veröffentlichungsdatum
Alte Version, nicht mehr gepflegt: 0.0.1 2006-07-15
Alte Version, nicht mehr gepflegt: 0.1,0 2007-07-09
Alte Version, nicht mehr gepflegt: 0.10.0 2010-09-18
Alte Version, nicht mehr gepflegt: 0.20.0 2013-05-27
Alte Version, nicht mehr gepflegt: 0.30.0 2015-09-18
Alte Version, nicht mehr gepflegt: 0,40,0 2018-05-12
Alte Version, nicht mehr gepflegt: 0,42,0 2018-09-01
Alte Version, nicht mehr gepflegt: 0,44.0 2019-05-09
Alte Version, nicht mehr gepflegt: 0,46,0 2019-09-05
Aktuelle stabile Version: 0.48.18 2021-06-09
Aktuelle stabile Version: 0.50.9 2021-06-04
Aktuelle stabile Version: 0,52,4 2021-06-04
Legende:
Alte Version
Ältere Version, noch gepflegt
Letzte Version
Neueste Vorschauversion
Zukünftige Veröffentlichung
Bei alten Versionen werden nur die ersten Point-Releases aufgeführt

Sprachdesign

Merkmale

Vala verwendet GLib und seine Submodule (GObject, GModule, GThread, GIO) als Kernbibliothek, die für die meisten Betriebssysteme verfügbar ist und Dinge wie plattformunabhängiges Threading , Eingabe/Ausgabe , Dateiverwaltung , Netzwerk-Sockets , Plugins , reguläre Ausdrücke, bietet. usw. Die Syntax von Vala unterstützt derzeit moderne Sprachfunktionen wie folgt:

Grafische Benutzeroberflächen können mit dem GTK GUI Toolkit und dem Glade GUI Builder entwickelt werden .

Speicherverwaltung

Für die Speicherverwaltung bietet das GType- oder GObject-System eine Referenzzählung . In C muss ein Programmierer das Hinzufügen und Entfernen von Verweisen manuell verwalten, aber in Vala wird die Verwaltung solcher Verweiszählungen automatisiert, wenn ein Programmierer die eingebauten Verweistypen der Sprache anstelle von einfachen Zeigern verwendet. Das einzige Detail, über das Sie sich Gedanken machen müssen, ist, die Generierung von Referenzzyklen zu vermeiden , da in diesem Fall dieses Speicherverwaltungssystem nicht richtig funktioniert.

Optional erlaubt Vala auch eine manuelle Speicherverwaltung mit Zeigern .

Bindungen

Vala soll Laufzeitzugriff auf vorhandene C-Bibliotheken, insbesondere auf GObject-basierte Bibliotheken, ohne Laufzeitbindungen ermöglichen. Um eine Bibliothek mit Vala zu verwenden, ist lediglich eine API-Datei (.vapi) erforderlich, die die Klassen- und Methodendeklarationen in Vala-Syntax enthält. C++-Bibliotheken werden jedoch nicht unterstützt. Derzeit sind Vapi-Dateien für einen großen Teil des GNU- Projekts und der GNOME-Plattform in jeder Vala-Version enthalten, einschließlich GTK . Es gibt auch eine in Vala geschriebene Bibliothek namens Gee, die GObject-basierte Schnittstellen und Klassen für häufig verwendete Datenstrukturen bereitstellt .

Es sollte auch leicht möglich sein, einen Binding-Generator für den Zugriff auf Vala-Bibliotheken aus Anwendungen zu schreiben, die in anderen Sprachen geschrieben sind, z .

Werkzeuge

Herausgeber

Die Werkzeuge für die Vala-Entwicklung haben sich in den letzten Jahren deutlich verbessert. Im Folgenden finden Sie eine Liste einiger beliebter IDEs und Texteditoren mit Plug-Ins, die die Programmierung in Vala unterstützen:

Codeintelligenz

Derzeit gibt es zwei aktiv in der Entwicklung befindliche Sprachserver, die Codeintelligenz für Vala wie folgt anbieten :

  • benwaffle/vala-language-server, entwickelt für jeden Editor, der LSP unterstützt , einschließlich VSCode, vim und GNOME Builder
  • esodan/gvls, derzeit der Standard-Sprachserver für Vala im GNOME Builder und unterstützt jeden Editor mit Unterstützung für LSP

Build-Systeme

Derzeit gibt es eine Reihe von Build-Systemen, die Vala unterstützen, darunter Automake , CMake , Meson und andere.

Debugging

Das Debugging für Vala-Programme kann entweder mit GDB oder LLDB durchgeführt werden . Zum Debuggen in IDEs ,

Beispiele

Hallo Welt

Ein einfaches " Hallo Welt! "-Programm in Vala:

void main () {
	print ("Hello World\n");
}

Wie zu sehen ist, gibt es in Vala im Gegensatz zu C oder C++ keine Header-Dateien. Die Anbindung an Bibliotheken erfolgt durch Angabe von --pkgParametern beim Kompilieren. Außerdem ist die GLib-Bibliothek immer verlinkt und ihr Namespace kann weggelassen werden ( printist tatsächlich GLib.print).

Objekt orientierte Programmierung

Unten ist eine komplexere Version, die eine Unterklasse definiert, HelloWorlddie von der Basisklasse erbt GLib.Object, auch bekannt als die GObject- Klasse. Es zeigt einige der objektorientierten Funktionen von Vala :

class HelloWorld: Object {
	private uint year = 0;
	
	public HelloWorld () {
	}
	
	public HelloWorld.with_year (int year) {
		if (year>0)
			this.year = year;
	}

	public void greeting () {
		if (year == 0)
			print ("Hello World\n");
		else
			/* Strings prefixed with '@' are string templates. */
			print (@"Hello World, $(this.year)\n"); 
	}
}

void main (string[] args) {
	var helloworld = new HelloWorld.with_year (2021);
	helloworld.greeting ();
}

Wie im Fall der GObject-Bibliothek unterstützt Vala keine Mehrfachvererbung , aber eine Klasse in Vala kann eine beliebige Anzahl von Schnittstellen implementieren , die Standardimplementierungen für ihre Methoden enthalten können. Hier ist ein Beispielcode, um eine Vala-Schnittstelle mit Standardimplementierung zu demonstrieren (manchmal als Mixin bezeichnet )

using GLib;

interface Printable {
	public abstract string print ();

	public virtual string pretty_print () {
		return "Please " + print ();
	}
}

class NormalPrint: Object, Printable {
	string print () {
		return "don't forget about me";
	}
}

class OverridePrint: Object, Printable {
	string print () {
		return "Mind the gap";
	}

	public override string pretty_print () {
		return "Override";
	}
}

void main (string[] args) {
	var normal = new NormalPrint ();
	var overridden = new OverridePrint ();

	print (normal.pretty_print ());
	print (overridden.pretty_print ());
}

Signale und Rückrufe

Unten ist ein einfaches Beispiel, um zu zeigen, wie man ein Signal in einer nicht kompakten Klasse definiert, die ein Signalsystem von Vala über GLib eingebaut hat. Dann werden Callback- Funktionen für das Signal einer Instanz der Klasse registriert. Die Instanz kann das Signal ausgeben und jede Callback-Funktion (auch als Handler bezeichnet), die mit dem Signal für die Instanz verbunden ist, wird in der Reihenfolge aufgerufen, in der sie verbunden wurden:

class Foo {
    public signal void some_event ();   // definition of the signal

    public void method () {
        some_event ();                  // emitting the signal (callbacks get invoked)
    }
}

void callback_a () {
    stdout.printf ("Callback A\n");
}

void callback_b () {
    stdout.printf ("Callback B\n");
}

void main () {
    var foo = new Foo ();
    foo.some_event.connect (callback_a);      // connecting the callback functions
    foo.some_event.connect (callback_b);
    foo.method ();
}

Einfädeln

Ein neuer Thread in Vala ist ein Codeabschnitt, beispielsweise eine Funktion, die zur Laufzeit gleichzeitig ausgeführt werden soll. Das Anlegen und Synchronisieren neuer Threads erfolgt über die ThreadKlasse in GLib, die beim Anlegen neuer Threads die Funktion als Parameter übernimmt, wie im folgenden (sehr vereinfachten) Beispiel gezeigt:

int question(){
    // Some print operations 
    for (var i = 0; i < 3; i++){
        print (".");
        Thread.usleep (800000);
        stdout.flush ();
    }

    return 42;
}

void main () {
    if (!Thread.supported ()) {
        stderr.printf ("Cannot run without thread support.\n");
        return;
    }
    print ("The Ultimate Question of Life, the Universe, and Everything");
    // Generic parameter is the type of return value
    var thread = new Thread<int> ("question", question);

    print(@" $(thread.join ())\n");
}

Grafische Benutzeroberfläche

Unten sehen Sie ein Beispiel mit GTK zum Erstellen einer GUI "Hello, World!" Programm (siehe auch GTK hello world ) in Vala:

using Gtk;

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

	var window = new Window ();
	window.title = "Hello, World!";
	window.border_width = 10;
	window.window_position = WindowPosition.CENTER;
	window.set_default_size (350, 70);
	window.destroy.connect (Gtk.main_quit);

	var label = new Label ("Hello, World!");

	window.add (label);
	window.show_all ();

	Gtk.main ();
	return 0;
}

Die Anweisung Gtk.main ()erstellt und startet eine Hauptschleife , die auf Ereignisse lauscht, die über Signale an die Callback-Funktionen weitergegeben werden. Da dieses Beispiel das GTK- Paket verwendet, benötigt es zum Kompilieren einen zusätzlichen --pkgParameter (der pkg-config im C- Backend aufruft ):

valac --pkg gtk+-3.0 hellogtk.vala

Siehe auch

  • Genie , eine Programmiersprache für den Vala - Compiler mit einer Syntax näher an Python .
  • Shotwell , ein in Vala geschriebener Bildorganisator.
  • Geary , ein in Vala geschriebener E-Mail-Client.
  • elementary OS , eine Linux-Distribution mit einer hauptsächlich in Vala programmierten Desktop-Umgebung.
  • Budgie , eine hauptsächlich in Vala programmierte Linux-Desktop-Umgebung.

Verweise

Externe Links

Vergleich mit anderen Sprachen