4. 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
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
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.
20. 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
22. 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
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