Das Konzept für einen möglichen Vortrag skizziert
This commit is contained in:
parent
374ef68c7b
commit
64b78d4602
2 changed files with 139 additions and 16 deletions
|
|
@ -8,46 +8,62 @@
|
|||
<node BACKGROUND_COLOR="#dcbbc2" CREATED="1715854555555" HGAP="24" ID="ID_192093431" MODIFIED="1715874353493" TEXT="Langlebigkeit" VSHIFT="5">
|
||||
<edge STYLE="bezier" WIDTH="thin"/>
|
||||
<font NAME="SansSerif" SIZE="14"/>
|
||||
<node CREATED="1715950719770" ID="ID_1453680144" MODIFIED="1715950722818" TEXT="Klarheit"/>
|
||||
<node CREATED="1715854555555" ID="ID_327719254" MODIFIED="1715874366995" TEXT="Wartberkeit"/>
|
||||
<node BACKGROUND_COLOR="#e7c3af" COLOR="#473b63" CREATED="1519417607616" HGAP="-24" ID="ID_801743732" MODIFIED="1519418085740" STYLE="bubble" TEXT="Struktur" VSHIFT="6">
|
||||
<node CREATED="1715950689814" ID="ID_1450774121" MODIFIED="1715950694937" TEXT="Änderbarkeit"/>
|
||||
<node BACKGROUND_COLOR="#e7c3af" COLOR="#473b63" CREATED="1519417607616" HGAP="-24" ID="ID_801743732" MODIFIED="1715951074757" STYLE="bubble" TEXT="Struktur" VSHIFT="6">
|
||||
<edge COLOR="#6c4d56" STYLE="sharp_linear" WIDTH="8"/>
|
||||
<arrowlink COLOR="#f7ea73" DESTINATION="ID_1419420745" ENDARROW="Default" ENDINCLINATION="-210;-20;" ID="Arrow_ID_1136673816" STARTARROW="None" STARTINCLINATION="-54;206;"/>
|
||||
<arrowlink COLOR="#f7ea73" DESTINATION="ID_1419420745" ENDARROW="Default" ENDINCLINATION="-98;-10;" ID="Arrow_ID_1136673816" STARTARROW="None" STARTINCLINATION="-77;189;"/>
|
||||
<font NAME="SansSerif" SIZE="14"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#dcbbc2" CREATED="1715854555555" HGAP="42" ID="ID_1213263689" MODIFIED="1715877026719" TEXT="Abstraktion" VSHIFT="30">
|
||||
<edge STYLE="bezier" WIDTH="thin"/>
|
||||
<font NAME="SansSerif" SIZE="14"/>
|
||||
<node CREATED="1715854555555" ID="ID_1730205402" MODIFIED="1715874474147" TEXT="Funktion"/>
|
||||
<node CREATED="1715854555555" ID="ID_389121882" MODIFIED="1715874489531" TEXT="Tupel"/>
|
||||
<node CREATED="1715854555555" HGAP="23" ID="ID_1346486921" MODIFIED="1715874516511" TEXT="Generics" VSHIFT="-9">
|
||||
<arrowlink COLOR="#4a5b8a" DESTINATION="ID_281894196" ENDARROW="Default" ENDINCLINATION="-21;-21;" ID="Arrow_ID_1214785333" STARTARROW="Default" STARTINCLINATION="11;18;"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#e7c3af" COLOR="#473b63" CREATED="1519417851534" HGAP="-55" ID="ID_1445939705" MODIFIED="1715877019872" STYLE="bubble" TEXT="Sprachmittel" VSHIFT="-19">
|
||||
<node CREATED="1715950617528" ID="ID_317252067" MODIFIED="1715950637721" TEXT="Trennung von Vertrag und Umsetzung"/>
|
||||
<node CREATED="1715950507489" ID="ID_1234481786" MODIFIED="1715950519886" TEXT="Trennung von Infrastruktur und Aktion"/>
|
||||
<node CREATED="1715950640133" ID="ID_1416025073" MODIFIED="1715950649567" TEXT="Trennung von Funktion und Daten"/>
|
||||
<node BACKGROUND_COLOR="#e7c3af" COLOR="#473b63" CREATED="1519417851534" HGAP="-18" ID="ID_1445939705" MODIFIED="1715951087411" STYLE="bubble" TEXT="Sprachmittel" VSHIFT="6">
|
||||
<edge COLOR="#6c4d56" STYLE="sharp_linear" WIDTH="8"/>
|
||||
<arrowlink COLOR="#f7ea73" DESTINATION="ID_1419420745" ENDARROW="Default" ENDINCLINATION="-60;-6;" ID="Arrow_ID_1884299333" STARTARROW="None" STARTINCLINATION="-61;-2;"/>
|
||||
<arrowlink COLOR="#f7ea73" DESTINATION="ID_1419420745" ENDARROW="Default" ENDINCLINATION="-60;-6;" ID="Arrow_ID_1884299333" STARTARROW="None" STARTINCLINATION="-79;10;"/>
|
||||
<font NAME="SansSerif" SIZE="14"/>
|
||||
<node CREATED="1715854555555" HGAP="23" ID="ID_1346486921" MODIFIED="1715950920723" STYLE="fork" TEXT="Function" VSHIFT="-9">
|
||||
<arrowlink COLOR="#4a5b8a" DESTINATION="ID_412915613" ENDARROW="Default" ENDINCLINATION="36;-8;" ID="Arrow_ID_1620887574" STARTARROW="Default" STARTINCLINATION="71;25;"/>
|
||||
</node>
|
||||
<node CREATED="1715854555555" HGAP="23" ID="ID_1063464796" MODIFIED="1715950938232" STYLE="fork" TEXT="Tuple" VSHIFT="-9">
|
||||
<arrowlink COLOR="#4a5b8a" DESTINATION="ID_1235760559" ENDARROW="Default" ENDINCLINATION="36;-8;" ID="Arrow_ID_1545377655" STARTARROW="Default" STARTINCLINATION="71;25;"/>
|
||||
</node>
|
||||
<node CREATED="1715854555555" HGAP="23" ID="ID_1285107340" MODIFIED="1715950882143" STYLE="fork" TEXT="Generic" VSHIFT="-9">
|
||||
<arrowlink COLOR="#4a5b8a" DESTINATION="ID_281894196" ENDARROW="Default" ENDINCLINATION="36;-8;" ID="Arrow_ID_1565931733" STARTARROW="Default" STARTINCLINATION="71;25;"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#dcbbc2" CREATED="1715854555555" HGAP="-57" ID="ID_527022244" MODIFIED="1715874549803" STYLE="fork" TEXT="C++" VSHIFT="30">
|
||||
<edge WIDTH="2"/>
|
||||
<font NAME="SansSerif" SIZE="14"/>
|
||||
<node BACKGROUND_COLOR="#dcbbc2" COLOR="#770f08" CREATED="1715854555555" HGAP="35" ID="ID_1419420745" MODIFIED="1715874437170" STYLE="bubble" TEXT="Entwicklung" VGAP="10" VSHIFT="-20">
|
||||
<node BACKGROUND_COLOR="#dcbbc2" COLOR="#770f08" CREATED="1715854555555" HGAP="35" ID="ID_1419420745" MODIFIED="1715951087411" STYLE="bubble" TEXT="Sprachentwicklung" VSHIFT="-20">
|
||||
<edge STYLE="bezier"/>
|
||||
<linktarget COLOR="#f7ea73" DESTINATION="ID_1419420745" ENDARROW="Default" ENDINCLINATION="-210;-20;" ID="Arrow_ID_1136673816" SOURCE="ID_801743732" STARTARROW="None" STARTINCLINATION="-54;206;"/>
|
||||
<linktarget COLOR="#f7ea73" DESTINATION="ID_1419420745" ENDARROW="Default" ENDINCLINATION="-60;-6;" ID="Arrow_ID_1884299333" SOURCE="ID_1445939705" STARTARROW="None" STARTINCLINATION="-61;-2;"/>
|
||||
<linktarget COLOR="#f7ea73" DESTINATION="ID_1419420745" ENDARROW="Default" ENDINCLINATION="-98;-10;" ID="Arrow_ID_1136673816" SOURCE="ID_801743732" STARTARROW="None" STARTINCLINATION="-77;189;"/>
|
||||
<linktarget COLOR="#f7ea73" DESTINATION="ID_1419420745" ENDARROW="Default" ENDINCLINATION="-60;-6;" ID="Arrow_ID_1884299333" SOURCE="ID_1445939705" STARTARROW="None" STARTINCLINATION="-79;10;"/>
|
||||
<font BOLD="true" NAME="SansSerif" SIZE="14"/>
|
||||
<node CREATED="1715854555555" ID="ID_281894196" MODIFIED="1715874441145" TEXT="A">
|
||||
<node CREATED="1715854555555" ID="ID_412915613" MODIFIED="1715950991986" TEXT="�� Lambda">
|
||||
<edge WIDTH="thin"/>
|
||||
<linktarget COLOR="#4a5b8a" DESTINATION="ID_281894196" ENDARROW="Default" ENDINCLINATION="-21;-21;" ID="Arrow_ID_1214785333" SOURCE="ID_1346486921" STARTARROW="Default" STARTINCLINATION="11;18;"/>
|
||||
<linktarget COLOR="#4a5b8a" DESTINATION="ID_412915613" ENDARROW="Default" ENDINCLINATION="36;-8;" ID="Arrow_ID_1620887574" SOURCE="ID_1346486921" STARTARROW="Default" STARTINCLINATION="71;25;"/>
|
||||
</node>
|
||||
<node CREATED="1715854555555" ID="ID_532331726" MODIFIED="1715874443497" TEXT="B">
|
||||
<node CREATED="1715854555555" ID="ID_1235760559" MODIFIED="1715950984714" TEXT="�� RValues">
|
||||
<edge WIDTH="thin"/>
|
||||
<linktarget COLOR="#4a5b8a" DESTINATION="ID_1235760559" ENDARROW="Default" ENDINCLINATION="36;-8;" ID="Arrow_ID_1545377655" SOURCE="ID_1063464796" STARTARROW="Default" STARTINCLINATION="71;25;"/>
|
||||
</node>
|
||||
<node CREATED="1715854555555" ID="ID_281894196" MODIFIED="1715950904958" TEXT="�� Concepts">
|
||||
<edge WIDTH="thin"/>
|
||||
<linktarget COLOR="#4a5b8a" DESTINATION="ID_281894196" ENDARROW="Default" ENDINCLINATION="36;-8;" ID="Arrow_ID_1565931733" SOURCE="ID_1285107340" STARTARROW="Default" STARTINCLINATION="71;25;"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1715854555555" ID="ID_1220340928" MODIFIED="1715874556738" TEXT="Geschichte">
|
||||
<node CREATED="1715854555555" ID="ID_1220340928" MODIFIED="1715951043331" TEXT="Herkunft">
|
||||
<edge WIDTH="1"/>
|
||||
</node>
|
||||
<node CREATED="1715951023590" ID="ID_1737194994" MODIFIED="1715951036330" TEXT="Charakter"/>
|
||||
<node CREATED="1715951020079" ID="ID_127307611" MODIFIED="1715951022878" TEXT="Gepflogenheiten"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1715854555555" HGAP="74" ID="ID_771205809" MODIFIED="1715874309904" POSITION="right" TEXT="Reflexion" VSHIFT="-44">
|
||||
|
|
|
|||
|
|
@ -7,4 +7,111 @@ Konzept für einen Vortrag
|
|||
Alt werden mit C++
|
||||
------------------
|
||||
|
||||
Langlebige Software.
|
||||
Software lebt solange sie änderbar ist.
|
||||
OpenSource-Software muß von sich aus am Leben bleiben.
|
||||
|
||||
Projekt Lumiera als Beispiel für ein ambitioniertes Projekt, das auf Langlebigkeit abstellt.
|
||||
|
||||
Entscheidung für eine Plattform ist im Kern eine Entscheidung für ein Ökosystem.
|
||||
Ein langlebiges Projekt muß auf Autonomie und Handlungsfähigkeit achten.
|
||||
Daher scheiden die meisten zunächst offensichtlichen und beliebten Plattformen aus.
|
||||
|
||||
Für Lumiera hat man sich damals für C++ in einem Unix-Umfeld entschieden.
|
||||
Realistische andere Optionen wären noch gewesen: D, Java, plain-C, Haskell.
|
||||
Einmal getroffen, ist eine solche Entscheidung mehr oder weniger endgültig.
|
||||
Denn jede der großen Programmiersprachen steht auch für eine bestimmte
|
||||
Denkhaltung und Herangehensweise.
|
||||
|
||||
Der Charakter jeder Sprache, und die damit verbundenen Methoden entwickeln sich weiter.
|
||||
|
||||
|
||||
Nachfolgend sei dies am Beispiel der Erfahrungen im Projekt Lumiera mit der Sprache C++
|
||||
nachgezeichnet, exemplarisch anhand zentraler Entwicklungslinien.
|
||||
|
||||
|
||||
Software bleibt nur änderbar, wenn sie mit den beschränkten menschlichen Fähigkeiten
|
||||
im Einklang ist. Das gilt, sofern Software von Menschen und für Menschen gebaut wird.
|
||||
Die wichtigste Beschränkung liegt dabei in der Fähigkeit, die Folgen von Änderungen
|
||||
zu verstehen und zu beherrschen. Das wird ermöglicht durch den sachgemäßen Ansatz
|
||||
von Abstraktionen.
|
||||
|
||||
Durch einen Interface-Kontrakt wird die Implementierung zum Detail, und damit lokal
|
||||
änderbar. Sprachmittel: Vererbung. Tendentiell problematisch, aber gut verstanden
|
||||
und weitgehend stabil. Tendenz: zunehmende Betonung von Modularität in Kontrakten,
|
||||
realisiert als Mix-in
|
||||
|
||||
Schwachstelle von Kontrakten: man muß das Verhalten festlegen. Damit dringt man in
|
||||
die Implementierung ein und braucht entsprechende Ausdrucksmittel. Der vorherrschende
|
||||
Ansatz hierfür war in den letzten 20 Jahren die Trennung von Infrastruktur und Funktionalität.
|
||||
Ein Stück Funktionalität wird zu einem abstrakten Element, das in einen Kontrakt eingebunden
|
||||
werden kann.
|
||||
|
||||
Die Sprachmittel in C++ waren dafür wenig geeignet und problematisch: im Grunde haben wir
|
||||
bis heute nur Funktions-Pointer. Jedoch hat C++ durch seine Klassen und das Typsystem eine
|
||||
ausgeprägte Stärke im Bauen neuer Abstraktionen. Die Boost-Libraries haben daraus ein neues
|
||||
Sprachmittel geschaffen: Funktions-Objekte.
|
||||
|
||||
In der Praxis war der Weg dorthin mühsam und erforderte viele work-arounds. Das führt dazu,
|
||||
daß im bestehenden Code eine Menge von Hilfsmitteln entsteht, die aufeinander aufbauen und
|
||||
weithin im Einsatz sind. Und dann kam C++11 mit einem neuen Sprachmittel: den Lambda-Ausdrücken.
|
||||
Diese stehen gleichberechtigt neben den Funktionsobjekten.
|
||||
Unterschiede Funktions-Objekt vs Lambda.
|
||||
|
||||
Die Entkopplung von Infrastruktur und Funktionalität führt dazu, daß zunehmend auch die
|
||||
Operationen von den Daten entkoppelt werden müssen. Ein Funktions-Objekt, das gut per Kontrakt
|
||||
in eine Infrastruktur eingebunden ist, könnte viele weitere Anwendungen abdecken, wenn man es
|
||||
von den konkreten Argument-Daten abstrahieren könnte. So entsteht die Forderung nach Funktionen
|
||||
auf generischen Argumenten.
|
||||
|
||||
Auch hierfür waren die vorhandenen Sprachmittel unzulänglich, und ziemlich clevere Tricks kamen
|
||||
flächendeckend zum Einsatz: vor allem die partielle Spezialisierung von Templates.
|
||||
Draus entsteht in einer größeren Code-Basis eine interne Binding-Schicht, die erhebliche
|
||||
Probleme bei der Wartung aufwirft.
|
||||
|
||||
Währenddessen entwickelte sich die Sprache weiter. Mithilfe der RValue-References wurde das
|
||||
transparente Durchreichen von Argumenten möglich. Die hierfür notwendigen semantischen Anpassungen
|
||||
sind subtil und tückisch. Eine schrittweise Umstellung einer großen Codebasis ist ein langlaufender
|
||||
Vorgang und eine organisatorische Herausforderung.
|
||||
|
||||
Oft muß man aber Argumente nicht nur durchreichen, sondern eine generische Funktion muß
|
||||
Eigenschaften ihrer Argumente verstehen und sich daran anpassen können. In den meisten älteren
|
||||
Programmiersprachen scheitert an dieser Forderung die gesamte Weiterentwicklung in Richtung einer
|
||||
Funktions-Abstraktion. Zum Glück (oder leider) galt das nicht für C++, denn während der Standardisierung
|
||||
der Sprache sind einige Design-Unfälle passiert, deren anfangs gar nicht intendiertes Verhalten in
|
||||
den Compilern dazu verwendet werden konnte, diese »Schallmauer« zu durchbrechen. Gemeint ist die
|
||||
Template-Metaprogamierung, eine Art »schwarze Magie«, mit der man eine funktionale Hilfs-Sprache
|
||||
während dem Compilier-Prozess ausführen lassen kann.
|
||||
|
||||
Warum läßt man sich auf schwarze Magie ein? Antwort: weil man dadurch mächtiger wird.
|
||||
Die Sprachmittel werden ausdrucksstärker. Mit wenigen Zeilen Code kann man eine komplexe
|
||||
Funktionalität zuverlässig und sicher realisieren. Dadurch gewinnt man Zeit, über die eigentlichen
|
||||
Anforderungen nachzudenken. Man geht damit aber technische Schulden ein: der Umgang mit der
|
||||
Codebasis erfordert vertiefte Kenntnisse, und einen mathematisch-geprägten Denkstil.
|
||||
|
||||
Trotzdem war diese Entwicklung derart enorm erfolgreich, daß das C++ - Komittee ihr
|
||||
gefolgt ist, und die Aufgabe angenommen hat, die historisch gewachsene schwarze Magie in
|
||||
klar definierte und sauber verwendbare Sprachmittel inkrementell weiter zu entwickeln.
|
||||
|
||||
- Varidadics
|
||||
- Concepts
|
||||
|
||||
Wenn man diese Aufgabe ernst nimmt, darf man sich nicht damit begnügen, einen pragmatischen Gebrauch
|
||||
zu codifizieren und syntaktisch nett zu verpacken. Vielmehr sind neue Sprachmittel gefordert, die
|
||||
sich zwar in den Stil der Sprache nahtlos einfügen, und auch das gleiche leisten wie die pragmatisch
|
||||
gewachsene Lösung, aber dennoch auf einer neuen Basis stehen, klar definiert und leichter korrekt
|
||||
verwendbar sind. Das ist eine sehr anspruchsvolle Aufgabe; das Ergebnis ist erstaunlich, hat aber
|
||||
auch sehr lange gedauert und ist in einigen Teilaspekten immer noch unfertig.
|
||||
|
||||
Das bedeutet: man muß lange Zeit mit einer Mischung aus magischen Lösungen und der neuen
|
||||
Standard-Lösung leben. Beide koexistieren, sind aber untereinander nicht kompatibel, obgleich
|
||||
sie beide den gleichen Zweck erfüllen. Das erzeugt eine schwierige Situation in einer großen
|
||||
Codebasis: zusammenhängende Systeme ziehen sich über weite Strecken durch den Code, und
|
||||
stützen sich jeweils auf eine Menge von Hilfsmitteln ab, die untereinander nicht austauschbar
|
||||
sind.
|
||||
|
||||
Beispiele
|
||||
- Loki-Typlisten vs. Variadic Arguments
|
||||
- Type-Traits vs. Concepts
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue