Upload
others
View
10
Download
0
Embed Size (px)
Citation preview
Joe Hummel, PhD
@joehummel
http://www.joehummel.net/downloads.html
the compiler is at your service
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
Chicago Code Camp 2014 2 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
Chicago Code Camp 2014 4 Project Roslyn
class C { . . . }
class C { . . . }
class C { . . . }
000101010 101010101 010101010
csc
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
Chicago Code Camp 2014 5 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
Chicago Code Camp 2014 6 Project Roslyn
Status preview release
open source!
http://roslyn.codeplex.com
Chicago Code Camp 2014 7 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
Chicago Code Camp 2014 8 Project Roslyn
C# and VB compilers were black boxes predefined switches only way to interact…
Chicago Code Camp 2014 10 Project Roslyn
csc
> csc.exe main.cs /o /warn:4
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!
12 Chicago Code Camp 2014
Project Roslyn
csc
Roslyn
13 Chicago Code Camp 2014
Project Roslyn
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
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
…
Chicago Code Camp 2014 14 Project Roslyn
Front-end vs. Back-end
Front-end deals with syntax ― "grammar"
Back-end deals with semantics ― "meaning"
Chicago Code Camp 2014 16 Project Roslyn
Chicago Code Camp 2014 17 Project Roslyn
Source
language
Parsing
Assembly
language
Lexical Analysis Compiler
Semantic Analysis
High-level Optimizer
Code Gen
Low-level Optimizer
tokens
IR IR' IR''
IR'''
// comment if (x>100) x = 100;
if, (, x, >, 100, ), x, =, …
syntax
errors
semantic
errors
Roslyn Intermediate Representation (IR)
Abstract Syntax Tree (AST)
Symbol Table
Chicago Code Camp 2014 18 Project Roslyn
+
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, …
… …
How to learn Roslyn AST?
Use the Roslyn Syntax Visualizer! Open a project
Open a source file
View menu…
>> Other Windows
>> Roslyn Syntax Visualizer
Chicago Code Camp 2014 19 Project Roslyn
Roslyn is BIG There are many APIs…
There is the source code itself…
Chicago Code Camp 2014 21 Project Roslyn
+
Start small
Let’s create a simple diagnostic that warns about empty catch blocks…
Chicago Code Camp 2014 22 Project Roslyn
Step 1: Create new project…
>> Roslyn
>> Diagnostic with Code Fix
Name
>> EmptyCatchDiagnostic
Chicago Code Camp 2014 23 Project Roslyn
Step 2: Create Syntax Node Analyzer
to detect empty catches
Chicago Code Camp 2014 24 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, ...) { var catchBlock = node as CatchClauseSyntax; if (catchBlock.Block.Statements.Count == 0) // empty! { var diagnostic = Diagnostic.Create(...); // create warning: addDiagnostic(diagnostic); // display: } }
Step 3: Create Code Fix Provider
to optionally correct problem…
Chicago Code Camp 2014 25 Project Roslyn
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)) }; }
Step 4: Run!
A .vsix installer is built
A new instance of VS is started
The .vsix is installed
Open a project and test…
Chicago Code Camp 2014 26 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"
Chicago Code Camp 2014 28 Project Roslyn
Download "End User Preview / SDK Preview" 1. http://msdn.microsoft.com/en-gb/roslyn
2. Get the Preview
Chicago Code Camp 2014 29 Project Roslyn
Unzip SDK
Install: 1. End User Preview
2. Project Templates
3. Syntax Visualizer
4. Roslyn Experimental Hive
Chicago Code Camp 2014 30 Project 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
Chicago Code Camp 2014 33 Project Roslyn