Vala (język programowania) - Vala (programming language)

Wala
Vala Logo.svg
Paradygmat Wieloparadygmat : imperatyw , strukturalny , obiektowy
Deweloper Jürg Billeter, Raffaele Sandrini
Po raz pierwszy pojawiły się 2006 ; 15 lat temu ( 2006 )
Wersja stabilna
Dyscyplina pisania Statyczny , silny , wnioskowany , strukturalny
OS Wieloplatformowe wszystkie obsługiwane przez GLib , ale dystrybuowane tylko jako kod źródłowy.
Licencja LGPLv2.1+
Rozszerzenia nazw plików .vala, .vapi
Strona internetowa wiki .gnome .org /Projekty /Vala
Wpływem
C , C++ , C# , D , Java , Boo

Vala to obiektowy język programowania z samohostującym się kompilatorem, który generuje kod C i korzysta z systemu GObject .

Vala jest składniowo podobny do C # i zawiera ważne funkcje, takie jak anonimowe funkcji , sygnałów , właściwości , rodzajowych , wspomaganego zarządzania pamięcią , obsługę wyjątków , typu wnioskowania i foreach sprawozdań. Jego programiści, Jürg Billeter i Raffaele Sandrini, chcieli wprowadzić te funkcje do zwykłego środowiska uruchomieniowego C przy niewielkim nakładzie pracy i bez specjalnego wsparcia środowiska uruchomieniowego, celując w system obiektów GObject . Zamiast kompilować bezpośrednio do kodu maszynowego lub języka asemblera, kompiluje się do języka pośredniego niższego poziomu . IT źródło-źródło zestawia do C, który jest następnie zestawiane z kompilatora dla danej platformy, takich jak GCC i Clang .

Korzystanie z funkcjonalności z natywnych bibliotek kodu wymaga pisania plików vapi, definiowania interfejsów bibliotek . Pisanie tych definicji interfejsów jest dobrze udokumentowane dla bibliotek C, zwłaszcza opartych na GObject. Wiązania są już dostępne dla dużej liczby bibliotek, w tym dla bibliotek C, które nie są oparte na GObject, takich jak biblioteka multimedialna SDL , OpenGL itp.

Opis

Vala to język programowania, który łączy wysoką wydajność w czasie kompilacji języków skryptowych z wydajnością w czasie wykonywania języków programowania niskiego poziomu . Ma na celu udostępnienie programistom GNOME nowoczesnych funkcji języka programowania bez narzucania żadnych dodatkowych wymagań wykonawczych i bez użycia innego ABI w porównaniu do aplikacji i bibliotek napisanych w C. Składnia Vala jest podobna do C# , zmodyfikowana w celu lepszego dopasowania do systemu typu GObject .

Historia

Vala została wymyślona przez Jürga Billetera i została zaimplementowana przez niego i Raffaele Sandrini, którzy życzyli sobie alternatywy wyższego poziomu do tworzenia aplikacji GNOME zamiast C. Podobała im się składnia i semantyka C#, ale nie chcieli używać Mono , więc skończyli kompilatorem w maju 2006 r. Początkowo był uruchamiany za pomocą C, a rok później (w wersji 0.1.0 w lipcu 2007 r.) kompilator Vala stał się samoobsługowy . Od 2021 r. Obecna gałąź wydania stabilnego z długoterminowym wsparciem to 0,48, a język jest aktywnie rozwijany w celu wydania stabilnej wersji 1.0.

Wersja Data wydania
Stara wersja, nie jest już utrzymywana: 0.0.1 2006-07-15
Stara wersja, nie jest już utrzymywana: 0.1.0 2007-07-09
Stara wersja, nie jest już utrzymywana: 0.10.0 2010-09-18
Stara wersja, nie jest już utrzymywana: 0,20,0 2013-05-27
Stara wersja, nie jest już utrzymywana: 0,30,0 2015-09-18
Stara wersja, nie jest już utrzymywana: 0,40,0 2018-05-12
Stara wersja, nie jest już utrzymywana: 0,42,0 2018-09-01
Stara wersja, nie jest już utrzymywana: 0,44,0 2019-05-09
Stara wersja, nie jest już utrzymywana: 0,46.0 2019-09-05
Aktualna stabilna wersja: 0,48,18 2021-06-09
Aktualna stabilna wersja: 0,50,9 2021-06-04
Aktualna stabilna wersja: 0,52,4 2021-06-04
Legenda:
Stara wersja
Starsza wersja, nadal utrzymywana
Ostatnia wersja
Najnowsza wersja zapoznawcza
Przyszłe wydanie
W przypadku starszych wersji wymienione są tylko wydania z pierwszego punktu

Projektowanie języka

Cechy

Vala używa GLib i jego podmodułów (GObject, GModule, GThread, GIO) jako podstawowej biblioteki, która jest dostępna dla większości systemów operacyjnych i oferuje takie rzeczy jak wątki niezależne od platformy , wejścia/wyjścia , zarządzanie plikami , gniazda sieciowe , wtyczki , wyrażenia regularne , itp. Składnia Vala obsługuje obecnie nowoczesne funkcje językowe w następujący sposób:

Graficzne interfejsy użytkownika można tworzyć za pomocą zestawu narzędzi GTK GUI i konstruktora Glade GUI .

Zarządzanie pamięcią

