Robin Sedlaczek | CTO Fairmas GmbH | .NET User Group Berlin
RobinSedlaczek RobinSedlaczek@live.de RobinSedlaczek.com
RobinSedlaczek
RobinSedlaczek.com
robin.sedlaczek@live.de
 Community Leader
 CTO der GmbH Berlin
 Sprecher | Autor | Blogger
[ Entwickler.de, Heise, DotNetPro, Informatik aktuell, BASTA!, .NET Summit,
ParallelCon, ADC, GUI & DESIGN, DevSpace, Spartakiade...]
 Open Source-Entwickler
[ SharpGL, Roslyn, FxCopAnalyzers, Force Feedback Programming ]
.NET User Group Berlin-Brandenburg
Fragen?
Jederzeit, immer gerne & kostenlos.
Und wahrscheinlich nicht umsonst!
Robin Sedlaczek
RobinSedlaczek
RobinSedlaczek.wordpress.com
RobinSedlaczek@live.de
.NET Compiler Platform (“Roslyn”)
Robin Sedlaczek | Chief Technical Officer at Fairmas GmbH
RobinSedlaczek
RobinSedlaczek.com
RobinSedlaczek@live.deCOMPILER ARCHITECTURE
Break down source
code into tokens
Parsing of tokens to match
syntax that is given by the
grammar (AST)
Type declarations from code
and metadata to named
symbols (symbol table)
Connect identifier in code
with named symbols
Platform-independent
optimizations
Platform-dependent
optimizations
Emit all collected
information into
binary/assembly
Tokenizer/
Lexer
Parser Symbols Binder
CodeGen
Preprocessor
Code
Generator
CodeGen
Postprocessor
Lexical Analysis Syntactic Analysis Semantic Analysis Synthesis
robinsedlaczek
robinsedlaczek.wordpress.com
Syntax Tree API Syntax Tree API Binding &
Flow Analysis API
Emit API
RobinSedlaczek
RobinSedlaczek.wordpress.com
RobinSedlaczek@live.de
Warum warten auf die IDE?
Robin Sedlaczek | Chief Technical Officer at Fairmas GmbH
RobinSedlaczek
RobinSedlaczek.com
RobinSedlaczek@live.de
ZIELE HEUTE
 API: C# Scripting API
 Use Case: Schneller entwickeln mit direktem Feedback
 Use Case: Flexibilität für den Anwender
 Must-have: Sicherheit
RobinSedlaczek
RobinSedlaczek.wordpress.com
RobinSedlaczek@live.de
C# Scripting - Übersicht
Robin Sedlaczek | Chief Technical Officer at Fairmas GmbH
RobinSedlaczek
RobinSedlaczek.com
RobinSedlaczek@live.de
C# SCRIPTING - ÜBERSICHT
 Ermöglicht einfaches Ausführen von C# Code-Snippets
 Zu jeder Zeit
 Voll typisiert
 Bei Erhalt der Flexibilität von C# (und vielleicht VB.NET)
 Momentan nur C# Scripting unterstützt
 VB.NET Scripting wahrscheinlich nur durch Contribution aus Community
 Teil der Microsoft .NET Compiler Plattform („Roslyn“)
 https://github.com/dotnet/roslyn
RobinSedlaczek
RobinSedlaczek.com
RobinSedlaczek@live.de
C# SCRIPTING - ÜBERSICHT
 Min. .NET Framework 4.6+ oder .NET Core 1.1 (seit Roslyn 2.0.0-rc3)
 .NET Native, UWP momentan nicht unterstützt (Laden dynamisch erzeugten Codes hier nicht
möglich)
 NuGet-Paket: Microsoft.CodeAnalysis.CSharp.Scripting (v2.7, Stand April 2018)
 http://www.nuget.org/packages/Microsoft.CodeAnalysis.CSharp.Scripting/2.7
