2009-08-05 16 views
2

Ich stelle diese Frage, weil es nicht das erste Mal ist, dass ich diese Kodierungspraxis sehe, aber nie einen Kommentar über den Grund dafür sah: Ich habe die Quelle des Lua durchsucht und gesehen, dass sie 'Farben' verwenden (weiß, schwarz), um den Zustand eines Objekts zu beschreiben. Hier ist der Code von Kopf lgc.h:Verwenden von "Farbe", um den Flaggenstatus eines Objekts zu definieren?

/* 
** Layout for bit use in `marked' field: 
** bit 0 - object is white (type 0) 
** bit 1 - object is white (type 1) 
** bit 2 - object is black 
** bit 3 - for userdata: has been finalized 
** bit 3 - for tables: has weak keys 
** bit 4 - for tables: has weak values 
** bit 5 - object is fixed (should not be collected) 
** bit 6 - object is "super" fixed (only the main thread) 
*/ 

#define WHITE0BIT 0 
#define WHITE1BIT 1 
#define BLACKBIT 2 
#define FINALIZEDBIT 3 
#define KEYWEAKBIT 3 
#define VALUEWEAKBIT 4 
#define FIXEDBIT 5 
#define SFIXEDBIT 6 
#define WHITEBITS bit2mask(WHITE0BIT, WHITE1BIT) 

#define iswhite(x)  test2bits((x)->gch.marked, WHITE0BIT, WHITE1BIT) 
#define isblack(x)  testbit((x)->gch.marked, BLACKBIT) 
#define isgray(x) (!isblack(x) && !iswhite(x)) 

#define otherwhite(g) (g->currentwhite^WHITEBITS) 
#define isdead(g,v) ((v)->gch.marked & otherwhite(g) & WHITEBITS) 

#define changewhite(x) ((x)->gch.marked ^= WHITEBITS) 
#define gray2black(x) l_setbit((x)->gch.marked, BLACKBIT) 

#define valiswhite(x) (iscollectable(x) && iswhite(gcvalue(x))) 

ich schon etwas ähnliches in anderen Projekten gesehen (die verwendeten auch ‚rot‘), aber nie verstanden (noch gepflegt) was ist die begriffliche Verbindung zwischen Farbe und Objekten Zustand. Gibt es eine Art Konvention, die besagt, dass "weiß" "gut" und "schwarz", "schlecht" oder etwas Ähnliches bedeuten sollte? Weiß jemand, woher diese Praxis stammt?

+1

Möglicherweise haben Sie in einer Implementierung eines rot-schwarzen Baums "rot" gesehen. Die Farben dort sind nicht signifikant, außer dass die Diagramme respektabler aussehen, als wenn sie orange-pinke Bäume wären. –

Antwort

1

Könnte es seinen Ursprung in white-gray-black Tiefensuche haben? In dieser Version des Algorithmus sind weiße Scheitelpunkte nicht besucht, graue Scheitelpunkte wurden auf dem Weg durch den Baum besichtigt, und ein grauer Scheitelpunkt wird auf dem Weg zurück nach oben in Schwarz geändert.

Ich nehme von den Kommentaren an, dass dies etwas mit Garbage Collection zu tun hat?

+0

Ja, es ist der Speicherbereinigungsmechanismus. Ich werde ein Buch über Datenstrukturen/Algorithmen lesen. Aber was mir scheint, ist, dass die Farbassoziation aufgrund der Generik dieser Algorithmen intentativ unkritisch ist. Habe ich recht? – ogoid

1

Wenn Farben in dieser Art von Kontext verwendet werden, liegt dies normalerweise an der Implementierung eines Basisalgorithmus, der selbst in Bezug auf Farben definiert ist. Meredith erwähnte ein Beispiel dafür; ein anderer ist Red-Black Trees.

+0

Es gibt auch Rot-Grün-Schwarz-Mischungen (http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.4.1477), aber ich bin zuversichtlich, dass das nicht kommt, woher das kommt. :) –

1

Ich habe nicht den Lua-Quellcode vor mir, aber die Bitdefinitionsnamen scheinen bezogen auf garbage collection zu sein. Siehe den Abschnitt in der Wikipedia Eintrag auf dreifarbige Markierung.

Verwandte Themen