SlideShare ist ein Scribd-Unternehmen logo
1 von 64
Robin Sedlaczek | Chief Technical Officer at Fairmas GmbH
robinsedlaczek
robinsedlaczek.wordpress.com
Über mich
 CTO der Fairmas GmbH in Berlin
Zuständig für den gesamten Entwicklungsbereich
Softwarearchitektur
Implementierung von Entwicklungsprozessen
Prozessautomatisierung
Technologieberatung
 Moderator in der MSDN
 Freier Autor für Windows Developer, Heise…
 Sprecher in User Groups
 Beteiligung im Open Source Projekt „SharpGL“
 .NET Code Geek
robinsedlaczek
robinsedlaczek.wordpress.com
Robin Sedlaczek
robinsedlaczek@live.de
TheBerlinMicrosoftConnection
 #SpeakRoslyn bald in der MVA!
 Microsoft Virtual Academy
Kostenlose Online-Trainings für Entwickler und IT Professionals
Mehr als 2.3 Millionen registrierte Nutzer
Regelmäßig neue Trainings zu aktuellen Microsoft Produkten und Technologien
Live- und on-demand-Kurse
Join the MVA Community! robinsedlaczek
robinsedlaczek.wordpress.com
#SpeakRoslyn – Mach mit!
 Kommentaren, Feedback, Kritiken
 Foto #SpeakRoslyn
Über Tweets mit…
würde ich mich sehr freuen!
robinsedlaczek
robinsedlaczek.wordpress.com
01 | Überblick
Robin Sedlaczek | Chief Technical Officer at Fairmas GmbH
robinsedlaczek
robinsedlaczek.wordpress.com
Die Compiler-Blackbox
 Compiler sind klassisch gesehen Blackboxes
 Geschlossene Softwarekomponenten
 Übersetzen Quellcode in etwas Ausführbares (Binärdateien)
