Vala (programovací jazyk) - Vala (programming language)

Vala
Vala Logo.svg
Paradigma Multi-paradigma : imperativní , strukturované , objektově orientované
Vývojář Jürg Billeter, Raffaele Sandrini
Poprvé se objevil 2006 ; před 15 lety ( 2006 )
Stabilní uvolnění
Kázeň při psaní Statický , silný , odvozený , strukturální
OS Všechny platformy podporované GLib , ale distribuovány pouze jako zdrojový kód.
Licence LGPLv2.1+
Rozšíření názvu souboru .vala, .vapi
webová stránka wiki .gnome .org /Projects /Vala
Ovlivněn
C , C ++ , C# , D , Java , Boo

Vala je objektově orientovaný programovací jazyk s vlastním hostitelem kompilátoru, který generuje kód C a používá systém GObject .

Vala je syntakticky podobná C# a obsahuje pozoruhodné funkce, jako jsou anonymní funkce , signály , vlastnosti , generika , asistovaná správa paměti , zpracování výjimek , odvozování typů a příkazy foreach . Jeho vývojáři, Jürg Billeter a Raffaele Sandrini, chtěli tyto funkce přenést na prostý C runtime s malou režií a bez speciální runtime podpory zaměřením na objektový systém GObject . Spíše než kompilace přímo do strojového kódu nebo jazyka sestavení, kompiluje se do nižšího jazyka pro středně pokročilé . To zdroj-k-zdroj sestavuje na C, který je pak kompilována s kompilátor C pro danou platformu, jako je GCC nebo Clang .

Použití funkcí z nativních knihoven kódů vyžaduje psaní souborů vapi, definování rozhraní knihovny . Zápis těchto definic rozhraní je dobře zdokumentován pro knihovny C, zejména pokud jsou založeny na GObject. Vazby jsou již k dispozici pro velký počet knihoven, včetně knihoven C, které nejsou založeny na GObject, jako je multimediální knihovna SDL , OpenGL atd.

Popis

Vala je programovací jazyk, který kombinuje výkon skriptovacích jazyků na vysoké úrovni s běhovým výkonem nízkoúrovňových programovacích jazyků. Jeho cílem je přinést vývojářům GNOME moderní funkce programovacího jazyka, aniž by ukládal další runtime požadavky a bez použití jiného ABI , ve srovnání s aplikacemi a knihovnami napsanými v jazyce C. Syntaxe jazyka Vala je podobná C# , upravená tak, aby lépe odpovídala systému typu GObject .

Dějiny

Vala byla vytvořena Jürgem Billeterem a byla implementována ním a Raffaele Sandrini, kteří si přáli alternativu vyšší úrovně pro vývoj aplikací GNOME místo C. Měli rádi syntaxi a sémantiku C#, ale nechtěli používat Mono , takže skončili kompilátor v květnu 2006. Zpočátku to bylo bootstrapováno pomocí C a o rok později (s vydáním verze 0.1.0 v červenci 2007) se kompilátor Vala stal hostitelem sám . Od roku 2021 je aktuální větev stabilní verze s dlouhodobou podporou 0,48 a jazyk je v aktivním vývoji s cílem vydat stabilní verzi 1.0.

Verze Datum vydání
Stará verze, již není udržována: 0,0,1 15. července 2006
Stará verze, již není udržována: 0,1,0 2007-07-09
Stará verze, již není udržována: 0.10.0 2010-09-18
Stará verze, již není udržována: 0,20,0 27. 05. 2013
Stará verze, již není udržována: 0,30,0 18. 09. 2015
Stará verze, již není udržována: 0,40,0 2018-05-12
Stará verze, již není udržována: 0,42,0 2018-09-01
Stará verze, již není udržována: 0,44,0 2019-05-09
Stará verze, již není udržována: 0,46,0 2019-09-05
Aktuální stabilní verze: 0,48,18 2021-06-09
Aktuální stabilní verze: 0,50,9 2021-06-04
Aktuální stabilní verze: 0,52,4 2021-06-04
Legenda:
Stará verze
Starší verze, stále udržovaná
Nejnovější verze
Nejnovější verze náhledu
Budoucí vydání
U starých verzí jsou uvedena pouze vydání prvního bodu

Jazykový design

Funkce

Vala používá GLib a jeho submoduly (GObject, GModule, GThread, GIO) jako základní knihovnu, která je k dispozici pro většinu operačních systémů a nabízí věci jako platformově nezávislá vlákna , vstup/výstup , správa souborů , síťové zásuvky , pluginy , regulární výrazy , atd. Syntaxe Vala aktuálně podporuje moderní jazykové funkce následovně:

Grafická uživatelská rozhraní lze vyvíjet pomocí sady nástrojů GTK GUI a nástroje Glade GUI Builder .

Správa paměti

