Vala (programovací jazyk): Porovnání verzí

Smazaný obsah Přidaný obsah
Edit last version
Robot: Opravuji 1 zdrojů a označuji 0 zdrojů jako nefunkční) #IABot (v2.0.9.5
 
(Není zobrazeno 14 mezilehlých verzí od 12 dalších uživatelů.)
Řádek 1:
{{Infobox - programovací jazyk
| název = Vala
| paradigma = převážně [[Objektově orientované programování|objektově orientovaný]], [[Multiparadigmatický programovací jazyk|multiparadigmatický]]
| vznik = [[2006]]
| autor = [[Jürg Billeter]], [[Raffaele Sandrini]] a další
| vývojář = komunita Valy, [[GNOME Foundation]]
| poslední verze = 0.3652.3
| datum poslední verze = [[21. květnakvěten|21. květenkvětna]] [[20172021]]
| typování = silné, statické
| implementace = profily překladu glib, posix a dova
| dialekty = lze zapnout experimentální syntaxi
| ovlivněno = [[C++]], různá [[API]] GNOME, [[C Sharp|C#]], [[Python]]<ref>Použití operátoru slice (resp. hranatých závorek) u řetězců kopíruje řešení Pythonu.</ref>
| ovlivnil = Genie
| operační systém = určeno pro GNOME, teoreticky multiplatformní
| licence = [[GNU Lesser General Public License|LGPL]] 2.1 a novější verze
| web = {{URL|https://vala.dev}}
}}
 
Projekt '''Vala''' je jedním z oficiálních projektů [[GNOME]] a usiluje o rozšíření možností vývoje nativně běžících aplikací o výhody, které jsou typické pro vývoj kódu kompilovaného do [[byte code]] (např. platforma [[Mono (platforma)|Mono]]) a interpretovaného kódu (např. [[Python]]). V rámci projektu byl navržen programovací jazyk Vala.
 
Řádek 23:
Jazyk Vala se velmi podobá jazyku [[C Sharp|C#]]. Většina rozdílů mezi oběma jazyky vyplývá ze zamýšleného odlišného principu překladu a ze zaměření Valy na platformu GNOME. Jazyk Vala je nejvýznamnějším jazykem projektu Vala.
 
Překlad Valy neprobíhá obvyklým způsobem. Překladač zdrojový kód naparsuje a transformuje jej na [[strojový kód]]<ref name="strojovy_kod">Z hlediska licencí [[GNU]] je tento kód chápán jako strojový. Licence definují zdrojový kód jako preferovanou formu díla určenou pro jeho modifikace. Zdrojovým kódem je tedy pouze kód ve Vale. Všechny nezdrojové formy díla (včetně přeloženého kódu v jazyce C) jsou považovány za strojový kód.</ref> v jazyce [[C (programovací jazyk)|C]], který je ekvivalentní původnímu zdrojovému kódu v jazyce Vala. Při této transformaci využívá v GNOME běžnou abstrakci typů přes [[GObject]]y ([[GLib]] Object System). Získaný strojový kód v C je určen k překladu do zvoleného formátu spustitelných souborů (např. executable and linkable format (ELF)) ve standardním kompilátoru [[GCC]] jako běžný C zdrojový kód. Překladač vala compiler (program valac) umožňuje všechny tyto fáze překladu provést buď na jednounajednou, nebo provést pouze transformaci do zdrojového kódu v C.
 
Vala se primárně zaměřuje na GNOME, které vyžaduje [[Linux]] nebo příbuzné [[Unix|UNIXové]] systémy. Přesto lze překlad Valy provést na jakémkoli systému, na kterém je dostupná knihovna GLib a překladač GCC nebo jeho porty.
Řádek 30:
 
== Jazyk Vala ==
 
=== „Ahoj, světe!“ ===
Tento ukázkový minimální program typu [[Hello world]] vypíše řetězec "Ahoj".
 
<sourcesyntaxhighlight lang="vala">
print("Ahoj");
void main () {
</syntaxhighlight>
print("Ahoj");
}
</source>
 
Překladač valac tento kód uložený v souboru demo.vala během překladu transformuje na následující kód v jazyce C. Jeho uložení se provede příkazem "valac demo.vala -C".
 
<sourcesyntaxhighlight lang="C">
/* demo.c generated by valac 0.14.0, the Vala compiler
* generated from demo.vala, do not modify */
Řádek 59 ⟶ 58:
return 0;
}
</syntaxhighlight>
</source>
 
Vstupní bod je při čistě objektově orientovaném programování statickou metodou hlavní třídy programu. Třídy jsou obvykle potomky GLib.Object (zkráceně jen Object). Následuje ''neminimalistický'' Hello World program v objektovém stylu:<ref>upraveno z [[:en:Vala (programming language)#Code example|Vala (programming language) – Wikipedia, the free encyclopedia]]</ref>
 
<sourcesyntaxhighlight lang="vala">
class Trida.AhojSvete : GLib.Object {
void pozdrav () {
Řádek 75 ⟶ 74:
}
}
</syntaxhighlight>
</source>
 
=== Syntaxe a sémantika Valy ===
Řádek 83 ⟶ 82:
 
Dále Vala umožňuje programátorovi definovat vlastní:
* struktury (struct), výčty (enum),
* třídy (class), rozhraní (interface),
* jmenné prostory (namespace),
* iterátory,
* typy delegátů. Delegáty (delegate) jsou jiný, praktičtější zápis ukazatelů na funkce známých z jazyka [[C (programovací jazyk)|C]].
* Atributy kódu a mnohé další výrazové prostředky především souvisejí s použitím na platformě GNOME. Atribut kódu se zapisuje před svůj kód ve tvaru <code>[nazev_atributu(prvni_parametr="hodnota", druhy_parametr="hodnota", treti_parametr="hodnota")]</code>.
 
Dále Vala obsahuje následující:
Řádek 94 ⟶ 93:
* Vala umožňuje automatické zjišťování typů (type inference). Klíčové slovo var nahrazuje typ, který jednoznačně vyplývá z kontextu celého zdrojového kódu.
* Vala umožňuje zápis anonymních funkcí s pomocí lambda výrazu reprezentovaným operátorem =>. Anonymní funkce jsou ve Vale reálný uzávěr.
* Každý typ má nullovatelnou a nenullovatelnou variantu. Název nullovatelné varianty má jako příponu otazník (např. string?).
* Vala má neomezenou [[Ukazatel (programování)|pointerovou aritmetiku]] podobně jako např. [[C++]]. Podobně jako v [[C++]] jsou pole jiný, praktičtější zápis pointerové aritmetiky. Tedy pole jsou ukazatele a zápisy <code>x[i]</code> je synonymem k <code>*(x + i)</code>.
* [[Operátor koalescence]] je označen dvěma otazníky ??.
Řádek 100 ⟶ 99:
* Programátor může zadat do definice funkce podmínky, které podle teoretického rozboru jsou nesplněny pouze při nekorektním běhu programu. Při nesplnění podmínek je program ukončen. Následující příklad ukazuje použití klíčových slov requires, ensures a result. Klíčové slovo requires (resp. ensure) označuje výraz typu bool, který musí být splněn při vstupu do (resp. při skončení) funkce. Klíčové slovo result je hodnota vracená funkcí používaná k zapsání ensures podmínky.
 
<sourcesyntaxhighlight lang="vala">
int kontrolovana_funkce(int hodnota)
requires (hodnota <= maximalni_povolena_hodnota)
Řádek 108 ⟶ 107:
// tělo funkce
}
</syntaxhighlight>
</source>
 
* Datový typ typu proměnné lze získat operátorem typeof, známým z jazyka [[C (programovací jazyk)|C]] (dialektu užívaným standardním kompilátorem [[GCC]]). Operátor is zjišťuje, zda lze provést přetypování. Při využití GLib registrace typů typů vrací metoda get_type() typ třídy. Operátor as slouží k snadnému zápisu dynamického přetypování; <code>A as B</code> je přehlednější zápis <code>A is B ? (A) B : null;</code>. K explicitnímu přetypování nullovatelného typu na korespondující nenulovatelný typ se používá zápis <code>(!) promenna</code>.
* Vala podporuje [[generické programování]], k jehož zápisu používá obvyklou syntaxi s lomenými závorkami.
* Vala podporuje v definici parametrů funkce výpustku značenou ve stylu jazyka C třemi tečkami. Seznam názvů parametrů se získá funkcí va_list() a zadaný parametr v definici funkce uvádí typ hodnot parametrů.
 
<sourcesyntaxhighlight lang="vala">
void funkce_s_neznamym_poctem_argumentu(string fixed, ...) {
var seznam_argumentu = va_list();
Řádek 124 ⟶ 123:
}
}
</syntaxhighlight>
</source>
 
Vala poměrně nečekaným způsobem pracuje s řetězci a zavádí operátor @.
Řádek 131 ⟶ 130:
* Ve verbatim řetězcích (oddělovač """) nedochází k escapování znaků.
 
<sourcesyntaxhighlight lang="vala">
/* ukázka použití operátoru @ a verbatim řetězce
vypisované řetězce jsou přepsané v komentářích
Řádek 149 ⟶ 148:
stdout.printf("""verbatim řetězec vypíše "\\"\n """ + "\n"); //verbatim řetězec vypíše "\\"\n
}
</syntaxhighlight>
</source>
 
Koncepce objektů ve Vala má tyto zvláštnosti:
* Vedle běžných modifikátorů přístupu public, private a protected existuje další modifikátor internal. Internal slouží k zpřístupnění symbolu pouze v rámci jednoho projektu ([[Softwarový balíček (instalace)|balíčku]]). Například internal skryje proměnné [[Vala (programovací jazyk)#Externí kód|VAPI]] souboru před uživatelskou aplikací.
* Lze definovat vlastnosti a jejich gettery a settery.
* Není podporována vícenásobná dědičnost. Rodičovská třída se označuje klíčovým slovem base.
Řádek 159 ⟶ 158:
Následující ukázkový kód demonstruje použití standardních getterů a setterů u vlastností prvni_mereni a druhe_mereni, definování vlastních getterů a setterů u vlastnosti mereni a různě pojmenované konstruktory.
 
<sourcesyntaxhighlight lang="vala">
class mereni {
public double prvni_mereni {
Řádek 202 ⟶ 201:
m = new mereni.stejna_hodnota(10);
}
</syntaxhighlight>
</source>
 
Vala umožňuje přistupovat ke konvenčně pojmenovaným metodám tříd přes speciální úspornou syntaxi. Nejčastěji se využívají indexery, přetypování na řetězec, řezy, definování iterátoru a definování prvků množiny. Použití ukazuje následující příklad.
 
<sourcesyntaxhighlight lang="vala">
class priklad {
int[] i = {10,2,345,5,89};
Řádek 286 ⟶ 285:
}
}
</syntaxhighlight>
</source>
 
V rozumných případech již tyto metody přirozeně definuje norma jazyka. Konkrétně je předdefinováno převádění čísel na řetězec, řezy (slice) řetězců, iterátory u množin a podobně. Často používané řezy řetězců fungují ve Vale stejně jako v [[Python]]u.
Řádek 299 ⟶ 298:
* Vala přebírá z GLib systém GError řešící problematiku výjimek. Ve Vale se vygenerovaná výjimka (error) skládá z domény (domain), kódu (code) a zprávy (message). Domény a kódy jsou deklarovány klíčovým slovem errordomain. Popis chyby je programátorem libovolně zvolený řetězec. Práci s chybami ukazuje následující kód.
 
<sourcesyntaxhighlight lang="vala">
public errordomain ChybaNejakehoTypu {
CODE_NEJAKY,
Řádek 329 ⟶ 328:
}
}
</syntaxhighlight>
</source>
 
* Označením funkce klíčovým slovem signal se z funkce stává i GLib signál. Signál má metodu connect, která registruje obsluhu signálu. Vlastnosti GLib signálu se definují atributy kódu (např. <code>[Signal (action=true, no_recurse=false)] signal void nejaky_signal();</code>).
* Jmenuje-li se funkce v GLib g_neco0_neco1_neco2, pak se tato funkce jmenuje ve Vale GLib.Neco0.Neco1.neco2(). Podle této konvence se označují symboly GLib ve Vale.
* V praxi se ve Vale často používají například funkce GLib pro asserci (např. warn_if_reached).
* Výstupní proudy stdout, stderr jsou součástí GLib.
* Ve Vale se obvykle třídy odvozují od GLib.Object (skrácený zápis Object).
* K [[Introspekce|introspekci]] lze použít rozhraní GObject introspection.
Řádek 340 ⟶ 339:
* Snippet ve tvaru <code>construct { ...tělo... }</code> se rovněž namapuje na funkce GLib a spouští se vždy při konstrukci. Object umožňuje konstrukci "GObjectovým způsobem". Vlastnosti jsou inicializovány přes kód označeny slovem construct. Tento bod platí pouze pro potomky třídy GLib.Object.
 
<sourcesyntaxhighlight lang="vala">
// příklad různých použití construct
class trida : Object {
Řádek 379 ⟶ 378:
t = new trida(0,5,0); // v tomto okamžiku se vypíše "Konstrukce třídy"
}
</syntaxhighlight>
</source>
 
Další používané knihovna je [[Vala (programovací jazyk)#Knihovna Gee|Gee]], která definuje datové kontejnery ArrayList, HashMap, HashSet a podobně. Každý typ má metodu read_only_view, která vrací snímek stavu kontejneru umožňující pouze čtení. Pro práci se vstupy a výstupy (např. diskové operace) se používá knihovna [[GIO]].
Řádek 399 ⟶ 398:
Při vývoji pokročilejších aplikací se vždy využívá populárních softwarových [[Knihovna (programování)|knihoven]]. Kompilace pak vyžaduje jisté vývojářské soubory a metainformace o knihovnách, které standardně spravuje systém [[pkg-config]]. Databázi pro utilitu pkg-config tvoří textové .pc soubory umístěné v adresáři /usr/lib/pkgconfig a v překrývajícím adresáři /usr/local/lib/pkgconfig. Příklad obsahu .pc souboru týkajícího se [[GTK+]] je:
 
<sourcesyntaxhighlight lang="text">
prefix=/usr/local
exec_prefix=${prefix}
Řádek 412 ⟶ 411:
Libs: -L${libdir} -lgtk-${target}-2.0
Cflags: -I${includedir}/gtk-2.0
</syntaxhighlight>
</source>
 
Potřebné informace pro kompilaci vypíše příkaz <code>pkg-config --cflags --libs gtk+-2.0</code>. Příkladem použití je <code>gcc `pkg-config --cflags --libs gtk+-2.0` zdrojovy_soubor.c</code>.
Řádek 419 ⟶ 418:
* Ve větvi external jsou příspěvky od třetích stran, kteří nejsou vývojáři Valy ani příslušné knihovny.
* Ve větvi upstream jsou bindy uvolněné vývojáři příslušné knihovny.
* Větev experimental prakticky není otestována. Distribuce probíhá přes balík překladače valac.
* Větev unstable je nedostatečně otestována. Distribuce probíhá přes balík překladače valac.
* Větev stable je dostatečně otestována. Distribuce probíhá přes balík překladače valac.
Řádek 427 ⟶ 426:
Následující demonstrační výstřižek kódu využívá knihovnu GTK+. Při kompilaci je nutné specifikovat jméno požadované knihovny GTK v systému pkg-config. Kód bude pravděpodobně kompilován proti nejnovější třetí hlavní verzi GTK (<code>valac --pkg gtk+-3.0 jmeno_souboru.vala</code>) nebo proti častěji používané druhé verzi (<code>valac --pkg gtk+-2.0</code>).
 
<sourcesyntaxhighlight lang="vala">
using Gtk; // zapíná jmenný prostor Gtk
 
Řádek 439 ⟶ 438:
}
}
</syntaxhighlight>
</source>
 
=== Správa a ochrana paměti ===
Řádek 454 ⟶ 453:
Vlastnictví paměti určuje, která reference je rozhodná pro uvolnění paměti. Klíčové slovo unowned označuje referenci, která nevlastní paměť. Příklad pro použití demonstruje následující elementární kód.
 
<sourcesyntaxhighlight lang="vala">
class Priklad {
private Object o;
Řádek 463 ⟶ 462:
}
}
</syntaxhighlight>
</source>
 
Při odstraňování reference vrácené funkcí nevlastnena_reference() je uvolněn soukromý člen o, což může poškodit třídu. Člen o by měl být vlastněn třídou. Proto by funkce nevlastnena_reference měla mít následující prototyp.
 
<sourcesyntaxhighlight lang="vala">
public unowned Object nevlastena_reference();
</syntaxhighlight>
</source>
 
Vlastnictví převádí klíčové slovo owned.
 
Atribut Compact označuje třídy, které nebudou registrovány a spravovány typovým systémem GLib.
Řádek 484 ⟶ 483:
 
Hlavní rozdíly v samotných jazycích jsou:
* Vala je v mnoha ohledech rozšířena a přizpůsobena pro platformu GNOME.
* Kvůli výkonnostní optimalizaci Valy je implementován pouze neplnohodnotný [[garbage collector]] založený na počítání referencí. Pro problematické situaci zacyklení referencí zavádí Vala speciální syntaxi jako například možnost přímého zavolání destruktoru.
* Autoři Valy doporučují úplně jiné jmenné konvence než autoři C#. Tato odlišnost vyplývá ze skutečnosti, že Vala primárně cílí na GNOME a C# primárně cílí na [[Microsoft Windows]].
Řádek 503 ⟶ 502:
* Programy využívající Mono mají výrazně vyšší hardwarové nároky. V případě běžných algoritmů je často Mono několikanásobně pomalejší než Vala.<ref>[http://code.google.com/p/vala-benchmarks/wiki/BenchResults BenchResults – vala-benchmarks - Results of the current completed benchs. – A collections of some simples benchmarks written in Vala. – Google Project Hosting]</ref>
* Platforma Mono je "prorostlá" částmi kódu čerpajícího z duševního vlastnictví autora .NETu, společnosti [[Microsoft]]. Licencování těchto částí mají korektně vyřešené pouze klienti společnosti [[Novell]], která uzavřela exkluzivní bilaterální dohody s Microsoftem o spolupráci.
* Běhové prostředí Mono mnozí (především komerční) distributoři Linuxu bojkotují. Konkrétně například u nejprodávanější komerční [[Linuxová distribuce|distribuce]] Red Hat Enterprise Linux (RHEL) distributor Red Hat prostředí Mono zcela ignoruje.
* Prostředí Mono je reimplementací .NETu, jehož návrh je optimalizován pro Windows. Na rozdíl od Valy není Mono optimalizované pro GNOME.
* I malý program pro Mono vytváří desítky megabajtů samoúčelných softwarových závislostí na knihovnách Mono.
Řádek 513 ⟶ 512:
 
Vývoji softwaru ve Vale se věnuje GNOME Foundation. Příklady softwaru vytvořeného nadací ve Vale jsou:
* [[Cheese (software)|Cheese]] – aplikace pro používání webkamery, transformace snímaného videa v reálném čase
* [[Dconf]] editor
* [[Vala (programovací jazyk)#Dova|Dova]]
Řádek 520 ⟶ 519:
Ve Vale je napsána také [[LaTeXila]], editor pro [[TeX]] a [[LaTeX]].
 
Vývoji uživatelských aplikací ve Vale se věnujevěnovala nezisková organizace Yorba. Jejími produkty jsou prohlížeč obrázků [[Shotwell]], plugin [[Valencia (software)|Valencia]] pro vývoj v jazyce Vala v [[Gedit]]u, nelineární střižna videa [[Lombard (software)|Lombard]] a pokročilý multikanálový záznamník zvuku [[Fillmore (software)|Fillmore]].<ref>[{{Citace elektronického periodika |titul=Yorba |url=http://yorba.org/ Yorba]|datum přístupu=2011-09-07 |url archivu=https://web.archive.org/web/20110906064041/http://yorba.org/ |datum archivace=2011-09-06 }}</ref>
 
Iniciativa [[ElementaryOSElementary OS]] vyvíjí linuxovou distribuci, v níž uživatelské aplikace budou napsány ve Vale.<ref>http://elementaryos.org/</ref> Iniciativa vyvíjí nové uživatelské aplikace Postler (mailový klient), Maya (kalendář), Wingpanel a Plank (dockování aplikací), Slingshot (spouštěč), App Center (softwarové centrum), Marlin (souborový manažer), Devkit (vývojářský nástroj), Beatbox (hudební přehrávač) a přepisuje slovník Purple z Pythonu do Valy.<ref>[http://bmaupin.wordpress.com/2011/02/28/vala-vala-everywhere/ vala, vala everywhere! | my blog]</ref>
 
Zdrojový kód ve Vale lze vyvíjet například v již zmíněné Valencii, v [[Anjuta|Anjutě]], [[MonoDevelop]] nebo prostředí [[Valaide]]. Při ladění programů napsaných ve Vale se dají pochopitelně nasadit i osvědčené pomůcky používané vývojáři v C/C++.
Řádek 528 ⟶ 527:
== Jazyk Genie ==
{{Infobox - programovací jazyk
| name = Genie
| paradigma = [[Multiparadigmatický programovací jazyk|multiparadigmatický]]
| vznik = [[2008]]
| autor = [[Jamie McCracken]] a další
| vývojář = komunita Genie, [[GNOME Foundation]]
| typování = silné, statické
| implementace = profily překladu glib, posix a dova
| dialekty =
| ovlivněno = Vala, různá [[API]] GNOME, [[Python]], [[Boo (programovací jazyk)|Boo]]
| ovlivnil =
| operační systém = určeno pro GNOME, teoreticky multiplatformní
| licence = [[GNU Lesser General Public License|LGPL]] 2.1 a novější verze
}}
 
V roce 2008 [[Jamie McCracken]] představil jazyk Genie, který využívá projekt Vala.<ref>[http://jamiemcc.livejournal.com/11749.html jamiemcc: Introducing Genie – the smart programming language]</ref> Nepřesně řečeno Genie je jazyk Vala zapisovaný syntaxí jazyka Python. Přípona souborů se zdrojovým kódem je .gs.
 
Řádek 547 ⟶ 545:
Následující ukázkový minimální program typu [[Hello world]] vypíše řetězec "Ahoj".
 
<sourcesyntaxhighlight lang="Genie">
init
print "Ahoj"
</syntaxhighlight>
</source>
 
== Knihovna Gee ==
Řádek 574 ⟶ 572:
| licence = samotný [[GNU Lesser General Public License|LGPL]] 2.1+, včetně GCC [[GNU General Public License|GPL]] 2+
}}
 
Oficiální překladač valac je jediným existujícím překladačem jazyka Vala. Chování překladače určují použité přepínače. Důležité přepínače například umožňují provést pouze kompilaci bez slinkování (přepínač -c), určit přepínače pro překlad mezikódu v jazyce C překladačem GCC (přepínač -X), uložit informace pro debuggování v [[GNU Debugger]] (přepínač -g), uložit vygenerovaný C kód (přepínač -C), určit umístění GObject-Introspection repository souborů (přepínač --gir a --girdir) nebo vytvořit .vapi soubor (přepínač --vapi).
 
Řádek 581 ⟶ 578:
Překlad lze provést několika způsoby. Různé implementace se vybírají volbou tzv. profilu glib, posix nebo dova (např. přepínač --profile=dova).
* glib – základní profil
* posix – Profil posix se algoritmicky podobá profilu glib. Výsledný binární soubor je však staticky slinkován a nevzniká závislost na GLib a dalších sdílených knihovnách.
* dova – Překlad probíhá pomocí frameworku Dova.
 
Řádek 590 ⟶ 587:
 
== Externí odkazy ==
* {{Commonscat}}
* [http://live.gnome.org/Vala Hlavní stránka projektu]
* [http://live.gnome.org/Dova Stránka projektu Dova]
Řádek 595 ⟶ 593:
 
{{Programovací jazyky}}
{{Autoritní data}}
 
[[Kategorie:GNOME]]
[[Kategorie:Programovací jazyky]]
[[Kategorie:Objektově orientované programovací jazyky]]