Robin Sedlaczek | Chief Technical Officer at Fairmas GmbH robinsedlaczek robinsedlaczek.wordpress.com.

Slides:



Advertisements
Ähnliche Präsentationen
C Sharp (C#) Martin Saternus Senior Student Partner
Advertisements

Vorlesung Compilertechnik Sommersemester 2008
10. Grundlagen imperativer Programmiersprachen
(kleine!) Java Einführung Mittwoch, Heute Ziel: erstes Java-Programm erstellen Von der Aufgabenstellung bis zur Lösung Grundlagen Einfache.
Imperative Programmierung
Spec# Proseminar Assertions im SS 2007 Uni Paderborn Andreas Martens Betreuer: Dipl. Inform. Björn Metzler.
Kapitel 4 Syntaktische Analyse: LR Parsing.
Parser generieren Yet Another Compiler – Compiler YACC.
Ausnahmen HS Merseburg (FH) WS 06/07.
FH-Hof Einbindung von JavaScript Anweisungen
Java: Objektorientierte Programmierung
Java: Dynamische Datentypen
Indirekte Adressierung
Java: Grundlagen der Sprache
DOM (Document Object Model)
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Prof. Dr. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Tobias Lauer.
Prof. Dr. rer.nat. Ralph Großmann Fakultät Informatik / Mathematik Sommersemester 2012 Internet-Technologien XML-basierte Techniken Teil Metasprache der.
Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 7 User Interfaces in Java Sommersemester 2003 Lars Bernard.
Parsing regulärer Ausdrücke
Sebastian Grahn Sebastian Kühn
Christian Kästner Modellgetriebene Softwareentwicklung Eclipse Modelling Framework.
Agenda Motivation Formale Sprachen Compiler Compilerentwicklung
Praxis-Repetitorium JAVA zusätzliche, ergänzende Lehrveranstaltung
PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Programm besteht aus mehreren Bestandteilen: Schlüsselwörter Sonderzeichen Bezeichner Kommentare Texte.
Explizite und editierbare Metainformationen für Software Muster.
Die Skriptsprache Perl (2) Wolfgang Friebel DESY Zeuthen.
Projektplan: Fachgebiet Software Engineering Übersicht © Albert Zündorf, Kassel University.
Reverse Engineering K2 1 Ziele Heute Nachlese Volltextsuche Dokumentation in Quelltext einbetten JavaDoc Vorbereitung für Compileransatz.
1 Reverse Engineering WS 07 / 08 A. Zündorf. Fachgebiet Software Engineering Übersicht © Albert Zündorf, Kassel University 2 Organisatorisches.
A. Zündorf, SE Group Reverse Engineering K2 1 Ziele Heute Compilerbau Nachlese Ausnutzung von Laufzeittypinformation.
A. Zündorf, SE Group Reverse Engineering K2 1 Ziele Heute Compilerbau Nachlese Ausnutzung von Laufzeittypinformation.
DVG Klassen und Objekte
Java in 9 Folien Besser: Online-Buch Go to Java 2.
UML Begleitdokumentation des Projekts
Von der Sprache zum Programm
FH-Hof 1 XML-Parser Richard Göbel. FH-Hof 2 XML-Parser- DOM Object Tree Parser Objekt der Klasse 'DocumentBuilderFactory' mit 'newInstance()' erzeugen.
Sommersemester 2004 Jan Drewnak Entwicklung und Einsatz von Geosoftware I Praktikum Sitzung 7 Sitzung 7: User Interfaces in Java.
Programmiersprachen II Integration verschiedener Datenstrukturen
Was umfaßt die CORBA Core Spezifikation? Welche zusätzlichen Komponenten muß ein ORB Produkt beinhalten? Core: CORBA Objekt Modell CORBA Architektur OMG.
RDF MT Resource Description Framework Model Theory © 2002 by Emir Blažević
Informatik 1 Übung 8. NACHBESPRECHUNG Übung 8 Rekursion Existiert Weg von A nach B?
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
Java und Eclipse.
EPROG Tutorium Einheit 4 Klassen und Objekte. Wiederholung Schleifen do... while while for break/continue Strings String char Methoden für Strings Arrays.
3/28/2017 8:11 PM Visual Studio Tools für Office { Rapid Application Development für Office } Jens Häupel Platform Strategy Manager Microsoft Deutschland.
Windows Presentation Foundation, Vorlesung Wintersemester 2013/14 Prof. Dr. Herrad Schmidt WS 13/14 Kapitel 2 Folie 2 XAML (1) s.a.
Entwicklung verteilter Anwendungen I, WS 13/14 Prof. Dr. Herrad Schmidt WS 13/14 Kapitel 1 Folie 2 Microsoft.NET Framework: Quelle:
Informatik 1 Letzte Übung.
Style Guidelines für Java und .NET
Dynamische Datentypen
C-Einstieg. Agenda 1Vorbereitung 2Aufbau eines Programms 2.1Header 2.2 Methoden 2.3Main 3Datentypen & Variablen 4Operatoren(+, -, *, /) 5Logik 5.1IF 5.2Switch.
Projektmanagement Ziel und Umfang eines Softwareprojektes definieren
Vortrag: Visual Basic Neuerungen Autor : Dennis Hoyer
Purga - Scriptengine Ein Einblick.
Objectives Verstehen was unterDelegate verstanden wird
Städtisches Gymnasium Beverungen Friedel Berlage
Meta-Modell für Story-Diagramme und Expressions
Agenda Motivation und Einordnung Syntaxgerichtete Übersetzung
Java Syntaxdiagramme Buchstabe A B Z a z ... Ziffer
Mensch – Maschine - Kommunikation
Generative Softwareentwicklung in der Praxis Olaf Kaus, „Java User Group“, Hannover 6.Oktober 2003.
7. Formale Sprachen und Grammatiken
Inhalt Einordnung und Funktion der lexikalische Analyse Grundlagen
Semantische Analyse und attributierte Grammatiken
Ausnahmen Vorlesung besteht aus zwei Teilen Programmierung (4 SWS)
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/ Übungsaufgabe vom Logische Ausdrücke 1.true & false | true 2.(10>2)
IT2 – WS 2005/20061Nov 14, 2005 Visibility  public: Sichtbar in allen Paketen  protected: Sichtbar innerhalb des Pakets und in den Unterklassen  (default,
Lexikalische Semantik
Hello World! Javakurs 2013 Arne Kappen
 Präsentation transkript:

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 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 /// /// 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. /// 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 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!  Verwaltet von der.NET Foundation  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 packageSDK Templates VSIX package  Bibliotheken: NuGet Roslyn compiler packageNuGet Roslyn compiler package  Syntax Visualizer: Syntax Visualizer VSIX packageSyntax 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 /// /// 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. /// 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 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 conditio n if ( 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) { } } conditio n if () { } left== right left== right id true fals e 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 /// /// 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. /// 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 /// /// 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. /// 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/verbinde n mit benannten Symbolen Tokenizer/ Lexer ParserSymbolsBinder 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/verbinde n mit benannten Symbolen Plattformunabhängige Optimierungen Plattformabhängige Optimierungen All gesammelten Informationen werden in Binary/Assembly ausgegeben Tokenizer/ Lexer ParserSymbolsBinder 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() 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();. } – MethodDeclarationSyntax 2 – ParameterListSyntax 3 – VariableDeclarationSyntax 4 – IfStatementSyntax robinsedlaczek robinsedlaczek.wordpress.com

Syntax Kinds vs. Syntax Types  Was passt hier nicht? 463 (C#) 642 (VB) Types Kinds 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!