Scala – novinky ve verzi 2.10

Scala toho oproti Javě nabízí mnohem víc: jde o kompaktnější jazyk se silnějším typovým systémem, ideální k psaní DSL a programování na správné úrovni abstrakce (FP, OOP, imperativně, deklarativně). Ale kromě toho se Scala vyvíjí drasticky rychlejším tempem. Nová major verze Scaly vychází pravidelně rok od té předchozí a přináší novinky o kterých si v Javě můžeme nechat jenom zdát.

V následujících řádcích si ukážeme novinky, které přinesla Scala 2.10 (momentálně je dostupná verze 2.10.2-RC1).

Value Classes

Třída může nově dědit z předka všech primitivních typů AnyVal. Taková třída je označována za Value Class a chová se jako hodnotový typ (nebo struct z C#). To znamená, že nemusí být nikdy instancována na haldě a kompilátor může vygenerovat kód, do kterého inlinuje vnitřky objektů.

Můžeme tak snadno vytvořit efektivní třídu reprezentující dél­ku:

Když třídu použijeme

Kompilátor přeloží volání metod na statické metody a v co největší míře eliminuje alokace objektů.

Výsledný kód je stejně efektivní jako kdyby pracoval přímo s primitivními typy, ale zároveň je typově bezpečný. Nemůžeme například sčítat délky v metrickém a imperiálním systému (a ztratit tak další satelit), protože to kompilátor jednoduše nepovolí.

Musíme ale brát v potaz některá omezení JVM. Objekt musí být instancován, pokud ho přiřadíme do proměnné typu Any, jde o generický argument nebo ho chceme uložit do pole. Ale i přesto mám value třídy můžou ušetřit velké množství alokací a znatelně ulehčit GC.

Implicit classes

Další novinkou jsou implicitní třídy, kdy můžeme před definici třídy předřadit klíčové slovo implicit a tím redukovat boilerplate implicitních wrapperů.

Postaru:

Nově:

Kompilátor za nás vygeneruje potřebnou implicitní konverzi. Scala tohoto mechanismu využívá natolik, že se i tohle málo počítá (o tom svědčí i fakt, že tento „návrhový vozr“ vylepšování existujících objektů dostal svoje jméno – Pimp my library).

Implicitní třídy jsou navržené tak, aby spolupracovaly s value třídami. Když zkombinujeme tyto dvě novinky, dostaneme obdobu extension methods z C#, tedy možnost přidávat funkcionalitu k existujícím třídám bez toho, abychom museli alokovat wrapper.

Futures

Další zásadní novinku představuje implementace Future ve standardní knihovně.

Future reprezentuje hodnotu, která bude dostupná někdy v budoucnosti. Příkladem může být dotaz do databáze: jeho vykonání trvá určitou dobu, protože s DB serverem musíme komunikovat po síti, ale my nechceme blokovat aktivní vlákno. Proto nám DB driver vrátí Future, která reprezentuje výsledek dotazu (nebo chybu) až k nám dorazí po síti. Future představují efektivní způsob jak provádět asynchronní operace a tyto procesy kombinovat a skládat do větších celků a vytvářet komplexní tok programu, který je pořád zcela asynchronní.

Představte si, že máme dvě metody, které komunikují s Twitter API, obě pracují asynchronně a vracejí Future:

Můžeme napsat program, který provádí operace sekvenčně (protože mezi nimi existuje datová závislost), ale stále asynchronně:

Můžeme je provést současně:

Můžeme spustit několik operací a čekat až všechny úspěšně proběhnou:

Nebo jich provést několik a použít jenom první odpověď:

Důležité je, že všechny tyto složené operace jsou pořád asynchronní, nenutí aktivní vlákno na nic čekat a propagují chyby v jednotlivých krocích. Pokud potřebujeme na konci zřetězených Future něco udělat a nějak ovlivnit vnější svět, můžeme si zaregistrovat callback, který se zavolá ve chvíli, kdy bude future dokončena nebo skončí chybou.

String Interpolation

String Interpolation je další věc, která na první pohled působí jenom jako příjemný dodatek jazyka, ale v kombinaci s ostatními novinkami (hlavně makry) je její uplatnění nedozírné. Zjednodušeně řečeno můžeme do stringu začínajícího identifikátorem přímo vkládat proměnné nebo celé výrazy uvozené dolarem.

Typ Dynamic

Dynamic je speciální typ, který se chová dynamicky, pokud na něm zavoláme neexistující metodu.

Tak například x.foo(arg) se přeloží na x.applyDynamic("foo")(arg), pokud je x podtyp Dynamic a nemá metodu foo. To se může hodit například pro tvorbu dynamických DSL.

Dále hrají:

Kromě těchto velkých novinek, se kterými se programátor bude potýkat při psaní kódu dnes a denně, nová Scala přináší některé změny pod kapotou, které nejsou na první pohled vidět, a miriádu dalších drobností.

  • Nový bytekód generátor založený na ASM (může tvořit 1.5, 1.6 nebo 1.7 bytekód).
  • Nový zcela přepsaný Pattern Matcher, který generuje spolehlivější kód a umí některé zajímavé vylomeniny.
  • Modularizace jazyka, poměrně kontroverzní změna. Abychom mohli používat některé potenciálně problematické vlastnosti Scaly, musíme je explicitně importovat.
  • Podpora pro dependent method types. Nově můžeme například napsat: def identity(x: AnyRef): x.type = x a je zaručeno, že x bude nejen stejný typ jako argument x, ale stejná instance.
  • Konfigurovatelné paralelní kolekce.
  • Akka Actors jsou nově součástí distribuce a původní Scala actory jsou označeny jako deprecated.
  • Vylepšení výkonu: rychlejší inliner, update ForkJoin knihovny používané v paralelních kolekcích, optimalizace typů Range, immutable.TreeSet, immutable.TreeMap a PartialFunction.
  • Přidán operátor ???, který vždycky vyhodí NotImplementedError. Hodí se pro vytvoření prázdných těl zatím neimplemetovaných metod, aby prošly kompilátorem.

Ve vedlejších rolích

Ale ani to není všechno! Scala 2.10 obsahuje ještě dvě zásadní novinky prozatím označené jako experimentální.

Jednou je reflection API, které nabízí mnohem bohatší informace než prostá Javovská reflexe a pracuje se Scala koncepty. Druhou je systém maker lispovského ražení. Díky nim můžeme ovlivnit kompilaci programu, generovat kód, provádět doménově specifické kontroly nebo jakoukoli jinou magii už v době kompilace. Jde o neuvěřitelně mocný dodatek už beztak silného jazyka. I když je zatím v experimentální fázi, už se objevují zajímavé nástroje, která používají makra například na: přehlednější testy, dotazy ve SLICKu, numerické literály, výuku Scaly, optimizaci smyček, inlinování, generování serializačního kódu nebo typově bezpečné SQL a mnoho dalších.

Když se budeme dívat do budoucna, tak následující verze 2.11 má vyjít koncem tohoto roku a bude se soustředit hlavně na výkon a stabilitu celé platformy.

Flattr this!

This entry was posted in Scala. Bookmark the permalink.

2 Responses to Scala – novinky ve verzi 2.10

  1. Dan says:

    Díky za super článek!

  2. Jakub says:

    Hezky clanek, dik.

Leave a Reply

Your email address will not be published. Required fields are marked *