Jazyk Vala - lepší Java

Jazyk Vala bude zřejmě další programovací jazyk, který se naučím po večerech, nebo když mě nebude bavit program běžící v TV. Naposledy jsem si přečetl knížku o jazyku Scala, který se překládá do Java bytekódu a ke svému běhu tedy potřebuje runtime Javy. Docela nedávno jsem se pak díval na dílko společnosti Google -- jazyk Go. Příliš se mi ale nezalíbil.

Vala má docela hodně společných rysů právě s jazykem Go od Googlu. Je to především své místo na poli programovacích jazyků. Vala se snaží být něčím mezi jazyky C/C++ na straně jedné a Javou/C# na straně druhé. Chce programátorům přinést možnost psát programy pohodlně, to jest na vyšší úrovni, podobně jako v Javě, ale neztratit napojení na knihovny a operační systém, podobně jako při programování v C.

Myslím, že se to autorům zatím daří dobře plnit. Orientace jazyka Vala je zejména směrem ke GNOME, a to ani tak ne díky použité knihovně GLib, na které je vlastně všechno vystavěno, ale spíše existujícím API ke GTK+ a dalším knihovnám patřícím ke GNOME. To ale vůbec neznamená, že nelze programovat pro KDE, nebo dokonce tvořit nativní KDE aplikace.

Vala je objektově orientovaná, ale programátorovi umožňuje také imperativní přístup, což vyplývá z logiky věci i celkového zaměření celého jazyka. Tvůrci se rozhodli na rozdíl třeba od Google Go nebo JavaScriptu zavést třídy, což usnadňuje přechod z jazyků Java nebo C#. Podpora vlastností pomocí get/set bloku je podobně řešená jako v C# a podobné je to u delegátů.

Inspiraci nabírali autoři na mnoha místech, líbí se mi i myšlenka signálů namísto použití javovského přístupu posluchačů (listener). Že by inspirace z knihovny QT? Každopádně pakliže má Vala delegáty a signály, potřebuje také -- ano, správně -- uzávěry a funkce vyššího řádu. Někteří asi zajásají, já také.

U podpory výjimek lze cístit jistou podobnoust s jazykem Python. Výjimkám se ve Vale říká prostě chyby (error) a nejsou to třídy, ale v podstatě jen (typované) výčty (enum), které mají speciální syntaxi (klíčové slovo errordomain). A nyní zpozorněte -- důležité hlášení. Vala podporuje explicitní výčet chyb v metodách (kontrolované výjimky pomocí slova throws), ale kompilátor si nevynucuje jejich odchycení (zobrazí jen varování). Takže tolik diskutované vynucené odchytávání výjimek se nekoná a někteří si mohou oddychnout. Ti co mají tuto vlastnost Javy rádi (např. já) si ji mohou ale explicitně zapnout. Výborné řešení.

V jazyku Vala nelze díky úzkému navázání na jazyk C přetěžovat metody, Vala však dovoluje implicitní parametry. Navíc přidává dvě klíčová slova navíc: out a ref, které umožňují modifikovat a inicializovat primitivní typy přes parametry funkcí a metod (je to vylepšené předávání odkazem). Proměnný počet parametrů se prozatím nekoná (lze jej používat směrem do C/C++, ale opačně se na tom zatím pracuje).

Co se týče objektového přístupu, jazyk Vala nabízí "míchaná" (mixin) rozhraní. V podstatě se jedná o rozhraní, které může obsahovat implementované metody. Je zde tedy jistá podobnost se Scalou. Rozhraní nemohou dědit z jiného rozhraní, ale existuje zde model předpokládaného rozhraní, které plní stejnou funkci.

Vala pomáhá programátorovi usnadnit správu paměti a zavádí pojem destruktoru podobně jako v C++. Místo správce paměti (garbage collectoru) má Vala zabudované počítadlo referencí, což sebou přináší výhodu determiničnosti, ale větší možnost zacyklení. Proto je nutné při odkazových cyklech používat slabé reference (klíčové slovo weak) a také kompaktní třídy (compact class) -- velmi odlehčenou verzi třídy bez referenčního počítadla (ale bez některých možností). Programátor má také stále možnost paměť alokovat ručně (new/delete), pokud tedy chce.

