Začátkem dubna jsem napsal první článek o novinkách příští verze jazyka C# a zmínil se, že je možné je vyzkoušet v rámci Roslyn End User Preview balíčku. Nezmínil jsem však, jak je možné, že další verze jazyka je dostupná bez další verze .NET Frameworku. To napravím. Dnešním článkem otevírám sérii blogů o projektu zvaném Roslyn, který to má na svědomí.
Kompilátor
Předtím, než se vrhneme na samotný Roslyn, je nutné si doplnit případné chybějící znalosti. Začněme dvěma otázkami:
- Co je to kompilátor?
- Jaká je jeho úloha?
Podle dostupných zdrojů je to počítačový program, který překládá (transformuje) zdrojový kód z jednoho jazyka do kódu v jazyce jiném. Na platformě .NET se můžete setkat rovnou s dvěma druhy. První překládá high-level jazyk (např. C#, VB.NET) do MSIL (Microsoft Intermediate Language) a druhý pak překládá MSIL do strojového kódu za běhu programu. My se v celé sérii budeme bavit o tom prvním.
Současný C# a VB.NET kompilátor je napsaný v jazyce C++ (na disku jej najdete jako csc.exe) a většina programátorů jej vnímá následovně:
To je způsobeno zejména tím, že kompilace se na venek chová jako monolitická akce – nemůžeme se v žádnou chvíli rozhodnout kompilaci zastavit a pracovat s dosavadními výstupy. Pokud neuspěje, dostaneme chybu, pokud uspěje, dostaneme vygenerovanou assembly.
Kompilace se ale ve skutečnosti skládá z následujících kroků:
- Lexikální analýza
- Syntaktická analýza
- Sémantická analýza
- Vygenerování IL
Lexikální analýza rozparsuje text na tzv. lexémy (klíčová slova, jména proměnných, ale i závorky a mezery), které jsou reprezentovány tokeny. Z těchto tokenů jsou pak během syntaktické analýzy postaveny AST (Abstract Syntax Tree), tj. syntaktické stromy. Sémantická analýza pak tyto stromy prochází a přiřazuje jednotlivým tokenům význam na základě tabulky symbolů. Jak takové stromy vypadají, uvidíme později. Pokud je vše sémanticky správně, vygeneruje se IL a zabalí do assembly.
Už Vás napadá, jak Visual Studio může podtrhávat chyby v kódu? Když něco v editoru napíšete, pak se po krátké chvilce neaktivity (řádově milisekundy) spustí na pozadí kompilátor, postaví AST a ověří, jestli je Váš kód sémanticky správně. Nic jiného za tím opravdu není.
No a pak už je také skoro jasné, jak funguje IntelliSense, ne? Každá assembly v sobě nese metadata informace o všech strukturách kódu (veřejné členy třídy, parametry metody, …). Tyto informace jsou načtené v paměti, pokud s danou assembly pracujeme a jakmile někde napíšeme tečku, postaví se AST a VS vyhledá, co by bylo sémanticky správné pokračování a to Vám také nabídne. A tohle všechno (a spousta další “magie”) se děje na pozadí s překvapivou rychlostí. Nevím jak Vám, ale mě to přijde úžasné!
Myslím, že jako úvod do kompilátorů a kompilace by to zatím stačilo. O tomto tématu existuje mnoho knih, které Vás vykoupou v mnohem hlubší vodě, než já :) Tohle málo považuji za nezbytně nutný základ pro každého, kdo to s programováním myslí vážně.
Roslyn
Úvod do problematiky máme za sebou a v této části nově nabité znalosti hned využijeme pro představení platformy Roslyn.
Roslyn je označován jako .NET Compiler Platform, což naznačuje, že se jedná o mnohem robustnější záležitost, než novou černou krabičku. Roslyn je nový C# kompilátor napsaný v C# a zároveň VB.NET kompilátor napsaný ve VB.NET. Společná funkcionalita je napsána v C# a od konference Build 2014 je zdrojový kód kompilátorů otevřený veřejnosti. Veškerý oficiální materiál (kód, dokumentace, …) je dostupný na roslyn.codeplex.com.
Za jeho vznikem stojí hned několik důvodů. Vývojáři současného kompilátoru se zmínili, že “async/await“ je snad poslední věc, co by starý kompilátor mohl podporovat. Prý si nedovedou představit, že by tam zvládli přidat ještě něco jiného pro nadcházející verze jazyka, aniž by to stálo značnou námahu. Roslyn údajně otevírá možnosti, které byly dosud zavřené. Cituji v překladu:
“Některé novinky následujících verzí jazyka jsou vedlejší produkty přepisu a my jsme se rozhodli je nezakázat. Implementace některých dalších vyžadovala pouze přidání či ubrání jediného řádku kódu.” (D. Campbell, Build 2014)
Dalším důvodem jsou také zvyšující se požadavky na spolupráci IDE s programátorem. Chceme rychleji prohledávat solution, ve kterém pracujeme, požadujeme důkladnou statickou analýzu kódu, nástroje na refaktorování a všechno to samozřejmě chceme dostat, jakmile o to požádáme, bez čekání.
Před vznikem Roslynu prý také každý tým v Microsoftu, jehož produkt je na kompilaci závislý používal vlastní verzi a nové vlastnosti se tak musely zvlášť přidávat několikrát. V současně době už jsou všechny produkty napsané v C# nebo VB.NET přeloženy Roslynem, který týmy opět trochu sjednotil.
ROSLYN API
Na následujícím obrázku jsou znázorněny fáze kompilace tak, jak jsem je popsal v první sekci článku a pro každou z těchto čtyř částí existuje v Roslynu veřejné API, poskytující služby, které znáte z Visual Studia.
Tyto služby jsou od příští verze VS kompletně přestavěny na nové API. Po instalaci Roslyn End User Preview jsou také dostupné ve VS 2013. Roslyn pak jeho uživateli (Visual Studio a programátor) nabízí dvě úrovně API – compiler a workspaces – a VS nad nimi vytvořilo další API, které využívá pro svoje nástroje.
Ve spodu je API samotného kompilátoru, následuje nástavba nezávislá na VS pro práci se solution, projekty a dokumenty (formátování kódu, vyhledávání, atd.) a v poslední úrovni jsou funkce Visual Studia (refactoring, návrhy oprav, atd.).
Jednotlivé compiler API nabízejí informace získané v každé fázi kompilace a dohromady tak poskytují například API pro diagnostiku kódu. Toto API dává možnost třetím stranám přidat do procesu kompilace vlastní diagnostiku, jako je FxCop. Právě tato vlastnost by měla v budoucnu umožnit napsat si vlastní diagnostiky a distribuovat je jako součást knihoven v rámci NuGet balíčků. To by znamenalo, že konzumentům Vašich knihoven můžete pomocí interaktivní diagnostiky (podtrhávání, varování, …) radit, jak má být Vaše API používáno.
Compiler API by také do budoucna mohlo přinést podporu REPL vývoje (skriptování) pro oba jazyky.
V tomto článku jsem Vám vysvětlil základy kompilátorů a procesu kompilace jako nezbytný základ pro porozumění tomuto seriálu. Poté jsem představil platformu Roslyn z vnějšího pohledu. V příštích dílech si podrobněji představíme obě vrstvy API Roslynu.
Zdroj: http://roslyn.codeplex.com/wikipage?title=Overview&referringTitle=Home