RobinSedlaczek
RobinSedlaczek.wordpress.com
RobinSedlaczek@live.de
Demo
Robin Sedlaczek | Chief Technical Officer at Fairmas GmbH
RobinSedlaczek
RobinSedlaczek.wordpress.com
RobinSedlaczek@live.de
C# Scripting - API
Robin Sedlaczek | Chief Technical Officer at Fairmas GmbH
RobinSedlaczek
RobinSedlaczek.com
RobinSedlaczek@live.de
C# SCRIPTING - API
 Hinzufügen zur Solution oder zum Projekt mit
 NuGet Package Manager UI in Visual Studio oder
 NuGet Package Manager Console: Install-Package Microsoft.CodeAnalysis.CSharp.Scripting
 Namespace-Import: using Microsoft.CodeAnalysis.CSharp.Scripting
 Einstieg in die API bildet die statische Klasse CSharpScript:
RobinSedlaczek
RobinSedlaczek.com
RobinSedlaczek@live.de
C# SCRIPTING - API
 Evaluieren von Skripten mit CSharpScript.EvaluateAsync():
 EvaluteAsync<T>() führt Skript aus und gibt Ergebnis zurück
 Ergebnis ist vom Typ Task<T> (im Beispiel Task<int>)
 CompilationErrorException wenn Typangabe nicht zu Ergebnistyp passt
 Nicht-generische Überladung führt implizite Typkonvertierung nicht durch
// Value of result will be 3 of explicit type int.
int result = await CSharpScript.EvaluateAsync<int>("1 + 2");
// Value of result will be 3 of type object.
object result = await CSharpScript.EvaluateAsync("1 + 2");
RobinSedlaczek
RobinSedlaczek.com
RobinSedlaczek@live.de
C# SCRIPTING - API
 Ausführen von Skripten mit CSharpScript.RunAsync():
 RunAsync<T>() führt Skript aus und kapselt Ergebnis in ScriptState<T>
 Ergebnis ist vom Typ Task<ScriptState<T>> (im Beispiel Task<ScriptState<int>>)
 CompilationErrorException wenn Typangabe nicht zu Ergebnistyp passt
 Nicht-generische Überladung führt implizite Typkonvertierung nicht durch, Ergebnistyp ist dann Task<ScriptState>
 ScriptState<T> kapselt Ergebnis und weitere Informationen über das Skript
// Variable result will contain return value 3 of explicit type int.
ScriptState<int> result = await CSharpScript.RunAsync<int>("1 + 2");
// Variable result will contain return value 3 of type object.
ScriptState<object> result = await CSharpScript.RunAsync("1 + 2");
RobinSedlaczek
RobinSedlaczek.com
RobinSedlaczek@live.de
C# SCRIPTING - API
 Skript-Ergebnisse auswerten – die Klasse ScriptState:
 ScriptState beinhaltet Laufzeitinformationen über das Skript
 Skript-Variablen und ihre Werte über Eigenschaft Variables abrufbar
 Skript-Rückgabewert über Eigenschaft ReturnValue abrufbar
 Ableitung ScriptState<T> typisiert ReturnValue mit generischem Typ
 Skript-Abstraktion über Eigenschaft Script abrufbar
var a = 5;
var b = 7;
return a + b;
RobinSedlaczek
RobinSedlaczek.com
RobinSedlaczek@live.de
C# SCRIPTING - API
 Skripte erzeugen und verwalten mit CSharpScript.Create():
var snippet =
@"
var a = 5;
var b = 7;
return a + b;
";
// Creates script with return type of int.
Script<int> script2 = CSharpScript.Create<int>(snippet);
// Creates script with return type of object.
Script script = CSharpScript.Create(snippet);
 CSharpScript.Create<T>() kapselt Code-Snippet in einer Instanz
der Klasse Script<T>
 Code-Snippet wird dabei aber nicht sofort ausgeführt
 Die Klasse Script<T> liefert Informationen und bietet viele
Funktionen für den Umgang mit Skripten
 Z.B. kann über die Eigenschaft ReturnType der Typ des
Rückgabewertes des Skriptes abgerufen werden
 Typparameter T bestimmt Rückgabetyp
 Nicht-generische Überladung gibt Instanz von Script<object>
zurück  Rückgabetyp ist dann object
RobinSedlaczek
RobinSedlaczek.com
RobinSedlaczek@live.de
C# SCRIPTING - API
 Umgang mit Skripten – die Klasse Script:
 ScriptState beinhaltet Laufzeitinformationen über das Skript
 erfüllt verschiedene Aufgaben, wie z.B. das Ausführen von Skripten zu späteren
