project roslyn:

30
Joe Hummel, PhD @joehummel [email protected] http://www.joehummel.net/downloads.html Project Roslyn: the compiler is at your service SDC Meetup, Sept 2014

Upload: tadita

Post on 06-Jan-2016

40 views

Category:

Documents


2 download

DESCRIPTION

Project Roslyn:. the compiler is at your service. Joe Hummel, PhD @ joehummel [email protected] http://www.joehummel.net/downloads.html. SDC Meetup , Sept 2014. Joe Hummel, PhD Professor:U. of Illinois, Chicago Consultant:Joe Hummel, Inc. Trainer: Pluralsight Microsoft MVP C++ - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Project Roslyn:

Joe Hummel, PhD

@[email protected]

http://www.joehummel.net/downloads.html

Project Roslyn:the compiler is at your service

SDC Meetup, Sept 2014

Page 2: Project Roslyn:

2Project Roslyn

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

SDC Meetup Sept 2014

Page 3: Project Roslyn:

3Project Roslyn

Demo!

SDC Meetup Sept 2014

Page 4: Project Roslyn:

4Project Roslyn

What is Project Roslyn?

The ".NET Compiler Platform"

Replacement of existing .NET compilers with new ones csc for C# vbc for VB.NET

SDC Meetup Sept 2014

class C{ . . .}

class C{ . . .}

class C{ . . .}

000101010101010101010101010

csc

Page 5: Project Roslyn:

5Project 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

SDC Meetup Sept 2014

Page 6: Project Roslyn:

6Project 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

SDC Meetup Sept 2014

Page 7: Project Roslyn:

7Project Roslyn

Status preview release open source! http://roslyn.codeplex.com

SDC Meetup Sept 2014

Page 8: Project Roslyn:

8Project 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

SDC Meetup Sept 2014

Page 9: Project Roslyn:

9Project Roslyn

Before Roslyn…

SDC Meetup Sept 2014

Page 10: Project Roslyn:

10Project Roslyn

C# and VB compilers were black boxes predefined switches only way to interact…

SDC Meetup Sept 2014

csc

> csc.exe main.cs /o /warn:4

Page 11: Project Roslyn:

11Project Roslyn

After Roslyn…

SDC Meetup Sept 2014

Page 12: Project Roslyn:

12Project 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!

SDC Meetup Sept 2014

csc

Roslyn

Page 13: Project Roslyn:

13Project Roslyn

SDC Meetup Sept 2014

csc

"Call me every time you see an identifier…" (because I'm renaming all global variables)

"Emit this code instead…" (I'm targeting specific HW)

// translate resource strings:foreach(Project p) foreach(Document d) foreach(Resource r) replace(r, r');

Roslyn

Page 14: Project Roslyn:

14Project 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 …

SDC Meetup Sept 2014

?

Page 15: Project Roslyn:

15Project Roslyn

Compiler Basics…

SDC Meetup Sept 2014

Page 16: Project Roslyn:

16Project Roslyn

Front-end vs. Back-end Front-end deals with syntax ― "grammar"

Back-end deals with semantics ― "meaning"

SDC Meetup Sept 2014

Page 17: Project Roslyn:

17Project Roslyn

SDC Meetup Sept 2014

Sourcelanguage

Parsing

Assemblylanguage

Lexical Analysis Compiler

Semantic Analysis

High-level Optimizer Code Gen

Low-level Optimizer

tokens

IR IR' IR''

IR'''

// commentif (x>100) x = 100;

if, (, x, >, 100, ), x, =, …

Typical Compiler Phases

lexical analysisparsing

semantic analysisHL optimizer

code genLL optimizer

syntaxerrors

semanticerrors

Page 18: Project Roslyn:

18Project Roslyn

Roslyn Intermediate Representation (IR) Abstract Syntax Tree (AST)

Symbol Table

SDC Meetup Sept 2014

+

GCD program

0 "int", type, …

1 "void", type, …

2 …

3 "getint", funct, type: 0, …

4 "putint", funct, type: 1, …

5 "i", var, type: 0, …

6 "j", var, type: 0, …

… …

Page 19: Project Roslyn:

19Project 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

SDC Meetup Sept 2014

Page 20: Project Roslyn:

20Project Roslyn

Working with Roslyn…

SDC Meetup Sept 2014

Page 21: Project Roslyn:

21Project Roslyn

Roslyn is BIG There are many APIs… There is the source code itself…

SDC Meetup Sept 2014

+

Page 22: Project Roslyn:

22Project Roslyn

Start small

Let’s create a simple diagnostic that warns about empty catch blocks…

SDC Meetup Sept 2014

Page 23: Project Roslyn:

23Project Roslyn

Step 1: Create new project…

>> Roslyn >> Diagnostic with Code Fix

Name >> EmptyCatchDiagnostic

SDC Meetup Sept 2014

Page 24: Project Roslyn:

24Project Roslyn

Step 2: Create Syntax Node Analyzer

to detect empty catches

SDC Meetup Sept 2014

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, ...){

var catchBlock = node as CatchClauseSyntax;

if (catchBlock.Block.Statements.Count == 0) // empty!{

var diagnostic = Diagnostic.Create(...); // create warning:

addDiagnostic(diagnostic); // display:}

}

Page 25: Project Roslyn:

25Project Roslyn

Step 3: Create Code Fix Provider

to optionally correct problem…

SDC Meetup Sept 2014

internal class CodeFixProvider : ICodeFixProvider{

.

.

// only called for things of interest:public async Task<…> GetFixesAsync(Document document, ...){

var root = await document.GetSyntaxRootAsync(cancellationToken);

var token = root.FindToken(span.Start); // catch keyword:

if (!token.IsKind(SyntaxKind.CatchKeyword)) // sanity check:return null;

var catchBlock = (CatchClauseSyntax)token.Parent;var throwStmt = SyntaxFactory.ThrowStatement();var newStmts = new

SyntaxList<StatementSyntax>().Add(throwStmt);var newBlock =

SyntaxFactory.Block().WithStatements(newStmts);var newCatchBlock = SyntaxFactory.CatchClause().

WithBlock(newBlock).WithAdditionalAnnotations(Formatter.Annotation);

var newRoot = root.ReplaceNode(catchBlock, newCatchBlock);

return new[] { CodeAction.Create("throw", document.WithSyntaxRoot(newRoot)) };

}

Page 26: Project Roslyn:

26Project 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…

SDC Meetup Sept 2014

Page 27: Project Roslyn:

27Project Roslyn

Installing Roslyn…

SDC Meetup Sept 2014

Page 28: Project Roslyn:

28Project Roslyn

Install Roslyn preview on top of VS 2013… That supports seems to be gone

Roslyn preview ships as part of VS “14” CTP 3 So just install VS 14, or Run pre-built VS 14 VM available in Azure VM gallery See http://roslyn.codeplex.com/ for more details

SDC Meetup Sept 2014

Page 29: Project Roslyn:

29Project Roslyn

Summary…

SDC Meetup Sept 2014

Page 30: Project Roslyn:

30Project Roslyn

Thank you for attending! Joe Hummel, PhD Email: [email protected] 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

SDC Meetup Sept 2014