Scala - pro a proti

I tak by se dal shrnout obsah přednášky Czech Scala Enthusiasts komunity v rámci informatického večera na FITu.

Přednáška byla zamýšlena především jako motivační úvod do širokého spektra možností, které Scala přináší, poukázala na zajímavé konstrukce jazyka, které mohou ulehčit každodenní práci, redukovat boilerplate kód a snižovat prostor pro případné chyby, ale představila také současné největší problémy Scaly při jejím zavádění do praxe.

Scala je používána velkými firmami, které často vyvíjejí rozsáhlé škálovatelné aplikace v oblasti sociálních sítí. A podporuje produktivnější vývoj díky konstrukcím, které svou obecností nebo elegantním zápisem převyšují dosavadní možnosti Javy.

Principy návrhu Scaly

Scala stojí na silných teoretických základech a při svém návrhu se poučila z velkého množství funkcionálních a nefunkcionálních jazyků - taková míra zvažovaných podnětů zatím neměla při návrhu nového jazyka obdoby. Díky tomu Scala kombinuje objektově orientované programování a funkce do jednoho přirozeného celku, kde se obě paradigmata vzájemně doplňují a podporují.

Scala staví na malém množství silných a dostatečně obecných jazykových konstrukcí, základních kamenů, které lze využít pro vytvoření mnoha synergických efektů, technik a best practices, která vedou k efektivnější tvorbě aplikací nebo obecnějším abstrakcím. Důležitou roli sehrává zejména propracovaný typový systém Scaly, který představuje významnou část jinak poměrně stručné specifikace Scaly. Do Scaly jako jazyka se často nedostanou konstrukce, které jsou příliš úzce zaměřené na nějaký částečný problém.

Vlastnosti Scaly prakticky

Tyto základní principy jazyka a jeho návrhu přestavil Vlastimil Menčík a Jakub Janeček navázal zajímavými konstrukcemi Scaly prakticky na několika příkladech. Probrány byly metody a funkce, základní konstrukty typového systému (class, object, trait), elegantní operace bohaté knihovny kolekcí, typ Option jako alternativa k null hodnotám, pattern matching, function currying, implicitní konverze a implicitní parametry a ukázky DSL vytvořených přímo jazykovými prostředky Scaly.

Temná stránka Scaly

Temnou stránku Scaly přestavil Karel Smutný. Síla a inovativnost Scaly s sebou nese také odpovědnost za uvážlivé používání nových konstrukcí jako jsou např. implicitní konverze. Pokud jsou nové vlastnosti nevhodně použité, nemusí být výslednému kódu snadné porozumět. Vývojáři ve Scale řeší především následující tři problémy, které si představíme trochu podrobněji.

Binární nekompatibilita

Když se změní verze knihoven, na kterých je projekt závislý, a to se týká i samotných knihoven Scaly (při přechodu na novější verzi), je třeba projekt oproti novým knihovnám překompilovat, i když na úrovni zdrojových kódů nedošlo při připojení nových verzí knihoven k žádné nekompatibilitě.

Nekompatibilita se může projevit na úrovni zkompilovaných souborů, a to až za běhu programu (např. jako NoSuchMethodError). Může ji způsobit např. přidání nové metody s implementací do traitu určité knihovny. Pokud bychom kód nepřekompilovali, může se stát, že se knihovna pokusí o zavolání metody, která v klientském projektu na úrovni kompilovaných souborů chybí.

Trait až na podstatnou výjimku, že může konkrétně implementovat vybrané metody, odpovídá rozhraním v Javě. Právě kvůli pokročilým možnostem typového systému Scaly, a konkrétně např. možnostem traitů, může dojít k binární nekompatibilitě, způsobené potřebami kompilátoru zavádět do kompilovaného kódu pomocné konstrukce, díky kterým lze nové vlastnosti Scaly reprezentovat v běhovém prostředí JVM. S novými verzemi Javy a novými možnostmi JVM by Scala kompilátor mohl využívat efektivnější interní implementace a binární nekompatibilitu minimalizovat.

Protatím je však nutné při povyšování projektu na novou verzi Scaly dávat pozor, aby závislosti byly oproti nové verzi Scaly překompilované, a pokud tomu tak není, je potřeba počkat, než se tak stane. Pokud závislosti čekají na upgrade svých vlastních závislostí, může se takové čekání protáhnout.

Autoři Scaly jsou si problémů s binární nekompatibilitou vědomi a snaží se je aktivně řešit.

Naučit se Scalu není jednoduché

Poměrně rychle se lze naučit základní vlastnosti Scaly potřebné pro skriptování nebo implementaci menších aplikací ve Scale a používaní již existujících knihoven, celkem obtížné je ale proniknout do pokročilejších oblastí Scaly, které umožňují implementovat (a znovupoužívat) vlastní knihovny, které se budou elegantně používat a dobře udržovat. Scala potenciál pro vytváření takových knihoven má, ale složitější konstrukce typového systému a občasná magie implicitních konverzí vyžaduje více experimentů, rozmýšlení a souvisejícího studia.

Jak lze vhodně postupovat při učení Scaly, dobře zachycuje článek Basic Scala Resources (How To Fall In Love With Scala in 5 or Less Steps).

Nástroje pro vývoj nejsou stále vyzrálé

Alespoň ne tak jako jejich Java protějšky. Dobrou zprávou ale je, že Typesafe pluginy pro oblíbená IDE aktivně vyvíjí a situace se stále zlepšuje. Přesto Scala IDE pro Eclipse je zatím stále chudým protějškem ve srovnání s možnostmi refaktoringu, inspekce kódu a další podpory IDE pro Javu. O krok dále je stále IntelliJ IDEA, ale ani zde není situace ideální.

Článek obsahuje 5 komentářů

  • plan9

    1
    ja chapu, ze svet leti jako splaseny kun vpred, ale proc musim mit novy programovaci jazyk, kdyz bych mohl mit C s onacejsimi knihovnami. ze s novym jazykem se asi nauci jinak myslet (moderneji) nez s C, ale je to spravna cesta skauta?!!!!
  • Vlastimil Menčík

    2
    Nový jazyk samozřejmě mít nemusíte. Linuxové jádro nebo ovladače grafických karet asi nadlouho zůstanou doménou vašeho oblíbeného jazyka. Oficiální názor skatutů na vývoj progamovacích jazyků si ale budete muset vyžádat jinde :)
  • Poslední skaut

    3
    Forth je cestou skauta.
  • Karel Smutný

    4
    Nač potřebuji C, když mám assembler? Nač potřebuji assembler, když mám strojový kód? Každý nový jazyk přináší nové koncepty a nové abstrakce, která mají programátorům pomoci řešit jejich problém snáze, elegantněji nebo efektivněji. A každý nový jazyk je zaměřen na jiné problémy/domény. Scala konkrétně je vhodná na vysoce škálovatelné systémy jako např. sociální sítě nebo burzovní obchodní systémy. Píší se v nich snáze než v C.
  • Václav

    5
    Mám vyzkoušen scala plugin (https://github.com/dcaoyuan/nbscala) do netbeans IDE v kombinaci s mavenem (https://github.com/davidB/scala-maven-plugin) a nemohu si stěžovat - až na pár nedokonalostí se mi v tom vyvíjí dobře. Vyzkoušel jsem i Eclipse a IntelliJ, ale opět jsem se musel vrátit k netbeans, jelikož mi přijde mnohem jednodušší a přehlednější (samozřejmě otázka vkusu)..Tak to jentak poznámka k těm nástrojům :)