Zeitpunkten, Fortführung von Skripten, Bereitstellung von Compiler-Informationen,
Bereitstellung von Kontext innerhalb von Skripten etc.
RobinSedlaczek
RobinSedlaczek.wordpress.com
RobinSedlaczek@live.de
Real World Example | Application Scripting
Robin Sedlaczek | Chief Technical Officer at Fairmas GmbH
RobinSedlaczek
RobinSedlaczek.com
RobinSedlaczek@live.de
APPLICATION SCRIPTING
Ziele
 eigene Anwendung Script-fähig machen
 C# als Script-Sprache verwenden
 Roslyn bietet dafür die C# Scripting API
Fallbeispiel: ModelR
 Kollaboratives 3D Modelling Tool
 Client-Server-Anwendung (basierend auf SignalR)
 Integriertes Scripting mit der C# Scripting API
 Script-Editor mit Syntax Highlighting
 Ausgabe von Kompilierfehlern
 Live Script Execution beim Tippen
RobinSedlaczek
RobinSedlaczek.com
RobinSedlaczek@live.de
APPLICATION SCRIPTING
 Script erlaubt direkten Zugriff auf Anwendungsobjekte
 es können aber auch eigene Objekte erzeugt werden
RobinSedlaczek
RobinSedlaczek.com
RobinSedlaczek@live.de
APPLICATION SCRIPTING
 Nutzen für Benutzer
 Flexibilität – Anwendung kann in sich erweitert werden, ohne Neukompilierung durch den Benutzer
 Erweiterbarkeit – Anwendung kann von allen Benutzer beliebig erweitert werden
 Effektivität – komplexe wiederkehrende Prozesse können vom Benutzer automatisiert werden
 Anpassbarkeit – ein Nutzer kann sich die Anwendung nach seinen Vorstellungen/Vorgaben anpassen
 Nutzen für Entwickler
 Beliebige APIs können dem Scripting zur Verfügung gestellt werden
 APIs sind dann zur Anwendungslaufzeit verfügbar und können dort ausprobiert werden
 Kontextwechsel zwischen Kodieren und Programmausführung fällt weg
 Code kann dort geschrieben werden, wo er seine Auswirkung hat
 Direktes Feedback der Auswirkungen sichtbar
 Steigerung der Effizienz
 Reduktion von Entwicklungskosten
RobinSedlaczek
RobinSedlaczek.com
RobinSedlaczek@live.de
APPLICATION SCRIPTING
 ModelR - Code & HowTo
 WaveDev.ModelR von Robin Sedlaczek
 Quellcode ist Open Source auf GitHub: https://github.com/robinsedlaczek/ModelR
 Clonen, Kompilieren, Ausführen: WaveDev.ModelR.Server zuerst starten, danach WaveDev.ModelR
 4 vordefinierte ModelR-Benutzer: Robin (PW: robin), Sarah (PW: sarah), Jan (PW: jan), Sebastian (PW: sebastian)
 Script-Kontext über globale Eigenschaft „ModelR“ bereitgestellt
 Über den Script-Kontext kann auf die Anwendungsobjekte zugegriffen werden (Users, SceneObjects)
 Neue Objekte werden aus Script ausgelesen und automatisch in die Szene übernommen
RobinSedlaczek
RobinSedlaczek.wordpress.com
RobinSedlaczek@live.de
Links
Robin Sedlaczek | Chief Technical Officer at Fairmas GmbH
RobinSedlaczek
RobinSedlaczek.com
RobinSedlaczek@live.de
LINKS
 Real-World Example ModelR:
https://github.com/robinsedlaczek/ModelR
 C#-Script Security
 Manuelle Überprüfung eines Scripts:
https://github.com/robinsedlaczek/CSharpScriptSecurity
 Benutzerdefinierte Referenzauflösung:
https://github.com/robinsedlaczek/CustomReferenceResolverDemo
 Force Feedback Programming (jetzt auch für VS 2017):
