Gast
#4536313
Ich versuche gerade, das copy-on-write-Konzept für eine einfache
Skriptsprache umzusetzen.
Die Idee dahinter ist ja, wenn ich z.B. ein großes Array habe
A=[1...1000000]
und nun B als Kopie von A erzeuge:
B=A
dann wird in B zunächst nur eine Referenz zu A gespeichert.
Erst wenn ich B modifiziere, z.B.
B[42]=999
dann erstellt B eine "echte" Kopie von A und ändert dort Element #42.
Ich stehe nun auf dem Schlauch, wie das bei verschachtelten Strukturen
(ähnlich JSON Objekten) funktioniert. Sagen wir, ich habe eine Struktur
S={x: 42}
Nun setze ich
S.x=S
Das Ergebnis sollte dann sein:
S={x: {x: 42}}
Tatsächlich würde das copy-on-write-Konzept aber nahelegen, folgendes
Ergebnis zu erzeugen:
S={x: S}
Dies ist eine unbrauchbare endlose Rekursion.
Woran kann der Interpreter erkennen, dass er in diesem Fall für S.x eine
echte Kopie von S erstellen muss? S enthält nach S={x:42} seine eigenen
Daten, keine Referenz, und muss daher eigentlich keine Kopie erzeugen,
wenn eins seiner Elemente überschrieben wird.
Von daher sehe ich kein direktes Kriterium, wonach der Interpreter
entscheiden kann, dass er im Schritt S.x=S eine neue Kopie erstellen
muss.
Ist das Problem verständlich?