Mit Flag [flæg] (auf Deutsch etwa Markierung; in SPSen auch „Merker“) wird ein Statusindikator bezeichnet, der als Hilfsmittel zur Kennzeichnung bestimmter Zustände benutzt werden kann. Ein Flag kann gesetzt, gelöscht oder geprüft werden.
Etymologie
Der englische Begriff Flag ist verwandt mit deutsch Flagge, sollte jedoch nie so übersetzt werden. In der englischen Sprache hat sich eine erweiterte Begriffsbedeutung herausgebildet, bei der to flag nicht nur Flagge zeigen, setzen, hochziehen bedeutet, sondern allgemeiner signalisieren und heranwinken meint (to flag down a taxi, ein Taxi heranwinken). Dies geht vermutlich auf den Brauch in den ländlichen Gebieten der USA zurück, am Briefkasten an der (vom Haus entfernten) Grundstückszufahrt eine kleine (rote) Flagge anzubringen, die hochgedrückt wird, wenn für den Postboten Post zum Versenden eingelegt wurde. Statt des umständlicheren Begriffs der binären Semaphore für solche Signalisierungseinrichtungen verbreitete sich der Begriff Flag – die Flaggenform und Bezeichnung als (binäre) Semaphore geht auf die optische Telegrafie und das Winkeralphabet zurück.
Abgrenzung
- Häufig wird eine Boolesche Variable verwendet, um ein Flag zu repräsentieren. Mit Variablen kann jedoch gerechnet werden, und eine Boolesche Variable kann den Wert „falsch“ beinhalten. Ein Flag jedoch kennt die Zustände „ist gesetzt“ oder „ist nicht gesetzt“ (im Sinne von „ist gar nicht da“). Eine Boolesche Variable ist hingegen durchaus da/deklariert, auch wenn sie auf „falsch“ gesetzt ist.
- Müssen mehr als zwei Zustände beschrieben werden, so wird ein Aufzählungstyp verwendet.
- Ist lediglich ein erstmaliges Setzen eines Flags relevant (es soll später also nicht wieder gelöscht werden können), so ähnelt ein Flag einem Symbol.
Flags im Prozessor
Ein Flag kennzeichnet zum Beispiel bei arithmetischen Berechnungen den Übertrag (Carry-Flag) oder den Überlauf (Overflow-Flag), siehe auch Statusregister.
Flags in der Programmierung
In der Programmierung können Flags zum Beispiel das Vorliegen einer Fehlerbedingung in einem Segment an ein anderes Programmsegment übermitteln oder Nutzerrechte realisieren.
Welches Datenformat zur Repräsentation eines Flags verwendet wird, hängt dabei von der Implementierung ab: Dabei lässt sich ein Flag in vielen Programmiersprachen über eine Boolesche Variable realisieren. Meist werden die binären Werte 0 und 1 oder für den Menschen verständlichere Varianten wie „Gesetzt“ und „Nicht gesetzt“ verwendet.
Sollen mehr als zwei Zustände dargestellt werden, wird dies meist nicht als „Flag“, sondern als Statusvariable/‑konstante bezeichnet. Aus der englischen Sprache findet sich in der Programmierung für synchronisierende Statusvariablen auch der Begriff (binäre) Semaphore bzw. Mutex locks.
Präprozessor-Flag
Mitunter werden Merker auch für bedingte Kompilierung eines Quellcodes verwendet; sehr gebräuchlich ist dies vor allem in den Sprachen C und C++:
#define COMPILE_FLAG
// ...
#ifdef COMPILE_FLAG
// Code-Block 1, der ins Programm einfliesst, wenn COMPILE_FLAG gefunden wird.
#else
// Code-Block 2, der stattdessen einfliesst, wenn COMPILE_FLAG _nicht_ gefunden wird.
#endif
Flags in der Datenübertragung
Bei der Übertragung von Daten ist mitunter eine Signalisierung bestimmter Zustände oder Signaleigenschaften notwendig. Anstatt gesonderter Leitungen können bestimmte Bitmuster eingesetzt werden, die dann „Zustands-Flags“ sind. Insbesondere verbreitet ist die Datenpräambel, um den Beginn einer Übertragung zu signalisieren und dem Empfänger eine Synchronisierung zu ermöglichen, sowie das Start- und das Stoppbit.
Durch geeignete Kodierung der zu übertragenden Daten kann es Bitmuster geben, die im Nutzdatenstrom nicht vorkommen können. Statt zur Fehlererkennung/‑korrektur können diese als Steuersignale verwendet werden.