Pro správu paměti poskytuje systém GType nebo GObject počítání referencí . V jazyce C musí programátor ručně spravovat přidávání a odebírání odkazů, ale ve Vale je správa těchto počtů referencí automatizována, pokud programátor používá vestavěné typy odkazů v jazyce, nikoli pouhé ukazatele. Jediným detailem, o který se musíte starat, je vyhnout se generování referenčních cyklů , protože v takovém případě tento systém správy paměti nebude fungovat správně.

Vala také volitelně umožňuje ruční správu paměti s ukazateli .

Vazby

Vala má poskytovat runtime přístup ke stávajícím C knihovnám, zejména knihovnám založeným na GObject, bez nutnosti runtime vazeb. Chcete -li použít knihovnu s Vala, vše, co potřebujete, je soubor API (.vapi) obsahující deklaraci třídy a metody v syntaxi Vala. Knihovny C ++ však nejsou podporovány. V současné době jsou soubory vapi pro velkou část projektu GNU a platformy GNOME součástí každé verze Vala, včetně GTK . Existuje také knihovna s názvem Gee, napsaná ve Vala, která poskytuje rozhraní a třídy založené na GObject pro běžně používané datové struktury .

Mělo by být také snadno možné napsat generátor vazeb pro přístup do knihoven Vala z aplikací napsaných v jiných jazycích, např. C#, protože analyzátor Vala je napsán jako knihovna, takže při generování vazby jsou k dispozici všechny informace o době kompilace .

Nástroje

Redaktoři

Nástroje pro vývoj Vala zaznamenaly v posledních letech výrazné zlepšení. Následuje seznam některých oblíbených IDE a textových editorů s doplňky, které přidávají podporu pro programování ve Vala:

Inteligence kódu

V současné době existují dva aktivně se vyvíjející jazykové servery, které nabízejí inteligenci kódu pro Vala následovně:

  • server benwaffle/vala-language, určený pro jakýkoli editor, který podporuje LSP , včetně VSCode, vim a GNOME Builder
  • esodan/gvls, v současné době výchozí jazykový server pro Vala v GNOME Builderu a poskytuje podporu libovolnému editoru s podporou LSP

Sestavte systémy

V současné době existuje řada systémů sestavování podporujících Vala, včetně Automake , CMake , Meson a dalších.

Ladění

Ladění programů Vala lze provést pomocí GDB nebo LLDB . Pro ladění v IDE ,

Příklady

Ahoj světe

Jednoduchý program „ Hello, World! “ Ve Vale:

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

Jak lze poznamenat, na rozdíl od C nebo C ++ ve Vale nejsou žádné hlavičkové soubory. Propojení s knihovnami se provádí zadáním --pkgparametrů během kompilace. Knihovna GLib je navíc vždy propojena a její obor názvů lze vynechat ( printve skutečnosti je GLib.print).

Objektově orientované programování

Níže je složitější verze, která definuje podtřídu HelloWorlddědící ze základní třídy GLib.Object, neboli třídy GObject . Ukazuje některé objektově orientované funkce 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 ();
}

Stejně jako v případě knihovny GObject , Vala nepodporuje vícenásobnou dědičnost , ale třída ve Vala může implementovat libovolný počet rozhraní , která mohou obsahovat výchozí implementace pro jejich metody. Zde je ukázkový kód, který demonstruje rozhraní Vala s výchozí implementací (někdy se označuje 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 ());
}

Signály a zpětná volání

Níže je uveden základní příklad, který ukazuje, jak definovat signál ve třídě, která není kompaktní a která má signální systém zabudovaný Vala prostřednictvím GLib. Poté jsou funkce zpětného volání zaregistrovány na signál instance třídy. Instance může vysílat signál a každá funkce zpětného volání (označovaná také jako obsluha) připojená k signálu pro instanci bude vyvolána v pořadí, v jakém byla připojena:

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

Navlékání

Nové vlákno ve Vala je část kódu, jako je funkce, která se požaduje, aby byla spuštěna souběžně za běhu. Vytváření a synchronizace nových vláken se provádí pomocí Threadtřídy v GLib, která bere funkci jako parametr při vytváření nových vláken, jak ukazuje následující (velmi zjednodušený) příklad:

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

Grafické uživatelské prostředí

Níže je uveden příklad použití GTK k vytvoření GUI „Hello, World!“ program (viz také ahoj svět GTK ) ve 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;
}

Příkaz Gtk.main ()vytvoří a spustí hlavní smyčku naslouchající událostem, které jsou předávány prostřednictvím signálů do funkcí zpětného volání. Protože tento příklad používá balíček GTK , potřebuje ke kompilaci další --pkgparametr (který vyvolá pkg-config v backendu C ):

valac --pkg gtk+-3.0 hellogtk.vala

Viz také

  • Genie , programovací jazyk pro kompilátor Vala se syntaxí blíže Pythonu .
  • Shotwell , organizátor obrázků napsaný ve Vala.
  • Geary , e -mailový klient napsaný ve Vala.
  • elementární OS , distribuce Linuxu s desktopovým prostředím naprogramovaným většinou ve Vala.
  • Budgie , desktopové prostředí Linuxu programované převážně ve Vale.

Reference

externí odkazy

Srovnání s jinými jazyky