Compiler
/// <summary>
/// This is the base class for all
/// shaders (vertex and fragment). It
/// offers functionality which is core
/// to all shaders, such as file
/// loading and binding.
/// </summary>
public class Shader
{
public void Create(OpenGL gl, uint shaderType,
string source)
{
// Create the OpenGL shader object.
shaderObject = gl.CreateShader(shaderType);
// Set the shader source.
gl.ShaderSource(shaderObject, source);
// Compile the shader object.
gl.CompileShader(shaderObject);
// Now that we've compiled the shader, check
// it's compilation status. If it's not
// compiled properly, we're going to throw
// an exception.
if (GetCompileStatus(gl) == false)
{
throw new ShaderCompilationException(
string.Format(
"Failed to compile shader {0}.",
shaderObject), GetInfoLog(gl));
}
}
Code File
1 1 0 0 1
0 1 1
1 1 0 1 0
1 1 1
0 1 1 1 1 0 0 1
1 0 1 0 1
1 1 0 0 1 0 1 1
0 1 1 1 0 1
1 1 0 1 0 0 0 1
1 0 1 0 1
0 1 1 1 1 0 0 1
1 0 1 0 1
1 1 0 0 1 0 1 1
0 1 1 0 1
1 0 1 0 1
Binary File
robinsedlaczek
robinsedlaczek.wordpress.com
Das Problem mit der Blackbox
 tiefes Verständnis des Codes während Übersetzung
 Wissen, dass von IDEs und Werkzeugen genutzt werden könnte
 Problem: Wissen steht nach Kompilierung nicht mehr zur Verfügung
 Devs/Toolhersteller müssen ggf. Code selbst analysieren
Compiler
robinsedlaczek
robinsedlaczek.wordpress.com
Lösung des Problems
 Aufbrechen der Blackbox
 Bereitstellung einer API-Schicht über dem Compiler
 Bereitstellung der Compiler-Ergebnisse über Objektmodelle
Phase 1 Phase 2 Phase 3 Phase 4
Blackbox wird zur Plattform:
.NET Compiler Platform
robinsedlaczek
robinsedlaczek.wordpress.com
Vorteile/Nutzen
 Zugriff auf Compiler-Wissen zu jeder Zeit
 Code-bezogenen Aufgaben in eigenen Anwendungen
 Codetransformation und Codegenerierung
 Interaktive Szenarien (z.B. VS Immediate Window)
 Einbettung C#/VB in DSLs
 Metaprogrammierung
robinsedlaczek
robinsedlaczek.wordpress.com
Open Source
 Roslyn ist Open Source!
https://github.com/dotnet/roslyn
 Verwaltet von der .NET Foundation
http://www.dotnetfoundation.org/projects
 Erlaubt Einblicke und Debugging des Codes
 Mitwirkung bei Entwicklung durch Community
 Repository kann geforkt werden
robinsedlaczek
robinsedlaczek.wordpress.com
Visual Studio
 Auf Roslyn basierte C#/VB-Sprachfeatures und IDE-Features ab Visual
Studio 2015 enthalten
 Projektvorlagen: SDK Templates VSIX package
 Bibliotheken: NuGet Roslyn compiler package
 Syntax Visualizer: Syntax Visualizer VSIX package
robinsedlaczek
robinsedlaczek.wordpress.com
02 | Grundlagen
Robin Sedlaczek | Chief Technical Officer at Fairmas GmbH
robinsedlaczek
robinsedlaczek.wordpress.com
Was tut ein Compiler?
 Übersetzt z.B. VB.NET, C# nach IL Code, C# nach Maschinencode (.NET Native),
C/C++ in Maschinencode...
Compiler
/// <summary>
/// This is the base class for all
/// shaders (vertex and fragment). It
/// offers functionality which is core
/// to all shaders, such as file
/// loading and binding.
/// </summary>
public class Shader
{
public void Create(OpenGL gl, uint shaderType,
string source)
{
// Create the OpenGL shader object.
shaderObject = gl.CreateShader(shaderType);
// Set the shader source.
gl.ShaderSource(shaderObject, source);
// Compile the shader object.
gl.CompileShader(shaderObject);
// Now that we've compiled the shader, check
// it's compilation status. If it's not
// compiled properly, we're going to throw
// an exception.
if (GetCompileStatus(gl) == false)
{
throw new ShaderCompilationException(
string.Format(
"Failed to compile shader {0}.",
shaderObject), GetInfoLog(gl));
}
}
Code File
1 1 0 0 1
0 1 1
1 1 0 1 0
1 1 1
0 1 1 1 1 0 0 1
1 0 1 0 1
1 1 0 0 1 0 1 1
0 1 1 1 0 1
1 1 0 1 0 0 0 1
1 0 1 0 1
0 1 1 1 1 0 0 1
1 0 1 0 1
1 1 0 0 1 0 1 1
0 1 1 0 1
1 0 1 0 1
Binary File
 Allgemein: übersetzt Programm aus formaler Quellsprache in semantisch äquivalente
formale Zielsprache
robinsedlaczek
robinsedlaczek.wordpress.com
Fragen
 Aber wie genau macht der Compiler das?
 Wie kann der Compiler eine einfache Textdatei inhaltlich verstehen?
 Wie verwandelt er den Text in ausführbare Bits und Bytes?
robinsedlaczek
robinsedlaczek.wordpress.com
Aufbau eines Compilers
Vorweg, ein kleiner Exkurs…
Aufbau der Blackbox…
robinsedlaczek
robinsedlaczek.wordpress.com
Natürliche vs. Formale Sprachen
 Natürliche Sprachen leben
 Akzente/Dialekte
 Grammatik/Regeln werden nicht
strikt befolgt
 Mensch ist sehr fehlertolerant
 Mehrdeutigkeit
 Sehr komplex, Semantik kann nicht
beschrieben werden
robinsedlaczek
robinsedlaczek.wordpress.com
Was sind formale Sprachen?
 Mathematische Beschreibung einer Sprache
 Alphabet + Wortbildungsregeln
 Werden durch Zustandsautomaten erkannt
 Klassifiziert in Chomsky-Hierarchie
„Menge von Wörtern, die über einem
bestimmten Alphabet und nach definierten
Regeln gebildet werden können.“
robinsedlaczek
robinsedlaczek.wordpress.com
Definition formale Sprache
 Mathematische Beschreibung = formale Grammatik
V = nicht-terminale Zeichen
Σ = terminale Zeichen (Alphabet)
R = Produktionen (Regeln)
S = Startsymbol (aus V)
robinsedlaczek
robinsedlaczek.wordpress.com
Beispiel formale Sprache
Die Sprache beinhaltet Bedingungsanweisungen. Diese können verschachtelt sein.
Bedingungsanweisungen können etwas auf wahr oder falsch testen.
V = { expr, condition, left, right }
Σ = { id, if, (, ), {, }, true, false, == }
R = {
expr  if (condition) { expr },
condition  left == right,
left  id,
left  true,
left  false,
right  id,
right  true,
right  false
}
S = expr
robinsedlaczek
robinsedlaczek.wordpress.com
V = { expr, condition, left, right }
Σ = { id, if, (, ), {, }, true, false, == }
R = {
expr  if (condition) { expr },
condition  left == right,
left  id,
left  true,
left  false,
right  id,
right  true,
right  false
}
S = expr
Beispiel formale Sprache
Ist der folgende Ausdruck Teil der Sprache?
if (id == true)
{
if (false == id)
{
}
}
Start: expr
(1)  if (condition) { expr }
(1)  if (condition) { if (condition) { } }
(2)  if (left == right) { if (condition) { } }
(2)  if (left == right) { if (left == right) { } }
(3)  if (id == right) { if (left == right) { } }
(7)  if (id == true) { if (left == right) { } }
(5)  if (id == true) { if (false == right) { } }
(6)  if (id == true) { if (false == id) { } }
(1)
(2)
(3)
(4)
(5)
(6)
(7)
(8)
Ausdruck ist Teil der Sprache!
robinsedlaczek
robinsedlaczek.wordpress.com
 Formales Beschreiben von Textstrukturen (Grammatik)
 Programmiersprachen
 Textstrukturen können mit Algorithmus erkannt werden (Parsen)
 Einlesen, Syntaxüberprüfung
Beispiel formale Sprache
Was bedeutet das für einen Compiler?
robinsedlaczek
robinsedlaczek.wordpress.com
Beispiel formale Sprache
expr
conditionif (
AST
(Abstract Syntax Tree)
) { }expr
Start: expr
 if (condition) { expr }
 if (condition) { if (condition) { } }
 if (left == right) { if (condition) { } }
 if (left == right) { if (left == right) { } }
 if (id == right) { if (left == right) { } }
 if (id == true) { if (left == right) { } }
 if (id == true) { if (false == right) { } }
 if (id == true) { if (false == id) { } }
conditionif ( ) { }
left == right
left == right
id
true
false
id
nicht-terminal
terminal
robinsedlaczek
robinsedlaczek.wordpress.com
 Textstrukturen (Syntax) als Baumstruktur darstellbar
 Analyse und Auswertung des Baums
 Syntaxanalyse
 Tiefes Verständnis der Textstruktur
Beispiel formale Sprache
Was bedeutet das für einen Compiler?
robinsedlaczek
robinsedlaczek.wordpress.com
Aufbau eines Compilers
Zerlegen des
Quelltextes in Tokens
Parsen der Tokens in
die Syntax, die von
der Grammatik
vorgegeben ist (AST)
Tokenizer/
Lexer
Parser
Lexikalische
Analyse
Syntaktische
Analyse
robinsedlaczek
robinsedlaczek.wordpress.com
 Aufbau des Codes
 Strukturen, Klassen, Aufzählungen
 Methoden, Eigenschaften, Variablen
 Bedingungen, Schleifen
 …
Syntaxanalyse
Was weiß der Compiler?
robinsedlaczek
robinsedlaczek.wordpress.com
Syntaxanalyse
Was weiß der Compiler bisher nicht?
public virtual void Initialize(int count)
{
particles.Clear();
for (int i = 0; i < count; i++)
{
Particle particle = new BasicParticle();
particle.Intialize(rand);
particles.Add(particle);
}
}
Von welchem Typ sind die
Parameter?
Welche Member dürfen
aufgerufen werden?
Welche Variablen sind hier
gültig?
Semantik!
robinsedlaczek
robinsedlaczek.wordpress.com
Symboltabelle
 Deklarationen analysieren
Symbole
/// <summary>
/// This is the base class for all
/// shaders (vertex and fragment). It
/// offers functionality which is core
/// to all shaders, such as file
/// loading and binding.
/// </summary>
public class Shader
{
public void Create(OpenGL gl, uint shaderType,
string source)
{
// Create the OpenGL shader object.
shaderObject = gl.CreateShader(shaderType);
// Set the shader source.
gl.ShaderSource(shaderObject, source);
// Compile the shader object.
gl.CompileShader(shaderObject);
// Now that we've compiled the shader, check
// it's compilation status. If it's not
// compiled properly, we're going to throw
// an exception.
if (GetCompileStatus(gl) == false)
{
throw new ShaderCompilationException(
string.Format( "Failed to compile shader {0}.",
shaderObject), GetInfoLog(gl));
}
}
Code File
Assemblies
 Benannte Symbole bilden
 Symboltabelle aufbauen
 Typen und Typsignaturen bekannt machen
Referenz
robinsedlaczek
robinsedlaczek.wordpress.com
Binder
Symboltabelle
/// <summary>
/// This is the base class for all
/// shaders (vertex and fragment). It
/// offers functionality which is core
/// to all shaders, such as file
/// loading and binding.
/// </summary>
public class Shader
{
public void Create(OpenGL gl, uint shaderType,
string source)
{
// Create the OpenGL shader object.
shaderObject = gl.CreateShader(shaderType);
// Set the shader source.
gl.ShaderSource(shaderObject, source);
// Compile the shader object.
gl.CompileShader(shaderObject);
// Now that we've compiled the shader, check
// it's compilation status. If it's not
// compiled properly, we're going to throw
// an exception.
if (GetCompileStatus(gl) == false)
{
throw new ShaderCompilationException(
string.Format(
"Failed to compile shader {0}.",
shaderObject), GetInfoLog(gl));
}
}
Code File
var my = new MyType();
public void DoSomething(MyType my) { … }
public event EventHandler MyEvent;
 Identifier im Code zu Symbolen zuordnen
 Bedeutung des Codes
 Semantische Analyse
robinsedlaczek
robinsedlaczek.wordpress.com
Aufbau eines Compilers
Zerlegen des
Quelltextes in Tokens
Parsen der Tokens in
die Syntax, die von
der Grammatik
vorgegeben ist (AST)
Typdeklarationen aus
Code und Metadaten
zu benannten
Symbolen
(Symboltabelle)
Identifier in Code
abstimmen/verbinden
mit benannten
Symbolen
Tokenizer/
Lexer
Parser Symbols Binder
Lexikalische
Analyse
Syntaktische
Analyse
Semantische
Analyse
robinsedlaczek
robinsedlaczek.wordpress.com
Aufbau eines Compilers
Zerlegen des
Quelltextes in Tokens
Parsen der Tokens in
die Syntax, die von
der Grammatik
vorgegeben ist (AST)
Typdeklarationen aus
Code und Metadaten
zu benannten
Symbolen
(Symboltabelle)
Identifier in Code
abstimmen/verbinden
mit benannten
Symbolen
Plattformunabhängige
Optimierungen
Plattformabhängige
Optimierungen
All gesammelten
Informationen werden in
Binary/Assembly
ausgegeben
Tokenizer/
Lexer
Parser Symbols Binder
CodeGen
Preprocessor
Code Generator
CodeGen
Postprocessor
Lexikalische
Analyse
Syntaktische
Analyse
Semantische
Analyse
Synthese-
Phase
robinsedlaczek
robinsedlaczek.wordpress.com
03 | APIs
Robin Sedlaczek | Chief Technical Officer at Fairmas GmbH
APIs
 Compiler APIs
 Workspace APIs
robinsedlaczek
robinsedlaczek.wordpress.com
APIs – Compiler Services robinsedlaczek
robinsedlaczek.wordpress.com
APIs – Compiler Services
 Compiler API
- Sprachspezifische Objektmodelle für alle Phasen der Kompilierung
- Unveränderlicher Snapshot eines Compiler-Aufrufes
- Keine Abhängigkeiten zu Visual Studio
 Diagnostics API
- Erweiterbare API (Analyzers)
- Hängt sich direkt in Analysephase
- Fehler, Warnungen, Informationen
robinsedlaczek
robinsedlaczek.wordpress.com
APIs - Workspaces robinsedlaczek
robinsedlaczek.wordpress.com
APIs – Workspaces robinsedlaczek
robinsedlaczek.wordpress.com
APIs – Workspaces
 Objektmodell zur Darstellung einer Solution
 Einstiegspunkt für Solution-weite Analysen und Refactorings
 Zugriff auf Compiler Services
robinsedlaczek
robinsedlaczek.wordpress.com
APIs - Namespaces
 Microsoft.CodeAnalysis.dll
 Microsoft.CodeAnalysis.Workspaces.dll
 Microsoft.CodeAnalysis.CSharp.dll
 Microsoft.CodeAnalysis.CSharp.Workspaces.dll
 Microsoft.CodeAnalysis.VisualBasic.dll
 Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll
robinsedlaczek
robinsedlaczek.wordpress.com
04 | Syntax- und Symbolanalyse
Robin Sedlaczek | Chief Technical Officer at Fairmas GmbH
robinsedlaczek
robinsedlaczek.wordpress.com
Syntaxanalyse
var tree = CSharpSyntaxTree.ParseText(sourceCode);
var node = tree.GetRoot();
 SyntaxTree ist abstrakt
 Parsing über sprachspezifische Ableitung
 SyntaxTree ist immutable
robinsedlaczek
robinsedlaczek.wordpress.com
Syntaxanalyse
node.ChildNodes()
node.ChildTokens()
node.GetLeadingTrivia()
node.GetTrailingTrivia()
node.DescendantNodes()
node.DescendantTokens()
node.DescendantTrivia()
token.LeadingTrivia
token.TrailingTrivia
trivia.GetStructure()
trivia.GetStructure()
Traversierung des Syntaxbaums
robinsedlaczek
robinsedlaczek.wordpress.com
public.void.Do(string.what).
{.
....var.so.=.true;.
.
#if.DEBUG.
....so.=.false;.
#endif.
.
....if.(so.==.what).
........DontDo();.
}.
Syntax Node
 SyntaxNode (Declarations, Statements, Clauses, Expressions)
robinsedlaczek
robinsedlaczek.wordpress.com
public void Do(string what)
{.
....var.so.=.true;.
.
#if.DEBUG.
....so.=.false;.
#endif.
.
....if.(so.==.what).
........DontDo();.
}.
Syntax Node
 SyntaxNode (Declarations, Statements, Clauses, Expressions)
robinsedlaczek
robinsedlaczek.wordpress.com
public void Do(string what)
{.
....var.so.=.true;.
.
#if.DEBUG.
....so.=.false;.
#endif.
.
....if.(so.==.what)).
........DontDo();.
}.
Syntax Node
 SyntaxNode (Declarations, Statements, Clauses, Expressions)
robinsedlaczek
robinsedlaczek.wordpress.com
public void Do(string what)
{.
....var.so.=.true;.
.
#if.DEBUG.
....so.=.false;.
#endif.
.
....if.(so.==.what)).
........DontDo();.
}.
Syntax Node
 SyntaxNode (Declarations, Statements, Clauses, Expressions)
robinsedlaczek
robinsedlaczek.wordpress.com
public void Do(string what)
{.
....var.so.=.true;.
.
#if.DEBUG.
....so.=.false;.
#endif.
.
....if.(so.==.what)
........DontDo();.
}.
Syntax Node
 SyntaxNode (Declarations, Statements, Clauses, Expressions)
robinsedlaczek
robinsedlaczek.wordpress.com
Syntax Node
 SyntaxNode (Declarations, Statements, Clauses, Expressions)
public void Do(string what)
{.
....var.so.=.true;.
.
#if.DEBUG.
....so.=.false;.
#endif.
.
....if.(so.==.what)
........DontDo();.
}.
robinsedlaczek
robinsedlaczek.wordpress.com
public void Do(string what)
{.
....var.so.=.true;.
.
#if.DEBUG.
....so.=.false;.
#endif.
.
....if.(so.==.what)
........DontDo();.
}.
Syntax Token
 SyntaxToken (Keyword, Identifier, Operator, Punctuation)
robinsedlaczek
robinsedlaczek.wordpress.com
public void Do(string what)
{.
....var.so.=.true;.
.
#if.DEBUG.
....so.=.false;.
#endif.
.
....if.(so.==.what)
........DontDo();.
}.
Syntax Token
 SyntaxToken (Keyword, Identifier, Operator, Punctuation)
robinsedlaczek
robinsedlaczek.wordpress.com
public void Do(string what)
{.
....var.so.=.true;.
.
#if.DEBUG.
....so.=.false;.
#endif.
.
....if.(so.==.what)
........DontDo();.
}.
Syntax Token
 SyntaxToken (Keyword, Identifier, Operator, Punctuation)
robinsedlaczek
robinsedlaczek.wordpress.com
public void Do(string what)
{.
....var.so.=.true;.
.
#if.DEBUG.
....so.=.false;.
#endif.
.
....if.(so.==.what)
........DontDo();.
}.
Syntax Token
 SyntaxToken (Keyword, Identifier, Operator, Punctuation)
robinsedlaczek
robinsedlaczek.wordpress.com
public void Do(string what)
{.
....var.so.=.true;.
.
#if.DEBUG.
....so.=.false;.
#endif.
.
....if.(so.==.what)
........DontDo();.
}.
Syntax Token
 SyntaxToken (Keyword, Identifier, Operator, Punctuation)
robinsedlaczek
robinsedlaczek.wordpress.com
Syntax Token
 SyntaxToken (Keyword, Identifier, Operator, Punctuation)
public void Do(string what)
{.
....var.so.=.true;.
.
#if.DEBUG.
....so.=.false;.
#endif.
.
....if.(so.==.what)
........DontDo();.
}.
robinsedlaczek
robinsedlaczek.wordpress.com
Syntax Token
 SyntaxToken (Keyword, Identifier, Operator, Punctuation)
public void Do(string what)
{.
....var.so.=.true;.
.
#if.DEBUG.
....so.=.false;.
#endif.
.
....if.(so.==.what)
........DontDo();.
}.
robinsedlaczek
robinsedlaczek.wordpress.com
public.void.Do(string.what).
{.
....var.so.=.true;.
.
#if.DEBUG.
....so.=.false;.
#endif.
.
....if.(so.==.what).
........DontDo();.
}.
Syntax Trivia
 SyntaxTrivia (Leerzeichen, Kommentare, Pre-processor Direktiven)
robinsedlaczek
robinsedlaczek.wordpress.com
Syntax Kinds
 Kind()-Erweiterungsmethode identifiziert exaktes Syntaxelement für
Node, Token und Trivia
 Enum: Microsoft.CodeAnalysis.CSharp.SyntaxKind (463 Werte)
 Enum: Microsoft.CodeAnalysis.VisualBasic.SyntaxKind (642 Werte)
public enum SyntaxKind : ushort
{
None,
List,
TildeToken = 8193,
ExclamationToken,
DollarToken,
PercentToken,
CaretToken,
AmpersandToken,
AsteriskToken,
OpenParenToken,
CloseParenToken,
…
}
robinsedlaczek
robinsedlaczek.wordpress.com
Syntax Types
 Syntaxtypen für alle Syntaxelemente (sprachspezifisch)
 Namespace: Microsoft.CodeAnalysis.CSharp.Syntax (214 Klassen)
 Namespace: Microsoft.CodeAnalysis.VisualBasic.Syntax (275 Klassen)
public.void.Do(string.what).
{.
....var.so.=.true;.
.
#if.DEBUG.
....so.=.false;.
#endif.
.
....if.(so.==.what).
........DontDo();.
}.
2
3
1
4
1 – MethodDeclarationSyntax
2 – ParameterListSyntax
3 – VariableDeclarationSyntax
4 – IfStatementSyntax
robinsedlaczek
robinsedlaczek.wordpress.com
Syntax Kinds vs. Syntax Types
 Was passt hier nicht?
463(C#)
642(VB)
TypesKinds vs.
214 (C#)
275 (VB)
 Syntax Types sind allgemeiner als Kinds
 Ein Typ für ähnliche Syntaxelemente
 By Design
robinsedlaczek
robinsedlaczek.wordpress.com
Syntax Kinds vs. Syntax Types
 1 : 1 - Beziehungen zwischen Types und Kinds
 Es gibt aber ein paar Ausnahmen!
 Beispiele…
robinsedlaczek
robinsedlaczek.wordpress.com
Syntax Kinds vs. Syntax Types
a = 1;
a *= 2;
a += 4;
1 | 1
true && true;
true || false;
Kind für jeden binären Operator (logisch,
arithmetisch, Bit-Verschiebung, Verbundzuweisung)
Ein Syntaxtype für binäre Ausdrücke.
Binärer Ausdruck
robinsedlaczek
robinsedlaczek.wordpress.com
Syntax Kinds vs. Syntax Types
myObject.MyMember
myObject->MyMember
dictionary!name
Member-Zugriff
(C#)
(VB)
Kind für einfachen Member-Zugriff, Zugriff über
Zeiger und Zugriff auf Dictionary in VB.
Ein Syntaxtype für Member-Zugriffe.
robinsedlaczek
robinsedlaczek.wordpress.com
Semantische Analyse
var tree = CSharpSyntaxTree.ParseText(sourceCode);
var compilation = CSharpCompilation
.Create("HelloWrold")
.AddReferences(MetadataReference.CreateFromAssembly(typeof(object).Assembly))
.AddSyntaxTrees(tree);
var model = compilation.GetSemanticModel(tree);
 Compilation ist abstrakt
 Semantische Analyse über Ableitungen
 Symboltabelle ist immutable
robinsedlaczek
robinsedlaczek.wordpress.com
05 | Code
Robin Sedlaczek | Chief Technical Officer at Fairmas GmbH
robinsedlaczek
robinsedlaczek.wordpress.com
#SpeakRoslyn
Robin Sedlaczek | Chief Technical Officer at Fairmas GmbH
robinsedlaczek
robinsedlaczek.wordpress.com
Vielen Dank für Eure
Aufmerksamkeit!

Weitere ähnliche Inhalte

Ähnlich wie #SpeakRoslyn - Die Microsoft .NET Compiler Plattform

Developer Week 2019: Identity & Access Management in der Realitaet
Developer Week 2019: Identity & Access Management in der RealitaetDeveloper Week 2019: Identity & Access Management in der Realitaet
Developer Week 2019: Identity & Access Management in der RealitaetRobin Sedlaczek
 
Dream-Team: Roslyn & Visual Studio Extensions
Dream-Team: Roslyn & Visual Studio ExtensionsDream-Team: Roslyn & Visual Studio Extensions
Dream-Team: Roslyn & Visual Studio ExtensionsRobin Sedlaczek
 
#ADC 2016 - C# Script in Action
#ADC 2016 - C# Script in Action#ADC 2016 - C# Script in Action
#ADC 2016 - C# Script in ActionRobin Sedlaczek
 
BASTA! Spring 2017 - Warum warten auf die IDE? Direct Coding in der eigenen A...
BASTA! Spring 2017 - Warum warten auf die IDE? Direct Coding in der eigenen A...BASTA! Spring 2017 - Warum warten auf die IDE? Direct Coding in der eigenen A...
BASTA! Spring 2017 - Warum warten auf die IDE? Direct Coding in der eigenen A...Robin Sedlaczek
 
Magdeburger Developer Days 2018 - Warum warten auf die IDE?
Magdeburger Developer Days 2018 - Warum warten auf die IDE?Magdeburger Developer Days 2018 - Warum warten auf die IDE?
Magdeburger Developer Days 2018 - Warum warten auf die IDE?Robin Sedlaczek
 
BASTA! Spring 2017 - C# Script in Action
BASTA! Spring 2017 - C# Script in ActionBASTA! Spring 2017 - C# Script in Action
BASTA! Spring 2017 - C# Script in ActionRobin Sedlaczek
 
BASTA! 2017 Jubiläumskonferenz - Warum warten auf die IDE!?
BASTA! 2017 Jubiläumskonferenz - Warum warten auf die IDE!?BASTA! 2017 Jubiläumskonferenz - Warum warten auf die IDE!?
BASTA! 2017 Jubiläumskonferenz - Warum warten auf die IDE!?Robin Sedlaczek
 
Java und Python - Das Beste aus beiden Welten nutzen
Java und Python - Das Beste aus beiden Welten nutzenJava und Python - Das Beste aus beiden Welten nutzen
Java und Python - Das Beste aus beiden Welten nutzenAndreas Schreiber
 
Von Automaten zu Programmen–Parsergeneratoren und Attributgrammatiken
Von Automaten zu Programmen–Parsergeneratoren und AttributgrammatikenVon Automaten zu Programmen–Parsergeneratoren und Attributgrammatiken
Von Automaten zu Programmen–Parsergeneratoren und AttributgrammatikenTim Furche
 
C Sharp Einfuehrung Teil 1
C Sharp Einfuehrung Teil 1C Sharp Einfuehrung Teil 1
C Sharp Einfuehrung Teil 1DraphonyGames
 
APIs mit Zend\Expressive erstellen
APIs mit Zend\Expressive erstellenAPIs mit Zend\Expressive erstellen
APIs mit Zend\Expressive erstellenRalf Eggert
 
Tech Talk: Groovy
Tech Talk: GroovyTech Talk: Groovy
Tech Talk: Groovymwie
 
A fool with a tool - Scraping Basics
A fool with a tool - Scraping BasicsA fool with a tool - Scraping Basics
A fool with a tool - Scraping BasicsMarkus Uhl
 
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET CoreHands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET CoreGregor Biswanger
 
Perl 5 Quiz Chemnitz Edition
Perl 5 Quiz Chemnitz EditionPerl 5 Quiz Chemnitz Edition
Perl 5 Quiz Chemnitz Editionlichtkind
 
Programmieren mit PROLOG
Programmieren mit PROLOGProgrammieren mit PROLOG
Programmieren mit PROLOGQAware GmbH
 
Quellcode Analyse
Quellcode AnalyseQuellcode Analyse
Quellcode AnalyseAmir Neziri
 

Ähnlich wie #SpeakRoslyn - Die Microsoft .NET Compiler Plattform (20)

Developer Week 2019: Identity & Access Management in der Realitaet
Developer Week 2019: Identity & Access Management in der RealitaetDeveloper Week 2019: Identity & Access Management in der Realitaet
Developer Week 2019: Identity & Access Management in der Realitaet
 
Dream-Team: Roslyn & Visual Studio Extensions
Dream-Team: Roslyn & Visual Studio ExtensionsDream-Team: Roslyn & Visual Studio Extensions
Dream-Team: Roslyn & Visual Studio Extensions
 
BIT I WiSe 2014 | Basisinformationstechnologie I - 08: Programmiersprachen I
BIT I WiSe 2014 | Basisinformationstechnologie I - 08: Programmiersprachen IBIT I WiSe 2014 | Basisinformationstechnologie I - 08: Programmiersprachen I
BIT I WiSe 2014 | Basisinformationstechnologie I - 08: Programmiersprachen I
 
#ADC 2016 - C# Script in Action
#ADC 2016 - C# Script in Action#ADC 2016 - C# Script in Action
#ADC 2016 - C# Script in Action
 
BASTA! Spring 2017 - Warum warten auf die IDE? Direct Coding in der eigenen A...
BASTA! Spring 2017 - Warum warten auf die IDE? Direct Coding in der eigenen A...BASTA! Spring 2017 - Warum warten auf die IDE? Direct Coding in der eigenen A...
BASTA! Spring 2017 - Warum warten auf die IDE? Direct Coding in der eigenen A...
 
Magdeburger Developer Days 2018 - Warum warten auf die IDE?
Magdeburger Developer Days 2018 - Warum warten auf die IDE?Magdeburger Developer Days 2018 - Warum warten auf die IDE?
Magdeburger Developer Days 2018 - Warum warten auf die IDE?
 
BASTA! Spring 2017 - C# Script in Action
BASTA! Spring 2017 - C# Script in ActionBASTA! Spring 2017 - C# Script in Action
BASTA! Spring 2017 - C# Script in Action
 
BASTA! 2017 Jubiläumskonferenz - Warum warten auf die IDE!?
BASTA! 2017 Jubiläumskonferenz - Warum warten auf die IDE!?BASTA! 2017 Jubiläumskonferenz - Warum warten auf die IDE!?
BASTA! 2017 Jubiläumskonferenz - Warum warten auf die IDE!?
 
Java und Python - Das Beste aus beiden Welten nutzen
Java und Python - Das Beste aus beiden Welten nutzenJava und Python - Das Beste aus beiden Welten nutzen
Java und Python - Das Beste aus beiden Welten nutzen
 
Von Automaten zu Programmen–Parsergeneratoren und Attributgrammatiken
Von Automaten zu Programmen–Parsergeneratoren und AttributgrammatikenVon Automaten zu Programmen–Parsergeneratoren und Attributgrammatiken
Von Automaten zu Programmen–Parsergeneratoren und Attributgrammatiken
 
Workshop: Besseres C#
Workshop: Besseres C#Workshop: Besseres C#
Workshop: Besseres C#
 
C Sharp Einfuehrung Teil 1
C Sharp Einfuehrung Teil 1C Sharp Einfuehrung Teil 1
C Sharp Einfuehrung Teil 1
 
APIs mit Zend\Expressive erstellen
APIs mit Zend\Expressive erstellenAPIs mit Zend\Expressive erstellen
APIs mit Zend\Expressive erstellen
 
Tech Talk: Groovy
Tech Talk: GroovyTech Talk: Groovy
Tech Talk: Groovy
 
A fool with a tool - Scraping Basics
A fool with a tool - Scraping BasicsA fool with a tool - Scraping Basics
A fool with a tool - Scraping Basics
 
Ruby on Rails SS09 04
Ruby on Rails SS09 04Ruby on Rails SS09 04
Ruby on Rails SS09 04
 
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET CoreHands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
 
Perl 5 Quiz Chemnitz Edition
Perl 5 Quiz Chemnitz EditionPerl 5 Quiz Chemnitz Edition
Perl 5 Quiz Chemnitz Edition
 
Programmieren mit PROLOG
Programmieren mit PROLOGProgrammieren mit PROLOG
Programmieren mit PROLOG
 
Quellcode Analyse
Quellcode AnalyseQuellcode Analyse
Quellcode Analyse
 

Mehr von Robin Sedlaczek

Developer Week 2019: .NET, .NET Core und .NET Standard - Ein Richtungskompass
Developer Week 2019: .NET, .NET Core und .NET Standard - Ein RichtungskompassDeveloper Week 2019: .NET, .NET Core und .NET Standard - Ein Richtungskompass
Developer Week 2019: .NET, .NET Core und .NET Standard - Ein RichtungskompassRobin Sedlaczek
 
Developer Week 2019: Architekturen für .NET Core-Anwendungen
Developer Week 2019: Architekturen für .NET Core-AnwendungenDeveloper Week 2019: Architekturen für .NET Core-Anwendungen
Developer Week 2019: Architekturen für .NET Core-AnwendungenRobin Sedlaczek
 
.NET Core Architecture (UI)
.NET Core Architecture (UI).NET Core Architecture (UI)
.NET Core Architecture (UI)Robin Sedlaczek
 
Architekturen für .NET Core-Anwendungen
Architekturen für .NET Core-AnwendungenArchitekturen für .NET Core-Anwendungen
Architekturen für .NET Core-AnwendungenRobin Sedlaczek
 
Azure Hybrid Connections
Azure Hybrid ConnectionsAzure Hybrid Connections
Azure Hybrid ConnectionsRobin Sedlaczek
 
Architectures for .Net Core Applications
Architectures for .Net Core ApplicationsArchitectures for .Net Core Applications
Architectures for .Net Core ApplicationsRobin Sedlaczek
 
Magdeburger Developer Days 2018 - Das perfekte Anwendungsmodell
Magdeburger Developer Days 2018 - Das perfekte AnwendungsmodellMagdeburger Developer Days 2018 - Das perfekte Anwendungsmodell
Magdeburger Developer Days 2018 - Das perfekte AnwendungsmodellRobin Sedlaczek
 
Alleskönner: Azure Cosmos DB - Was kann der neue Datenbank-Service von Micros...
Alleskönner: Azure Cosmos DB - Was kann der neue Datenbank-Service von Micros...Alleskönner: Azure Cosmos DB - Was kann der neue Datenbank-Service von Micros...
Alleskönner: Azure Cosmos DB - Was kann der neue Datenbank-Service von Micros...Robin Sedlaczek
 
BASTA! Spring 2018 - Architekturen für .NET Core-Anwendungen
BASTA! Spring 2018 - Architekturen für .NET Core-AnwendungenBASTA! Spring 2018 - Architekturen für .NET Core-Anwendungen
BASTA! Spring 2018 - Architekturen für .NET Core-AnwendungenRobin Sedlaczek
 
GUI & DESIGN 2017 - Das perfekte Anwendungsmodell. UIs für jedes Device!
GUI & DESIGN 2017 - Das perfekte Anwendungsmodell. UIs für jedes Device!GUI & DESIGN 2017 - Das perfekte Anwendungsmodell. UIs für jedes Device!
GUI & DESIGN 2017 - Das perfekte Anwendungsmodell. UIs für jedes Device!Robin Sedlaczek
 
DevOpenSpace 2017 - .NET, .NET Core & .NET Standard - Und ich mal wieder mitt...
DevOpenSpace 2017 - .NET, .NET Core & .NET Standard - Und ich mal wieder mitt...DevOpenSpace 2017 - .NET, .NET Core & .NET Standard - Und ich mal wieder mitt...
DevOpenSpace 2017 - .NET, .NET Core & .NET Standard - Und ich mal wieder mitt...Robin Sedlaczek
 
BASTA! 2017 Jubiläumskonferenz - CUIs & The Microsoft Bot Framework
BASTA! 2017 Jubiläumskonferenz - CUIs & The Microsoft Bot FrameworkBASTA! 2017 Jubiläumskonferenz - CUIs & The Microsoft Bot Framework
BASTA! 2017 Jubiläumskonferenz - CUIs & The Microsoft Bot FrameworkRobin Sedlaczek
 
DNUGBB 2017 - .Net, .Net Core, .Net Standard
DNUGBB 2017 - .Net, .Net Core, .Net StandardDNUGBB 2017 - .Net, .Net Core, .Net Standard
DNUGBB 2017 - .Net, .Net Core, .Net StandardRobin Sedlaczek
 
.NET Summit 2017 - .NET, .NET Core, .NET Standard
.NET Summit 2017 - .NET, .NET Core, .NET Standard.NET Summit 2017 - .NET, .NET Core, .NET Standard
.NET Summit 2017 - .NET, .NET Core, .NET StandardRobin Sedlaczek
 
#DNUG Berlin-Brandenburg - Conversational User Interfaces (CUIs) und das Micr...
#DNUG Berlin-Brandenburg - Conversational User Interfaces (CUIs) und das Micr...#DNUG Berlin-Brandenburg - Conversational User Interfaces (CUIs) und das Micr...
#DNUG Berlin-Brandenburg - Conversational User Interfaces (CUIs) und das Micr...Robin Sedlaczek
 
#ADC 2016 - Conversational User Interfaces
#ADC 2016 - Conversational User Interfaces#ADC 2016 - Conversational User Interfaces
#ADC 2016 - Conversational User InterfacesRobin Sedlaczek
 
Code Reviews - Best Practices
Code Reviews - Best PracticesCode Reviews - Best Practices
Code Reviews - Best PracticesRobin Sedlaczek
 

Mehr von Robin Sedlaczek (17)

Developer Week 2019: .NET, .NET Core und .NET Standard - Ein Richtungskompass
Developer Week 2019: .NET, .NET Core und .NET Standard - Ein RichtungskompassDeveloper Week 2019: .NET, .NET Core und .NET Standard - Ein Richtungskompass
Developer Week 2019: .NET, .NET Core und .NET Standard - Ein Richtungskompass
 
Developer Week 2019: Architekturen für .NET Core-Anwendungen
Developer Week 2019: Architekturen für .NET Core-AnwendungenDeveloper Week 2019: Architekturen für .NET Core-Anwendungen
Developer Week 2019: Architekturen für .NET Core-Anwendungen
 
.NET Core Architecture (UI)
.NET Core Architecture (UI).NET Core Architecture (UI)
.NET Core Architecture (UI)
 
Architekturen für .NET Core-Anwendungen
Architekturen für .NET Core-AnwendungenArchitekturen für .NET Core-Anwendungen
Architekturen für .NET Core-Anwendungen
 
Azure Hybrid Connections
Azure Hybrid ConnectionsAzure Hybrid Connections
Azure Hybrid Connections
 
Architectures for .Net Core Applications
Architectures for .Net Core ApplicationsArchitectures for .Net Core Applications
Architectures for .Net Core Applications
 
Magdeburger Developer Days 2018 - Das perfekte Anwendungsmodell
Magdeburger Developer Days 2018 - Das perfekte AnwendungsmodellMagdeburger Developer Days 2018 - Das perfekte Anwendungsmodell
Magdeburger Developer Days 2018 - Das perfekte Anwendungsmodell
 
Alleskönner: Azure Cosmos DB - Was kann der neue Datenbank-Service von Micros...
Alleskönner: Azure Cosmos DB - Was kann der neue Datenbank-Service von Micros...Alleskönner: Azure Cosmos DB - Was kann der neue Datenbank-Service von Micros...
Alleskönner: Azure Cosmos DB - Was kann der neue Datenbank-Service von Micros...
 
BASTA! Spring 2018 - Architekturen für .NET Core-Anwendungen
BASTA! Spring 2018 - Architekturen für .NET Core-AnwendungenBASTA! Spring 2018 - Architekturen für .NET Core-Anwendungen
BASTA! Spring 2018 - Architekturen für .NET Core-Anwendungen
 
GUI & DESIGN 2017 - Das perfekte Anwendungsmodell. UIs für jedes Device!
GUI & DESIGN 2017 - Das perfekte Anwendungsmodell. UIs für jedes Device!GUI & DESIGN 2017 - Das perfekte Anwendungsmodell. UIs für jedes Device!
GUI & DESIGN 2017 - Das perfekte Anwendungsmodell. UIs für jedes Device!
 
DevOpenSpace 2017 - .NET, .NET Core & .NET Standard - Und ich mal wieder mitt...
DevOpenSpace 2017 - .NET, .NET Core & .NET Standard - Und ich mal wieder mitt...DevOpenSpace 2017 - .NET, .NET Core & .NET Standard - Und ich mal wieder mitt...
DevOpenSpace 2017 - .NET, .NET Core & .NET Standard - Und ich mal wieder mitt...
 
BASTA! 2017 Jubiläumskonferenz - CUIs & The Microsoft Bot Framework
BASTA! 2017 Jubiläumskonferenz - CUIs & The Microsoft Bot FrameworkBASTA! 2017 Jubiläumskonferenz - CUIs & The Microsoft Bot Framework
BASTA! 2017 Jubiläumskonferenz - CUIs & The Microsoft Bot Framework
 
DNUGBB 2017 - .Net, .Net Core, .Net Standard
DNUGBB 2017 - .Net, .Net Core, .Net StandardDNUGBB 2017 - .Net, .Net Core, .Net Standard
DNUGBB 2017 - .Net, .Net Core, .Net Standard
 
.NET Summit 2017 - .NET, .NET Core, .NET Standard
.NET Summit 2017 - .NET, .NET Core, .NET Standard.NET Summit 2017 - .NET, .NET Core, .NET Standard
.NET Summit 2017 - .NET, .NET Core, .NET Standard
 
#DNUG Berlin-Brandenburg - Conversational User Interfaces (CUIs) und das Micr...
#DNUG Berlin-Brandenburg - Conversational User Interfaces (CUIs) und das Micr...#DNUG Berlin-Brandenburg - Conversational User Interfaces (CUIs) und das Micr...
#DNUG Berlin-Brandenburg - Conversational User Interfaces (CUIs) und das Micr...
 
#ADC 2016 - Conversational User Interfaces
#ADC 2016 - Conversational User Interfaces#ADC 2016 - Conversational User Interfaces
#ADC 2016 - Conversational User Interfaces
 
Code Reviews - Best Practices
Code Reviews - Best PracticesCode Reviews - Best Practices
Code Reviews - Best Practices
 

#SpeakRoslyn - Die Microsoft .NET Compiler Plattform

  • 1. Robin Sedlaczek | Chief Technical Officer at Fairmas GmbH robinsedlaczek robinsedlaczek.wordpress.com
  • 2. Über mich  CTO der Fairmas GmbH in Berlin Zuständig für den gesamten Entwicklungsbereich Softwarearchitektur Implementierung von Entwicklungsprozessen Prozessautomatisierung Technologieberatung  Moderator in der MSDN  Freier Autor für Windows Developer, Heise…  Sprecher in User Groups  Beteiligung im Open Source Projekt „SharpGL“  .NET Code Geek robinsedlaczek robinsedlaczek.wordpress.com Robin Sedlaczek robinsedlaczek@live.de TheBerlinMicrosoftConnection
  • 3.  #SpeakRoslyn bald in der MVA!  Microsoft Virtual Academy Kostenlose Online-Trainings für Entwickler und IT Professionals Mehr als 2.3 Millionen registrierte Nutzer Regelmäßig neue Trainings zu aktuellen Microsoft Produkten und Technologien Live- und on-demand-Kurse Join the MVA Community! robinsedlaczek robinsedlaczek.wordpress.com
  • 4. #SpeakRoslyn – Mach mit!  Kommentaren, Feedback, Kritiken  Foto #SpeakRoslyn Über Tweets mit… würde ich mich sehr freuen! robinsedlaczek robinsedlaczek.wordpress.com
  • 5. 01 | Überblick Robin Sedlaczek | Chief Technical Officer at Fairmas GmbH robinsedlaczek robinsedlaczek.wordpress.com
  • 6. Die Compiler-Blackbox  Compiler sind klassisch gesehen Blackboxes  Geschlossene Softwarekomponenten  Übersetzen Quellcode in etwas Ausführbares (Binärdateien) Compiler /// <summary> /// This is the base class for all /// shaders (vertex and fragment). It /// offers functionality which is core /// to all shaders, such as file /// loading and binding. /// </summary> public class Shader { public void Create(OpenGL gl, uint shaderType, string source) { // Create the OpenGL shader object. shaderObject = gl.CreateShader(shaderType); // Set the shader source. gl.ShaderSource(shaderObject, source); // Compile the shader object. gl.CompileShader(shaderObject); // Now that we've compiled the shader, check // it's compilation status. If it's not // compiled properly, we're going to throw // an exception. if (GetCompileStatus(gl) == false) { throw new ShaderCompilationException( string.Format( "Failed to compile shader {0}.", shaderObject), GetInfoLog(gl)); } } Code File 1 1 0 0 1 0 1 1 1 1 0 1 0 1 1 1 0 1 1 1 1 0 0 1 1 0 1 0 1 1 1 0 0 1 0 1 1 0 1 1 1 0 1 1 1 0 1 0 0 0 1 1 0 1 0 1 0 1 1 1 1 0 0 1 1 0 1 0 1 1 1 0 0 1 0 1 1 0 1 1 0 1 1 0 1 0 1 Binary File robinsedlaczek robinsedlaczek.wordpress.com
  • 7. Das Problem mit der Blackbox  tiefes Verständnis des Codes während Übersetzung  Wissen, dass von IDEs und Werkzeugen genutzt werden könnte  Problem: Wissen steht nach Kompilierung nicht mehr zur Verfügung  Devs/Toolhersteller müssen ggf. Code selbst analysieren Compiler robinsedlaczek robinsedlaczek.wordpress.com
  • 8. Lösung des Problems  Aufbrechen der Blackbox  Bereitstellung einer API-Schicht über dem Compiler  Bereitstellung der Compiler-Ergebnisse über Objektmodelle Phase 1 Phase 2 Phase 3 Phase 4 Blackbox wird zur Plattform: .NET Compiler Platform robinsedlaczek robinsedlaczek.wordpress.com
  • 9. Vorteile/Nutzen  Zugriff auf Compiler-Wissen zu jeder Zeit  Code-bezogenen Aufgaben in eigenen Anwendungen  Codetransformation und Codegenerierung  Interaktive Szenarien (z.B. VS Immediate Window)  Einbettung C#/VB in DSLs  Metaprogrammierung robinsedlaczek robinsedlaczek.wordpress.com
  • 10. Open Source  Roslyn ist Open Source! https://github.com/dotnet/roslyn  Verwaltet von der .NET Foundation http://www.dotnetfoundation.org/projects  Erlaubt Einblicke und Debugging des Codes  Mitwirkung bei Entwicklung durch Community  Repository kann geforkt werden robinsedlaczek robinsedlaczek.wordpress.com
  • 11. Visual Studio  Auf Roslyn basierte C#/VB-Sprachfeatures und IDE-Features ab Visual Studio 2015 enthalten  Projektvorlagen: SDK Templates VSIX package  Bibliotheken: NuGet Roslyn compiler package  Syntax Visualizer: Syntax Visualizer VSIX package robinsedlaczek robinsedlaczek.wordpress.com
  • 12. 02 | Grundlagen Robin Sedlaczek | Chief Technical Officer at Fairmas GmbH robinsedlaczek robinsedlaczek.wordpress.com
  • 13. Was tut ein Compiler?  Übersetzt z.B. VB.NET, C# nach IL Code, C# nach Maschinencode (.NET Native), C/C++ in Maschinencode... Compiler /// <summary> /// This is the base class for all /// shaders (vertex and fragment). It /// offers functionality which is core /// to all shaders, such as file /// loading and binding. /// </summary> public class Shader { public void Create(OpenGL gl, uint shaderType, string source) { // Create the OpenGL shader object. shaderObject = gl.CreateShader(shaderType); // Set the shader source. gl.ShaderSource(shaderObject, source); // Compile the shader object. gl.CompileShader(shaderObject); // Now that we've compiled the shader, check // it's compilation status. If it's not // compiled properly, we're going to throw // an exception. if (GetCompileStatus(gl) == false) { throw new ShaderCompilationException( string.Format( "Failed to compile shader {0}.", shaderObject), GetInfoLog(gl)); } } Code File 1 1 0 0 1 0 1 1 1 1 0 1 0 1 1 1 0 1 1 1 1 0 0 1 1 0 1 0 1 1 1 0 0 1 0 1 1 0 1 1 1 0 1 1 1 0 1 0 0 0 1 1 0 1 0 1 0 1 1 1 1 0 0 1 1 0 1 0 1 1 1 0 0 1 0 1 1 0 1 1 0 1 1 0 1 0 1 Binary File  Allgemein: übersetzt Programm aus formaler Quellsprache in semantisch äquivalente formale Zielsprache robinsedlaczek robinsedlaczek.wordpress.com
  • 14. Fragen  Aber wie genau macht der Compiler das?  Wie kann der Compiler eine einfache Textdatei inhaltlich verstehen?  Wie verwandelt er den Text in ausführbare Bits und Bytes? robinsedlaczek robinsedlaczek.wordpress.com
  • 15. Aufbau eines Compilers Vorweg, ein kleiner Exkurs… Aufbau der Blackbox… robinsedlaczek robinsedlaczek.wordpress.com
  • 16. Natürliche vs. Formale Sprachen  Natürliche Sprachen leben  Akzente/Dialekte  Grammatik/Regeln werden nicht strikt befolgt  Mensch ist sehr fehlertolerant  Mehrdeutigkeit  Sehr komplex, Semantik kann nicht beschrieben werden robinsedlaczek robinsedlaczek.wordpress.com
  • 17. Was sind formale Sprachen?  Mathematische Beschreibung einer Sprache  Alphabet + Wortbildungsregeln  Werden durch Zustandsautomaten erkannt  Klassifiziert in Chomsky-Hierarchie „Menge von Wörtern, die über einem bestimmten Alphabet und nach definierten Regeln gebildet werden können.“ robinsedlaczek robinsedlaczek.wordpress.com
  • 18. Definition formale Sprache  Mathematische Beschreibung = formale Grammatik V = nicht-terminale Zeichen Σ = terminale Zeichen (Alphabet) R = Produktionen (Regeln) S = Startsymbol (aus V) robinsedlaczek robinsedlaczek.wordpress.com
  • 19. Beispiel formale Sprache Die Sprache beinhaltet Bedingungsanweisungen. Diese können verschachtelt sein. Bedingungsanweisungen können etwas auf wahr oder falsch testen. V = { expr, condition, left, right } Σ = { id, if, (, ), {, }, true, false, == } R = { expr  if (condition) { expr }, condition  left == right, left  id, left  true, left  false, right  id, right  true, right  false } S = expr robinsedlaczek robinsedlaczek.wordpress.com
  • 20. V = { expr, condition, left, right } Σ = { id, if, (, ), {, }, true, false, == } R = { expr  if (condition) { expr }, condition  left == right, left  id, left  true, left  false, right  id, right  true, right  false } S = expr Beispiel formale Sprache Ist der folgende Ausdruck Teil der Sprache? if (id == true) { if (false == id) { } } Start: expr (1)  if (condition) { expr } (1)  if (condition) { if (condition) { } } (2)  if (left == right) { if (condition) { } } (2)  if (left == right) { if (left == right) { } } (3)  if (id == right) { if (left == right) { } } (7)  if (id == true) { if (left == right) { } } (5)  if (id == true) { if (false == right) { } } (6)  if (id == true) { if (false == id) { } } (1) (2) (3) (4) (5) (6) (7) (8) Ausdruck ist Teil der Sprache! robinsedlaczek robinsedlaczek.wordpress.com
  • 21.  Formales Beschreiben von Textstrukturen (Grammatik)  Programmiersprachen  Textstrukturen können mit Algorithmus erkannt werden (Parsen)  Einlesen, Syntaxüberprüfung Beispiel formale Sprache Was bedeutet das für einen Compiler? robinsedlaczek robinsedlaczek.wordpress.com
  • 22. Beispiel formale Sprache expr conditionif ( AST (Abstract Syntax Tree) ) { }expr Start: expr  if (condition) { expr }  if (condition) { if (condition) { } }  if (left == right) { if (condition) { } }  if (left == right) { if (left == right) { } }  if (id == right) { if (left == right) { } }  if (id == true) { if (left == right) { } }  if (id == true) { if (false == right) { } }  if (id == true) { if (false == id) { } } conditionif ( ) { } left == right left == right id true false id nicht-terminal terminal robinsedlaczek robinsedlaczek.wordpress.com
  • 23.  Textstrukturen (Syntax) als Baumstruktur darstellbar  Analyse und Auswertung des Baums  Syntaxanalyse  Tiefes Verständnis der Textstruktur Beispiel formale Sprache Was bedeutet das für einen Compiler? robinsedlaczek robinsedlaczek.wordpress.com
  • 24. Aufbau eines Compilers Zerlegen des Quelltextes in Tokens Parsen der Tokens in die Syntax, die von der Grammatik vorgegeben ist (AST) Tokenizer/ Lexer Parser Lexikalische Analyse Syntaktische Analyse robinsedlaczek robinsedlaczek.wordpress.com
  • 25.  Aufbau des Codes  Strukturen, Klassen, Aufzählungen  Methoden, Eigenschaften, Variablen  Bedingungen, Schleifen  … Syntaxanalyse Was weiß der Compiler? robinsedlaczek robinsedlaczek.wordpress.com
  • 26. Syntaxanalyse Was weiß der Compiler bisher nicht? public virtual void Initialize(int count) { particles.Clear(); for (int i = 0; i < count; i++) { Particle particle = new BasicParticle(); particle.Intialize(rand); particles.Add(particle); } } Von welchem Typ sind die Parameter? Welche Member dürfen aufgerufen werden? Welche Variablen sind hier gültig? Semantik! robinsedlaczek robinsedlaczek.wordpress.com
  • 27. Symboltabelle  Deklarationen analysieren Symbole /// <summary> /// This is the base class for all /// shaders (vertex and fragment). It /// offers functionality which is core /// to all shaders, such as file /// loading and binding. /// </summary> public class Shader { public void Create(OpenGL gl, uint shaderType, string source) { // Create the OpenGL shader object. shaderObject = gl.CreateShader(shaderType); // Set the shader source. gl.ShaderSource(shaderObject, source); // Compile the shader object. gl.CompileShader(shaderObject); // Now that we've compiled the shader, check // it's compilation status. If it's not // compiled properly, we're going to throw // an exception. if (GetCompileStatus(gl) == false) { throw new ShaderCompilationException( string.Format( "Failed to compile shader {0}.", shaderObject), GetInfoLog(gl)); } } Code File Assemblies  Benannte Symbole bilden  Symboltabelle aufbauen  Typen und Typsignaturen bekannt machen Referenz robinsedlaczek robinsedlaczek.wordpress.com
  • 28. Binder Symboltabelle /// <summary> /// This is the base class for all /// shaders (vertex and fragment). It /// offers functionality which is core /// to all shaders, such as file /// loading and binding. /// </summary> public class Shader { public void Create(OpenGL gl, uint shaderType, string source) { // Create the OpenGL shader object. shaderObject = gl.CreateShader(shaderType); // Set the shader source. gl.ShaderSource(shaderObject, source); // Compile the shader object. gl.CompileShader(shaderObject); // Now that we've compiled the shader, check // it's compilation status. If it's not // compiled properly, we're going to throw // an exception. if (GetCompileStatus(gl) == false) { throw new ShaderCompilationException( string.Format( "Failed to compile shader {0}.", shaderObject), GetInfoLog(gl)); } } Code File var my = new MyType(); public void DoSomething(MyType my) { … } public event EventHandler MyEvent;  Identifier im Code zu Symbolen zuordnen  Bedeutung des Codes  Semantische Analyse robinsedlaczek robinsedlaczek.wordpress.com
  • 29. Aufbau eines Compilers Zerlegen des Quelltextes in Tokens Parsen der Tokens in die Syntax, die von der Grammatik vorgegeben ist (AST) Typdeklarationen aus Code und Metadaten zu benannten Symbolen (Symboltabelle) Identifier in Code abstimmen/verbinden mit benannten Symbolen Tokenizer/ Lexer Parser Symbols Binder Lexikalische Analyse Syntaktische Analyse Semantische Analyse robinsedlaczek robinsedlaczek.wordpress.com
  • 30. Aufbau eines Compilers Zerlegen des Quelltextes in Tokens Parsen der Tokens in die Syntax, die von der Grammatik vorgegeben ist (AST) Typdeklarationen aus Code und Metadaten zu benannten Symbolen (Symboltabelle) Identifier in Code abstimmen/verbinden mit benannten Symbolen Plattformunabhängige Optimierungen Plattformabhängige Optimierungen All gesammelten Informationen werden in Binary/Assembly ausgegeben Tokenizer/ Lexer Parser Symbols Binder CodeGen Preprocessor Code Generator CodeGen Postprocessor Lexikalische Analyse Syntaktische Analyse Semantische Analyse Synthese- Phase robinsedlaczek robinsedlaczek.wordpress.com
  • 31. 03 | APIs Robin Sedlaczek | Chief Technical Officer at Fairmas GmbH
  • 32. APIs  Compiler APIs  Workspace APIs robinsedlaczek robinsedlaczek.wordpress.com
  • 33. APIs – Compiler Services robinsedlaczek robinsedlaczek.wordpress.com
  • 34. APIs – Compiler Services  Compiler API - Sprachspezifische Objektmodelle für alle Phasen der Kompilierung - Unveränderlicher Snapshot eines Compiler-Aufrufes - Keine Abhängigkeiten zu Visual Studio  Diagnostics API - Erweiterbare API (Analyzers) - Hängt sich direkt in Analysephase - Fehler, Warnungen, Informationen robinsedlaczek robinsedlaczek.wordpress.com
  • 35. APIs - Workspaces robinsedlaczek robinsedlaczek.wordpress.com
  • 36. APIs – Workspaces robinsedlaczek robinsedlaczek.wordpress.com
  • 37. APIs – Workspaces  Objektmodell zur Darstellung einer Solution  Einstiegspunkt für Solution-weite Analysen und Refactorings  Zugriff auf Compiler Services robinsedlaczek robinsedlaczek.wordpress.com
  • 38. APIs - Namespaces  Microsoft.CodeAnalysis.dll  Microsoft.CodeAnalysis.Workspaces.dll  Microsoft.CodeAnalysis.CSharp.dll  Microsoft.CodeAnalysis.CSharp.Workspaces.dll  Microsoft.CodeAnalysis.VisualBasic.dll  Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll robinsedlaczek robinsedlaczek.wordpress.com
  • 39. 04 | Syntax- und Symbolanalyse Robin Sedlaczek | Chief Technical Officer at Fairmas GmbH robinsedlaczek robinsedlaczek.wordpress.com
  • 40. Syntaxanalyse var tree = CSharpSyntaxTree.ParseText(sourceCode); var node = tree.GetRoot();  SyntaxTree ist abstrakt  Parsing über sprachspezifische Ableitung  SyntaxTree ist immutable robinsedlaczek robinsedlaczek.wordpress.com
  • 43. public void Do(string what) {. ....var.so.=.true;. . #if.DEBUG. ....so.=.false;. #endif. . ....if.(so.==.what). ........DontDo();. }. Syntax Node  SyntaxNode (Declarations, Statements, Clauses, Expressions) robinsedlaczek robinsedlaczek.wordpress.com
  • 44. public void Do(string what) {. ....var.so.=.true;. . #if.DEBUG. ....so.=.false;. #endif. . ....if.(so.==.what)). ........DontDo();. }. Syntax Node  SyntaxNode (Declarations, Statements, Clauses, Expressions) robinsedlaczek robinsedlaczek.wordpress.com
  • 45. public void Do(string what) {. ....var.so.=.true;. . #if.DEBUG. ....so.=.false;. #endif. . ....if.(so.==.what)). ........DontDo();. }. Syntax Node  SyntaxNode (Declarations, Statements, Clauses, Expressions) robinsedlaczek robinsedlaczek.wordpress.com
  • 46. public void Do(string what) {. ....var.so.=.true;. . #if.DEBUG. ....so.=.false;. #endif. . ....if.(so.==.what) ........DontDo();. }. Syntax Node  SyntaxNode (Declarations, Statements, Clauses, Expressions) robinsedlaczek robinsedlaczek.wordpress.com
  • 47. Syntax Node  SyntaxNode (Declarations, Statements, Clauses, Expressions) public void Do(string what) {. ....var.so.=.true;. . #if.DEBUG. ....so.=.false;. #endif. . ....if.(so.==.what) ........DontDo();. }. robinsedlaczek robinsedlaczek.wordpress.com
  • 48. public void Do(string what) {. ....var.so.=.true;. . #if.DEBUG. ....so.=.false;. #endif. . ....if.(so.==.what) ........DontDo();. }. Syntax Token  SyntaxToken (Keyword, Identifier, Operator, Punctuation) robinsedlaczek robinsedlaczek.wordpress.com
  • 49. public void Do(string what) {. ....var.so.=.true;. . #if.DEBUG. ....so.=.false;. #endif. . ....if.(so.==.what) ........DontDo();. }. Syntax Token  SyntaxToken (Keyword, Identifier, Operator, Punctuation) robinsedlaczek robinsedlaczek.wordpress.com
  • 50. public void Do(string what) {. ....var.so.=.true;. . #if.DEBUG. ....so.=.false;. #endif. . ....if.(so.==.what) ........DontDo();. }. Syntax Token  SyntaxToken (Keyword, Identifier, Operator, Punctuation) robinsedlaczek robinsedlaczek.wordpress.com
  • 51. public void Do(string what) {. ....var.so.=.true;. . #if.DEBUG. ....so.=.false;. #endif. . ....if.(so.==.what) ........DontDo();. }. Syntax Token  SyntaxToken (Keyword, Identifier, Operator, Punctuation) robinsedlaczek robinsedlaczek.wordpress.com
  • 52. public void Do(string what) {. ....var.so.=.true;. . #if.DEBUG. ....so.=.false;. #endif. . ....if.(so.==.what) ........DontDo();. }. Syntax Token  SyntaxToken (Keyword, Identifier, Operator, Punctuation) robinsedlaczek robinsedlaczek.wordpress.com
  • 53. Syntax Token  SyntaxToken (Keyword, Identifier, Operator, Punctuation) public void Do(string what) {. ....var.so.=.true;. . #if.DEBUG. ....so.=.false;. #endif. . ....if.(so.==.what) ........DontDo();. }. robinsedlaczek robinsedlaczek.wordpress.com
  • 54. Syntax Token  SyntaxToken (Keyword, Identifier, Operator, Punctuation) public void Do(string what) {. ....var.so.=.true;. . #if.DEBUG. ....so.=.false;. #endif. . ....if.(so.==.what) ........DontDo();. }. robinsedlaczek robinsedlaczek.wordpress.com
  • 56. Syntax Kinds  Kind()-Erweiterungsmethode identifiziert exaktes Syntaxelement für Node, Token und Trivia  Enum: Microsoft.CodeAnalysis.CSharp.SyntaxKind (463 Werte)  Enum: Microsoft.CodeAnalysis.VisualBasic.SyntaxKind (642 Werte) public enum SyntaxKind : ushort { None, List, TildeToken = 8193, ExclamationToken, DollarToken, PercentToken, CaretToken, AmpersandToken, AsteriskToken, OpenParenToken, CloseParenToken, … } robinsedlaczek robinsedlaczek.wordpress.com
  • 57. Syntax Types  Syntaxtypen für alle Syntaxelemente (sprachspezifisch)  Namespace: Microsoft.CodeAnalysis.CSharp.Syntax (214 Klassen)  Namespace: Microsoft.CodeAnalysis.VisualBasic.Syntax (275 Klassen) public.void.Do(string.what). {. ....var.so.=.true;. . #if.DEBUG. ....so.=.false;. #endif. . ....if.(so.==.what). ........DontDo();. }. 2 3 1 4 1 – MethodDeclarationSyntax 2 – ParameterListSyntax 3 – VariableDeclarationSyntax 4 – IfStatementSyntax robinsedlaczek robinsedlaczek.wordpress.com
  • 58. Syntax Kinds vs. Syntax Types  Was passt hier nicht? 463(C#) 642(VB) TypesKinds vs. 214 (C#) 275 (VB)  Syntax Types sind allgemeiner als Kinds  Ein Typ für ähnliche Syntaxelemente  By Design robinsedlaczek robinsedlaczek.wordpress.com
  • 59. Syntax Kinds vs. Syntax Types  1 : 1 - Beziehungen zwischen Types und Kinds  Es gibt aber ein paar Ausnahmen!  Beispiele… robinsedlaczek robinsedlaczek.wordpress.com
  • 60. Syntax Kinds vs. Syntax Types a = 1; a *= 2; a += 4; 1 | 1 true && true; true || false; Kind für jeden binären Operator (logisch, arithmetisch, Bit-Verschiebung, Verbundzuweisung) Ein Syntaxtype für binäre Ausdrücke. Binärer Ausdruck robinsedlaczek robinsedlaczek.wordpress.com
  • 61. Syntax Kinds vs. Syntax Types myObject.MyMember myObject->MyMember dictionary!name Member-Zugriff (C#) (VB) Kind für einfachen Member-Zugriff, Zugriff über Zeiger und Zugriff auf Dictionary in VB. Ein Syntaxtype für Member-Zugriffe. robinsedlaczek robinsedlaczek.wordpress.com
  • 62. Semantische Analyse var tree = CSharpSyntaxTree.ParseText(sourceCode); var compilation = CSharpCompilation .Create("HelloWrold") .AddReferences(MetadataReference.CreateFromAssembly(typeof(object).Assembly)) .AddSyntaxTrees(tree); var model = compilation.GetSemanticModel(tree);  Compilation ist abstrakt  Semantische Analyse über Ableitungen  Symboltabelle ist immutable robinsedlaczek robinsedlaczek.wordpress.com
  • 63. 05 | Code Robin Sedlaczek | Chief Technical Officer at Fairmas GmbH robinsedlaczek robinsedlaczek.wordpress.com
  • 64. #SpeakRoslyn Robin Sedlaczek | Chief Technical Officer at Fairmas GmbH robinsedlaczek robinsedlaczek.wordpress.com Vielen Dank für Eure Aufmerksamkeit!

Hinweis der Redaktion

  1. 1
  2. 5
  3. 12
  4. Chomsky-Hierachie => Einteilung einer Sprache nach: Ausdrucksstärke der Grammatik Komplexität des Spracherkennenden Automaten
  5. 31
  6. 39
  7. 63
  8. 64