+ All Categories
Home > Software > Thread-safe .NET durch Immutables

Thread-safe .NET durch Immutables

Date post: 26-Jan-2017
Category:
Upload: robin-sedlaczek
View: 209 times
Download: 2 times
Share this document with a friend
24
Thread-safe .NET durch Immutables @ ParallelCon 2016 Robin Sedlaczek | CTO Fairmas GmbH | .NET User Group Berlin RobinSedlaczek RobinSedlaczek.wordpress.com [email protected]
Transcript
Page 1: Thread-safe .NET durch Immutables

Thread-safe .NET durch Immutables@ ParallelCon 2016

Robin Sedlaczek | CTO Fairmas GmbH | .NET User Group Berlin

RobinSedlaczek

[email protected]

Page 2: Thread-safe .NET durch Immutables

RobinSedlaczek

[email protected]

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

[email protected]

Page 3: Thread-safe .NET durch Immutables

Click to edit Master subtitle style

RobinSedlaczek

[email protected]

Warum Immutables?

Page 4: Thread-safe .NET durch Immutables

RobinSedlaczek

[email protected]

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

Page 5: Thread-safe .NET durch Immutables

RobinSedlaczek

[email protected]

Page 6: Thread-safe .NET durch Immutables

RobinSedlaczek

[email protected]

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.

Page 7: Thread-safe .NET durch Immutables

RobinSedlaczek

[email protected] 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

Page 8: Thread-safe .NET durch Immutables

RobinSedlaczek

[email protected]

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

Page 9: Thread-safe .NET durch Immutables

Click to edit Master subtitle style

RobinSedlaczek

[email protected]

.NET Immutable Collections

Page 10: Thread-safe .NET durch Immutables

RobinSedlaczek

[email protected]

• 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.

Page 11: Thread-safe .NET durch Immutables

Click to edit Master subtitle style

RobinSedlaczek

[email protected]

C# - Sprachmerkmale zur Unterstützung von Immutables

Page 12: Thread-safe .NET durch Immutables

RobinSedlaczek

[email protected] IN C# 6

Initialisierung von Read-Only Auto-Properties in Deklaration

Initialisierung von Read-Only Auto-Properties in Konstruktor

Expression-bodied Properties und Functions

Page 13: Thread-safe .NET durch Immutables

RobinSedlaczek

[email protected] IN C# 7

Immutable Object Creation Pattern Matching und Deconstruction With-Expressions Object Initializers für immutable Objects

Page 14: Thread-safe .NET durch Immutables

RobinSedlaczek

[email protected] 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 }

Page 15: Thread-safe .NET durch Immutables

Click to edit Master subtitle style

RobinSedlaczek

[email protected]

Fallstudie Roslyn

Page 16: Thread-safe .NET durch Immutables

RobinSedlaczek

[email protected] 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

Page 17: Thread-safe .NET durch Immutables

RobinSedlaczek

[email protected] 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

Page 18: Thread-safe .NET durch Immutables

RobinSedlaczek

[email protected] SERVICES

(APIs)

Page 19: Thread-safe .NET durch Immutables

RobinSedlaczek

[email protected]

var tree = CSharpSyntaxTree.ParseText(sourceCode);

var node = tree.GetRoot();

SyntaxTree ist abstrakt Parsing über sprachspezifische

Ableitung SyntaxTree ist immutable

Page 20: Thread-safe .NET durch Immutables

RobinSedlaczek

[email protected]

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

Page 21: Thread-safe .NET durch Immutables

RobinSedlaczek

[email protected] 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).

Page 22: Thread-safe .NET durch Immutables

RobinSedlaczek

[email protected] 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

Page 23: Thread-safe .NET durch Immutables

RobinSedlaczek

[email protected] 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).

Page 24: Thread-safe .NET durch Immutables

Click to edit Master subtitle style

RobinSedlaczek

[email protected]

Thread-safe .NET durch Immutables

Robin Sedlaczek

RobinSedlaczek

[email protected]


Recommended