Post on 26-Jan-2017
Thread-safe .NET durch Immutables@ ParallelCon 2016
Robin Sedlaczek | CTO Fairmas GmbH | .NET User Group Berlin
RobinSedlaczek
RobinSedlaczek.wordpress.comRobinSedlaczek@live.de
RobinSedlaczek
RobinSedlaczek.wordpress.comRobinSedlaczek@live.de
CTO der Fairmas GmbH in Berlin Community Leader DNUG Berlin Blogger / .NET Code Geek Sprecher MSDN Moderator Freier Autor (Entwickler.de, Heise, DotNetPro, Informatik aktuell) Open Source (SharpGL, Roslyn, FxCopAnalyzers)RobinSedlaczek
RobinSedlaczek.wordpress.com
Robin Sedlaczek
RobinSedlaczek@live.de
Click to edit Master subtitle style
RobinSedlaczek
RobinSedlaczek.wordpress.comRobinSedlaczek@live.de
Warum Immutables?
RobinSedlaczek
RobinSedlaczek.wordpress.comRobinSedlaczek@live.deMOTIVATION
Abhängiger Code
Global Variable/State
Abhängiger Code
Abhängiger Code
Abhängiger Code
Abhängiger Code
Global Variable/State
Abhängiger Code
Abhängiger Code
Abhängiger Code
Abhängiger Code
Abhängiger Code
RobinSedlaczek
RobinSedlaczek.wordpress.comRobinSedlaczek@live.deMOTIVATION
RobinSedlaczek
RobinSedlaczek.wordpress.comRobinSedlaczek@live.deDEFINITION
Ein immutable (unveränderliches) Objekt ist ein Objekt, dessen Zustand nach der Erzeugung nicht mehr verändert werden kann.
Immutable ist auch, wenn der Zustand eines Objektes nach Außen unveränderlich erscheint, auch wenn sich intern benutzte Attribute ändern.
RobinSedlaczek
RobinSedlaczek.wordpress.comRobinSedlaczek@live.deWEAK VS. STRONG
Nur einige Felder eines Objektes sind immutable
Weakly immutable Alle Felder eines Objektes sind immutable Immutable Klasse kann nicht durch andere Klasse
erweitert werden Strongly immutable
RobinSedlaczek
RobinSedlaczek.wordpress.comRobinSedlaczek@live.deVORTEILE
Immutables sind Inhärent Thread-safe Immutables sind leichter zu verstehen Annahmen können leichter getroffen
werden Immutables können Speicherverbrauch
reduzieren Immutables können Performance
verbessern Immutables sind sicherer
Click to edit Master subtitle style
RobinSedlaczek
RobinSedlaczek.wordpress.comRobinSedlaczek@live.de
.NET Immutable Collections
RobinSedlaczek
RobinSedlaczek.wordpress.comRobinSedlaczek@live.deINFOS
• Arbeit begann 12/2012, erste Beta-Versionen wurden unabhängig vom .NET Framework-Releasezyklus ausgeliefert (wegen gewünschtem Feedback aus der Community)– September 2013 dann erstes stabiles Release v1.0.27
• Immutable Collections sind Teil der BCL
• Seit v1.1.32-beta anderer Namespace: Umzug von Microsoft.Bcl.Immutable zu System.Collections.Immutable
• Aktuelle Version 1.1.37
• Können ab .NET 4.5 verwendet werden – für Desktop, Windows Store, Portable Class Library, Windows Phone 8)
• Können via NuGet bezogen werden: https://www.nuget.org/packages/System.Collections.Immutable
• Große Beliebtheit:– 1,196,190 Downloads– 2,202 Downloads durchschnittlich pro Tag
• Implementierungsdetails:– For efficiency reasons, the implementation uses a sharing mechanism to ensure that newly created instances
share as much data as possible with the previous instance while ensuring that operations have a predictable time complexity.
Click to edit Master subtitle style
RobinSedlaczek
RobinSedlaczek.wordpress.comRobinSedlaczek@live.de
C# - Sprachmerkmale zur Unterstützung von Immutables
RobinSedlaczek
RobinSedlaczek.wordpress.comRobinSedlaczek@live.deNEU IN C# 6
Initialisierung von Read-Only Auto-Properties in Deklaration
Initialisierung von Read-Only Auto-Properties in Konstruktor
Expression-bodied Properties und Functions
RobinSedlaczek
RobinSedlaczek.wordpress.comRobinSedlaczek@live.deNEU IN C# 7
Immutable Object Creation Pattern Matching und Deconstruction With-Expressions Object Initializers für immutable Objects
RobinSedlaczek
RobinSedlaczek.wordpress.comRobinSedlaczek@live.deNEU IN C# 7
public class Person { public string FirstName { get; } public string LastName { get; }
public Person(string firstName, string lastName) { FirstName = firstName; LastName = lastName; } }
var p = new Person { FirstName = "Mickey", LastName = "Mouse" }; // object initializer
if (p is Person("Mickey", *)) // positional deconstruction { return p with { FirstName = "Minney" }; // with-expression }
Click to edit Master subtitle style
RobinSedlaczek
RobinSedlaczek.wordpress.comRobinSedlaczek@live.de
Fallstudie Roslyn
RobinSedlaczek
RobinSedlaczek.wordpress.comRobinSedlaczek@live.deWAS IST ROSLYN
Aufbrechen der klassischen 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.comRobinSedlaczek@live.deAUFBAU EINES
COMPILERSZerlegen 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
PreprocessorCode
GeneratorCodeGen
Postprocessor
Lexikalische Analyse
Syntaktische Analyse
Semantische Analyse
Synthese-Phase
RobinSedlaczek
RobinSedlaczek.wordpress.comRobinSedlaczek@live.deCOMPILER SERVICES
(APIs)
RobinSedlaczek
RobinSedlaczek.wordpress.comRobinSedlaczek@live.deSYNTAXANALYSE
var tree = CSharpSyntaxTree.ParseText(sourceCode);
var node = tree.GetRoot();
SyntaxTree ist abstrakt Parsing über sprachspezifische
Ableitung SyntaxTree ist immutable
RobinSedlaczek
RobinSedlaczek.wordpress.comRobinSedlaczek@live.deSEMANTISCHE
ANALYSE
var compilation = CSharpCompilation .Create("CodeInCurrentProject") .AddReferences(references) .AddSyntaxTrees(trees);
var semanticModel = compilation.GetSemanticModel(tree);var emitResult = compilation.Emit(path);
Compilation ist abstrakt daher wieder sprachspezifische
Ableitungen Compilation ist immutable
RobinSedlaczek
RobinSedlaczek.wordpress.comRobinSedlaczek@live.deUNTER DER HAUBE
Der Code (links) wurde mehrfach der Syntaxanalyse unterzogen. Beim ersten Durchlauf wurden 1665 Objekte erzeugt. Beim zweiten waren es nur noch 16 Objekte. Hinter der unveränderlichen Fassade optimiert Roslyn den Speicherverbrauch (siehe Red-Green-Trees).
RobinSedlaczek
RobinSedlaczek.wordpress.comRobinSedlaczek@live.deUNTER DER HAUBE
Für jeden Parsing-Vorgang werden bereits gecachte Objekte wiederverwendet. Auch wenn der Code ein ganz anderer ist.
Eine detaillierte technische Erläuterung der Cache-Implementierung in Lexer und Parser befindet sich hier: http://bit.ly/1VAoVY8
RobinSedlaczek
RobinSedlaczek.wordpress.comRobinSedlaczek@live.deUNTER DER HAUBE
Red Tree: Immutable nach außen! Green Tree: interne
Optimierung
Red-Green-Trees stellen einen Optimierungsansatz dar: die eigentliche interne Struktur zur Darstellung eines Syntaxbaums (Green Tree) ist wesentlich kleiner als der immutable Syntaxbaum, den der Client sieht (Red Tree).
Click to edit Master subtitle style
RobinSedlaczek
RobinSedlaczek.wordpress.comRobinSedlaczek@live.de
Thread-safe .NET durch Immutables
Robin Sedlaczek
RobinSedlaczek
RobinSedlaczek.wordpress.comRobinSedlaczek@live.de