Do zarządzania pamięcią system GType lub GObject zapewnia zliczanie odwołań . W C programista musi ręcznie zarządzać dodawaniem i usuwaniem referencji, ale w Vala zarządzanie takimi licznikami referencji jest zautomatyzowane, jeśli programista używa wbudowanych typów referencji języka, a nie zwykłych wskaźników. Jedynym szczegółem, o który musisz się martwić, jest uniknięcie generowania cykli referencyjnych , ponieważ w takim przypadku ten system zarządzania pamięcią nie będzie działał poprawnie.

Vala umożliwia również ręczne zarządzanie pamięcią ze wskaźnikami jako opcją.

Wiązania

Vala ma na celu zapewnienie dostępu w czasie wykonywania do istniejących bibliotek C, zwłaszcza bibliotek opartych na GObject, bez konieczności tworzenia powiązań w czasie wykonywania. Aby korzystać z biblioteki z Valą, wystarczy plik API (.vapi) zawierający deklaracje klas i metod w składni Vala. Jednak biblioteki C++ nie są obsługiwane. Obecnie pliki vapi dla dużej części projektu GNU i platformy GNOME są dołączane do każdego wydania Vala, w tym GTK . Istnieje również biblioteka o nazwie Gee, napisana w języku Vala, która zapewnia interfejsy i klasy oparte na GObject dla powszechnie używanych struktur danych .

Powinno być również możliwe łatwe napisanie generatora powiązań w celu uzyskania dostępu do bibliotek Vala z aplikacji napisanych w innych językach, np. C#, ponieważ parser Vala jest napisany jako biblioteka, dzięki czemu wszystkie informacje o czasie kompilacji są dostępne podczas generowania powiązania .

Narzędzia

Redakcja

Narzędzia do rozwoju Vala odnotowały znaczną poprawę w ostatnich latach. Poniżej znajduje się lista niektórych popularnych IDE i edytorów tekstu z wtyczkami, które dodają obsługę programowania w Vala:

Inteligencja kodu

Obecnie istnieją dwa aktywnie rozwijające się serwery językowe, które oferują inteligencję kodu dla Vala w następujący sposób:

  • benwaffle/vala-language-server, przeznaczony dla dowolnego edytora obsługującego LSP , w tym VSCode, vim i GNOME Builder
  • esodan/gvls, obecnie domyślny serwer językowy Vala w GNOME Builder i zapewnia obsługę dowolnego edytora z obsługą LSP

Budowanie systemów

Obecnie istnieje wiele systemów kompilacji obsługujących Valę, w tym Automake , CMake , Meson i inne.

Debugowanie

Debugowanie programów Vala można wykonać za pomocą GDB lub LLDB . Do debugowania w IDE ,

Przykłady

Witaj świecie

Prosty program " Hello, World! " w Vala:

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

Jak można zauważyć, w przeciwieństwie do C lub C++, w Vala nie ma plików nagłówkowych. Łączenie z bibliotekami odbywa się poprzez określenie --pkgparametrów podczas kompilacji. Co więcej, biblioteka GLib jest zawsze połączona, a jej przestrzeń nazw można pominąć ( printw rzeczywistości jest GLib.print).

Programowanie obiektowe

Poniżej znajduje się bardziej złożona wersja, która definiuje podklasę HelloWorlddziedziczącą po klasie bazowej GLib.Object, czyli klasie GObject . Pokazuje niektóre z funkcji obiektowych 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 ();
}

Podobnie jak w przypadku biblioteki GObject , Vala nie obsługuje wielokrotnego dziedziczenia , ale klasa w Vala może zaimplementować dowolną liczbę interfejsów , które mogą zawierać domyślne implementacje dla swoich metod. Oto fragment przykładowego kodu demonstrującego interfejs Vala z domyślną implementacją (czasami określany jako mixin )

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 ());
}

Sygnały i oddzwonienia

Poniżej znajduje się podstawowy przykład pokazujący, jak zdefiniować sygnał w klasie, która nie jest zwarta, w której system sygnału jest wbudowany przez Valę za pomocą GLib. Następnie funkcje zwrotne są rejestrowane w sygnale instancji klasy. Instancja może emitować sygnał, a każda funkcja zwrotna (nazywana również handler) połączona z sygnałem dla instancji zostanie wywołana w kolejności, w jakiej zostały połączone:

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 ();
}

Gwintowanie

Nowy wątek w Vala to fragment kodu, taki jak funkcja, która ma być wykonywana jednocześnie w czasie wykonywania. Tworzenie i synchronizacja nowych wątków odbywa się za pomocą Threadklasy w GLib, która przyjmuje funkcję jako parametr podczas tworzenia nowych wątków, jak pokazano w poniższym (bardzo uproszczonym) przykładzie:

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");
}

Graficzny interfejs użytkownika

Poniżej znajduje się przykład użycia GTK do stworzenia GUI "Hello, World!" program (zobacz także GTK hello world ) w 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;
}

Instrukcja Gtk.main ()tworzy i uruchamia główną pętlę nasłuchującą zdarzeń, które są przekazywane za pośrednictwem sygnałów do funkcji zwrotnych. Ponieważ ten przykład używa pakietu GTK , wymaga on dodatkowego --pkgparametru (który wywołuje pkg-config w backendzie C ) do kompilacji:

valac --pkg gtk+-3.0 hellogtk.vala

Zobacz też

  • Genie , język programowania dla kompilatora Vala o składni bliższej Pythonowi .
  • Shotwell , organizator zdjęć napisany w Vala.
  • Geary , klient poczty e-mail napisany w języku Vala.
  • elementary OS , dystrybucja Linuksa ze środowiskiem graficznym programowanym głównie w Vala.
  • Budgie , środowisko graficzne Linux programowane głównie w Vala.

Bibliografia

Zewnętrzne linki

Porównanie z innymi językami