https://github.com/robinsedlaczek/ForceFeedbackProgramming
RobinSedlaczek
RobinSedlaczek.com
RobinSedlaczek@live.de
Sage den Leuten nicht,
was sie zu tun haben.
Zeig‘ es ihnen!
„Jetzt seid Ihr dran...“
RobinSedlaczek RobinSedlaczek@live.de RobinSedlaczek.com

Magdeburger Developer Days 2018 - Warum warten auf die IDE?

  • 1.
    Robin Sedlaczek |CTO Fairmas GmbH | .NET User Group Berlin RobinSedlaczek RobinSedlaczek@live.de RobinSedlaczek.com
  • 2.
    RobinSedlaczek RobinSedlaczek.com robin.sedlaczek@live.de  Community Leader CTO der GmbH Berlin  Sprecher | Autor | Blogger [ Entwickler.de, Heise, DotNetPro, Informatik aktuell, BASTA!, .NET Summit, ParallelCon, ADC, GUI & DESIGN, DevSpace, Spartakiade...]  Open Source-Entwickler [ SharpGL, Roslyn, FxCopAnalyzers, Force Feedback Programming ] .NET User Group Berlin-Brandenburg Fragen? Jederzeit, immer gerne & kostenlos. Und wahrscheinlich nicht umsonst! Robin Sedlaczek
  • 3.
    RobinSedlaczek RobinSedlaczek.wordpress.com RobinSedlaczek@live.de .NET Compiler Platform(“Roslyn”) Robin Sedlaczek | Chief Technical Officer at Fairmas GmbH
  • 4.
    RobinSedlaczek RobinSedlaczek.com RobinSedlaczek@live.deCOMPILER ARCHITECTURE Break downsource code into tokens Parsing of tokens to match syntax that is given by the grammar (AST) Type declarations from code and metadata to named symbols (symbol table) Connect identifier in code with named symbols Platform-independent optimizations Platform-dependent optimizations Emit all collected information into binary/assembly Tokenizer/ Lexer Parser Symbols Binder CodeGen Preprocessor Code Generator CodeGen Postprocessor Lexical Analysis Syntactic Analysis Semantic Analysis Synthesis robinsedlaczek robinsedlaczek.wordpress.com Syntax Tree API Syntax Tree API Binding & Flow Analysis API Emit API
  • 5.
    RobinSedlaczek RobinSedlaczek.wordpress.com RobinSedlaczek@live.de Warum warten aufdie IDE? Robin Sedlaczek | Chief Technical Officer at Fairmas GmbH
  • 7.
    RobinSedlaczek RobinSedlaczek.com RobinSedlaczek@live.de ZIELE HEUTE  API:C# Scripting API  Use Case: Schneller entwickeln mit direktem Feedback  Use Case: Flexibilität für den Anwender  Must-have: Sicherheit
  • 8.
    RobinSedlaczek RobinSedlaczek.wordpress.com RobinSedlaczek@live.de C# Scripting -Übersicht Robin Sedlaczek | Chief Technical Officer at Fairmas GmbH
  • 9.
    RobinSedlaczek RobinSedlaczek.com RobinSedlaczek@live.de C# SCRIPTING -ÜBERSICHT  Ermöglicht einfaches Ausführen von C# Code-Snippets  Zu jeder Zeit  Voll typisiert  Bei Erhalt der Flexibilität von C# (und vielleicht VB.NET)  Momentan nur C# Scripting unterstützt  VB.NET Scripting wahrscheinlich nur durch Contribution aus Community  Teil der Microsoft .NET Compiler Plattform („Roslyn“)  https://github.com/dotnet/roslyn
  • 10.
    RobinSedlaczek RobinSedlaczek.com RobinSedlaczek@live.de C# SCRIPTING -ÜBERSICHT  Min. .NET Framework 4.6+ oder .NET Core 1.1 (seit Roslyn 2.0.0-rc3)  .NET Native, UWP momentan nicht unterstützt (Laden dynamisch erzeugten Codes hier nicht möglich)  NuGet-Paket: Microsoft.CodeAnalysis.CSharp.Scripting (v2.7, Stand April 2018)  http://www.nuget.org/packages/Microsoft.CodeAnalysis.CSharp.Scripting/2.7
  • 11.
  • 12.
    RobinSedlaczek RobinSedlaczek.wordpress.com RobinSedlaczek@live.de C# Scripting -API Robin Sedlaczek | Chief Technical Officer at Fairmas GmbH
  • 13.
    RobinSedlaczek RobinSedlaczek.com RobinSedlaczek@live.de C# SCRIPTING -API  Hinzufügen zur Solution oder zum Projekt mit  NuGet Package Manager UI in Visual Studio oder  NuGet Package Manager Console: Install-Package Microsoft.CodeAnalysis.CSharp.Scripting  Namespace-Import: using Microsoft.CodeAnalysis.CSharp.Scripting  Einstieg in die API bildet die statische Klasse CSharpScript:
  • 14.
    RobinSedlaczek RobinSedlaczek.com RobinSedlaczek@live.de C# SCRIPTING -API  Evaluieren von Skripten mit CSharpScript.EvaluateAsync():  EvaluteAsync<T>() führt Skript aus und gibt Ergebnis zurück  Ergebnis ist vom Typ Task<T> (im Beispiel Task<int>)  CompilationErrorException wenn Typangabe nicht zu Ergebnistyp passt  Nicht-generische Überladung führt implizite Typkonvertierung nicht durch // Value of result will be 3 of explicit type int. int result = await CSharpScript.EvaluateAsync<int>("1 + 2"); // Value of result will be 3 of type object. object result = await CSharpScript.EvaluateAsync("1 + 2");
  • 15.
    RobinSedlaczek RobinSedlaczek.com RobinSedlaczek@live.de C# SCRIPTING -API  Ausführen von Skripten mit CSharpScript.RunAsync():  RunAsync<T>() führt Skript aus und kapselt Ergebnis in ScriptState<T>  Ergebnis ist vom Typ Task<ScriptState<T>> (im Beispiel Task<ScriptState<int>>)  CompilationErrorException wenn Typangabe nicht zu Ergebnistyp passt  Nicht-generische Überladung führt implizite Typkonvertierung nicht durch, Ergebnistyp ist dann Task<ScriptState>  ScriptState<T> kapselt Ergebnis und weitere Informationen über das Skript // Variable result will contain return value 3 of explicit type int. ScriptState<int> result = await CSharpScript.RunAsync<int>("1 + 2"); // Variable result will contain return value 3 of type object. ScriptState<object> result = await CSharpScript.RunAsync("1 + 2");
  • 16.
    RobinSedlaczek RobinSedlaczek.com RobinSedlaczek@live.de C# SCRIPTING -API  Skript-Ergebnisse auswerten – die Klasse ScriptState:  ScriptState beinhaltet Laufzeitinformationen über das Skript  Skript-Variablen und ihre Werte über Eigenschaft Variables abrufbar  Skript-Rückgabewert über Eigenschaft ReturnValue abrufbar  Ableitung ScriptState<T> typisiert ReturnValue mit generischem Typ  Skript-Abstraktion über Eigenschaft Script abrufbar var a = 5; var b = 7; return a + b;
  • 17.
    RobinSedlaczek RobinSedlaczek.com RobinSedlaczek@live.de C# SCRIPTING -API  Skripte erzeugen und verwalten mit CSharpScript.Create(): var snippet = @" var a = 5; var b = 7; return a + b; "; // Creates script with return type of int. Script<int> script2 = CSharpScript.Create<int>(snippet); // Creates script with return type of object. Script script = CSharpScript.Create(snippet);  CSharpScript.Create<T>() kapselt Code-Snippet in einer Instanz der Klasse Script<T>  Code-Snippet wird dabei aber nicht sofort ausgeführt  Die Klasse Script<T> liefert Informationen und bietet viele Funktionen für den Umgang mit Skripten  Z.B. kann über die Eigenschaft ReturnType der Typ des Rückgabewertes des Skriptes abgerufen werden  Typparameter T bestimmt Rückgabetyp  Nicht-generische Überladung gibt Instanz von Script<object> zurück  Rückgabetyp ist dann object
  • 18.
    RobinSedlaczek RobinSedlaczek.com RobinSedlaczek@live.de C# SCRIPTING -API  Umgang mit Skripten – die Klasse Script:  ScriptState beinhaltet Laufzeitinformationen über das Skript  erfüllt verschiedene Aufgaben, wie z.B. das Ausführen von Skripten zu späteren Zeitpunkten, Fortführung von Skripten, Bereitstellung von Compiler-Informationen, Bereitstellung von Kontext innerhalb von Skripten etc.
  • 19.
    RobinSedlaczek RobinSedlaczek.wordpress.com RobinSedlaczek@live.de Real World Example| Application Scripting Robin Sedlaczek | Chief Technical Officer at Fairmas GmbH
  • 20.
    RobinSedlaczek RobinSedlaczek.com RobinSedlaczek@live.de APPLICATION SCRIPTING Ziele  eigeneAnwendung Script-fähig machen  C# als Script-Sprache verwenden  Roslyn bietet dafür die C# Scripting API Fallbeispiel: ModelR  Kollaboratives 3D Modelling Tool  Client-Server-Anwendung (basierend auf SignalR)  Integriertes Scripting mit der C# Scripting API  Script-Editor mit Syntax Highlighting  Ausgabe von Kompilierfehlern  Live Script Execution beim Tippen
  • 21.
    RobinSedlaczek RobinSedlaczek.com RobinSedlaczek@live.de APPLICATION SCRIPTING  Scripterlaubt direkten Zugriff auf Anwendungsobjekte  es können aber auch eigene Objekte erzeugt werden
  • 22.
    RobinSedlaczek RobinSedlaczek.com RobinSedlaczek@live.de APPLICATION SCRIPTING  Nutzenfür Benutzer  Flexibilität – Anwendung kann in sich erweitert werden, ohne Neukompilierung durch den Benutzer  Erweiterbarkeit – Anwendung kann von allen Benutzer beliebig erweitert werden  Effektivität – komplexe wiederkehrende Prozesse können vom Benutzer automatisiert werden  Anpassbarkeit – ein Nutzer kann sich die Anwendung nach seinen Vorstellungen/Vorgaben anpassen  Nutzen für Entwickler  Beliebige APIs können dem Scripting zur Verfügung gestellt werden  APIs sind dann zur Anwendungslaufzeit verfügbar und können dort ausprobiert werden  Kontextwechsel zwischen Kodieren und Programmausführung fällt weg  Code kann dort geschrieben werden, wo er seine Auswirkung hat  Direktes Feedback der Auswirkungen sichtbar  Steigerung der Effizienz  Reduktion von Entwicklungskosten
  • 23.
    RobinSedlaczek RobinSedlaczek.com RobinSedlaczek@live.de APPLICATION SCRIPTING  ModelR- Code & HowTo  WaveDev.ModelR von Robin Sedlaczek  Quellcode ist Open Source auf GitHub: https://github.com/robinsedlaczek/ModelR  Clonen, Kompilieren, Ausführen: WaveDev.ModelR.Server zuerst starten, danach WaveDev.ModelR  4 vordefinierte ModelR-Benutzer: Robin (PW: robin), Sarah (PW: sarah), Jan (PW: jan), Sebastian (PW: sebastian)  Script-Kontext über globale Eigenschaft „ModelR“ bereitgestellt  Über den Script-Kontext kann auf die Anwendungsobjekte zugegriffen werden (Users, SceneObjects)  Neue Objekte werden aus Script ausgelesen und automatisch in die Szene übernommen
  • 24.
  • 25.
    RobinSedlaczek RobinSedlaczek.com RobinSedlaczek@live.de LINKS  Real-World ExampleModelR: https://github.com/robinsedlaczek/ModelR  C#-Script Security  Manuelle Überprüfung eines Scripts: https://github.com/robinsedlaczek/CSharpScriptSecurity  Benutzerdefinierte Referenzauflösung: https://github.com/robinsedlaczek/CustomReferenceResolverDemo  Force Feedback Programming (jetzt auch für VS 2017): https://github.com/robinsedlaczek/ForceFeedbackProgramming
  • 26.
  • 27.
    „Jetzt seid Ihrdran...“ RobinSedlaczek RobinSedlaczek@live.de RobinSedlaczek.com

Hinweis der Redaktion