330 likes | 564 Views
Project Roslyn:. the compiler is at your service. Joe Hummel, PhD @ joehummel joe@joehummel.net http://www.joehummel.net/downloads.html. Chicago Code Camp 2014. Joe Hummel, PhD Professor: U. of Illinois, Chicago Consultant: Joe Hummel, Inc. Trainer: Pluralsight Microsoft MVP C++
E N D
Project Roslyn: the compiler is at your service Joe Hummel, PhD @joehummel joe@joehummel.net http://www.joehummel.net/downloads.html Chicago Code Camp 2014
Joe Hummel, PhD • Professor: U. of Illinois, Chicago • Consultant: Joe Hummel, Inc. • Trainer: Pluralsight • Microsoft MVP C++ • Chicago-based, one daughter adopted from China (now 12!) • Avid sailor Project Roslyn
Demo! Project Roslyn
What is Project Roslyn? • The ".NET Compiler Platform" • Replacement of existing .NET compilers with new ones • csc for C# • vbc for VB.NET class C { . . . } class C { . . . } class C { . . . } csc 000101010101010101010101010 Project Roslyn
Why is this a big deal? • Risky • if they get this wrong, folks can't build their apps • if they get this wrong, MSFT can't build their apps Project Roslyn
What's the benefit? • Faster turnaround on new features • inside and outside MSFT • Grow the Visual Studio ecosystem • MUCH easier to build new tools • MUCH easier to extend Visual Studio, C# and VB • MUCH easier to try out new ideas Project Roslyn
Status • preview release • open source! • http://roslyn.codeplex.com Project Roslyn
Open source? • Yes, open source! • Apache license 2.0 • You are free to GIT, fork, modify, rebuild, deploy • Anders did this on stage @ Build 2014 Project Roslyn
Before Roslyn… Project Roslyn
C# and VB compilers were black boxes • predefined switches only way to interact… > csc.exe main.cs /o /warn:4 csc Project Roslyn
After Roslyn… Project Roslyn
The compilers are now white boxes • You can: • obtain information about a program • modify a program syntactically / semantically • impact the compilation process • change the compiler itself! Roslyn csc Project Roslyn
"Call me every time you see an identifier…" (because I'm renaming all global variables) "Emit this code instead…" (I'm targeting specific HW) Roslyn // translate resource strings: foreach(Project p) foreach(Document d) foreach(Resource r) replace(r, r'); csc Project Roslyn
? • What can we do with this capability? • Infinite possibilities: • better tools — refactoring, analysis, … • better enforcement of coding standards • add scripting support to your app • target new platforms • language research — DSLs, … • compiler research • … Project Roslyn
Compiler Basics… Project Roslyn
Front-end vs. Back-end • Front-end deals with syntax ― "grammar" • Back-end deals with semantics ― "meaning" Project Roslyn
// comment if (x>100) x = 100; Typical Compiler Phaseslexical analysisparsingsemantic analysisHL optimizercode genLL optimizer Sourcelanguage Lexical Analysis Compiler tokens if, (, x, >, 100, ), x, =, … IR IR' IR'' Parsing Semantic Analysis High-level Optimizer Code Gen IR''' Low-level Optimizer syntaxerrors semanticerrors Assemblylanguage Project Roslyn
Roslyn Intermediate Representation (IR) • Abstract Syntax Tree (AST) • Symbol Table + GCD program Project Roslyn
How to learn Roslyn AST? • Use the Roslyn Syntax Visualizer! • Open a project • Open a source file • View menu… >> Other Windows >> Roslyn Syntax Visualizer Project Roslyn
Working with Roslyn… Project Roslyn
Roslyn is BIG • There are many APIs… • There is the source code itself… + Project Roslyn
Start small • Let’s create a simple diagnostic that warns about empty catch blocks… Project Roslyn
Step 1: • Create new project… >> Roslyn >> Diagnostic with Code Fix • Name >> EmptyCatchDiagnostic Project Roslyn
public class DiagnosticAnalyzer: ISyntaxNodeAnalyzer<SyntaxKind> { . . . public ImmutableArray<SyntaxKind> SyntaxKindsOfInterest { get { return ImmutableArray.Create( SyntaxKind.CatchClause); } } // only called for things of interest: public void AnalyzeNode(SyntaxNode node, ...) { varcatchBlock = node as CatchClauseSyntax; if (catchBlock.Block.Statements.Count== 0) // empty! { vardiagnostic = Diagnostic.Create(...); // create warning: addDiagnostic(diagnostic); // display: } } • Step 2: • Create Syntax Node Analyzer to detect empty catches Project Roslyn
internal class CodeFixProvider: ICodeFixProvider { . . // only called for things of interest: public async Task<…> GetFixesAsync(Document document, ...) { varroot = await document.GetSyntaxRootAsync(cancellationToken); vartoken = root.FindToken(span.Start); // catch keyword: if (!token.IsKind(SyntaxKind.CatchKeyword)) // sanity check: return null; varcatchBlock= (CatchClauseSyntax)token.Parent; varthrowStmt = SyntaxFactory.ThrowStatement(); varnewStmts= new SyntaxList<StatementSyntax>().Add(throwStmt); varnewBlock= SyntaxFactory.Block().WithStatements(newStmts); varnewCatchBlock= SyntaxFactory.CatchClause().WithBlock(newBlock). WithAdditionalAnnotations(Formatter.Annotation); varnewRoot= root.ReplaceNode(catchBlock, newCatchBlock); return new[] { CodeAction.Create("throw", document.WithSyntaxRoot(newRoot)) }; } • Step 3: • Create Code Fix Provider to optionally correct problem… Project Roslyn
Step 4: • Run! • A .vsix installer is built • A new instance of VS is started • The .vsix is installed • Open a project and test… Project Roslyn
Installing & Using Roslyn… Project Roslyn
Caveats! • You will be *replacing* your C# and VB compilers • Are you sure? • Scripting support is currently missing • i.e. using Roslyn to add C# / VB scripting to your app • MSFT is "re-evaluating design" Project Roslyn
Download "End User Preview / SDK Preview" • http://msdn.microsoft.com/en-gb/roslyn • Get the Preview Project Roslyn
Unzip SDK • Install: • End User Preview • Project Templates • Syntax Visualizer • Roslyn Experimental Hive Project Roslyn
Install Microsoft Visual Studio 2013 SDK Project Roslyn
Summary… Project Roslyn
Thank you for attending! • Joe Hummel, PhD • Email: joe@joehummel.net • Materials: http://www.joehummel.net/downloads.html • For more information on Roslyn: • Docs / FAQ: • http://roslyn.codeplex.com/documentation • Build 2014 on Channel 9 • The Future of C# • https://channel9.msdn.com/Events/Build/2014/2-577 Project Roslyn