Thread-safe .NET durch Immutables

Post on 26-Jan-2017

210 views 2 download

Transcript of Thread-safe .NET durch Immutables

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