Další výhodnou věcí je zavedení pojmu nullability (tak tohle fakt překládat nebudu) a operátoru otazníku. S ním lze omezit výjimky typu NullPointerException či chyby Segfault na minimum. Lze je používat v parametrech metod a funkcí, ale také při deklaraci proměnných (zatím experimentální možnost jazyka).

Další pomůckou, která pomůže robustnosti programů psaných ve Vale, je kontrola argumentů. Jedná se o návyk, který se snaží vštěpit autoři knížek o Javě a jiní "seniorští" programátoři těm začínajícím. Kontrolovat vstupní parametry a vyhazovat IllegalArgumentException. Vala zavádí klíčová slova requires a ensures, které v podstatě do jazyka přinášejí kontrolu vstupních (preconditions) a výstupních (postconditions) podmínek.

Velmi pěknou vlastností je odvozování typů, které umí například i Scala. Překladač v mnoha případech už při překladu přesně ví, jaký typ má mít která proměnná. Progamátor pak použije klíčové slovo var namísto specifikování typu, které je v tomto případě zbytečné. Je to milé zrychlení práce. Struktury (struct) jsou opravdu alokovány na zásovníku, nejdou to tedy jen "falešné" třídy na paměťové hromadě.

Vala má i anotace a jejich syntaxe připomíná C#. Používají se zejména pro různé volby překladače a přímo v jazyku je také podpora pro technologii zasílání zpráv D-Bus, které hraje nezastupitelnou roli v GNOME i KDE. Vala zná pojem jmenného prostoru a knihovny lze sdružovat do balíčků podobně, jako to dělá Java u JAR souborů. Jsou to v podstatě jen (textové) definiční soubory (API) slinkované s obyčejnými C knihovnami.

Ačkoli Vala zvládne podmíněnou kompilaci (#if), nemá v sobě zabudovaná makra. To je podle mého názoru dobré rozhodnutí a přinese to větší přehlednost. Ovšem silná je Vala hlavně v nativním přístupu -- všechno se nakonec překládá pomocí balíku GCC přes jazyk C, takže jakékoliv napojování na knihovny v C/C++ je jednuduché, stejně jako psaní nativního kódu. Binární kompatibilita je tedy zaručena, autoři věnovali značné úsilí tomu, aby bylo snadné tvořit nové bindingy (opět bez překladu). K dispozici je introspector (též nepřekládám) pro C knihovny a generátor Vala API definičních souborů. Takto vygenerované bindingy je nutné obvykle ještě doupravit ručně.

Vala je skvělou příležitostí (nejen) pro C#/Java programátory programovat na nižší úrovni, případně tvořit programy pro Linux, které mají rychlejší odezvu, jsou více napojené na pracovní prostředí a nižší paměťové nároky. A nemusí se jen jednat o programy psané v GTK+ nebo GNOME, do budoucna lze počítat s možností programovat v QT a jiných toolkitech.

S Valou lze také psát knihovny a používat je z jazyků C nebo C++ jako každou jinou C knihovnu. Díky balíku GCC je kód generovaný překladačem Vala také kvalitní a lze předpokládat, že s rozšířením LLVM bude možné Valu kompilovat i přes tento framework.

Svým svkělým návrhem se tak Vala může stát silným nástrojem nejen pro programátory se znalostí Java a C#, ale také pro ty, co znají jiné jazyky a chtěli by něco efektivnějšího nebo nového. Myslím, že Vala má našlápnuto stát se kromě C, C++ a Pythonu hlavním jazykem pro GNOME a do budoucna snad i obsadit podobnou pozici, jakou má nyní platforma Mono. Ale náskok má Mono obrovský -- uvidíme.

Proslýchá se, že v příští verzi Ubuntu bude na instalační CD nasazen místo správce fotografií F-Spot zcela nový program Shotwell. Program F-Spot je často kritizován pro svoji pomalost a paměťovou náročnost (Mono). Naproti tomu Shotwell je bleskurychlý, a je napsaný v jazyce Vala.
19 May 2010 | java | vala
twitter.com linkedin.com
google.com/+ facebook.com
flickr.com youtube.com