2011-09-06 digital life Hintergrundwissen Auf Fels gebaut Verstehen passiert nicht an der Oberflaeche sondern an der Basis. Wenn man verstehen will, dann muss man Grundlagen und Hinter- gruende lernen, nicht die aeussere Form und Anwendung. Verstehen bedeutet dabei nicht etwas nachvollziehen oder wiederholen zu koennen, sondern es durchdrungen zu haben, es selbst neu entwick- eln zu koennen und das Wissen weitergeben zu koennen. Gestern habe ich im Quellcode von ed(1) gelesen. Nicht in einer der modernen Varianten, sondern im traditionellen Code der Heir- loom Version. Das `l' (list) Kommando druckt in ed Text so aus, dass nicht-druckbare Zeichen sichtbar gemacht werden. Es werden also Ersatzdarstellungen ausgegeben. Beim traditionellen ed sind das dreistellige Oktalescapes, z.B. `\007' fuer das Klingel- zeichen. Zwei Zeichen werden jedoch gesondert behandelt: Back- space und Tab. Dazu folgende Editiersession: (`^G' steht fuer die Eingabe eines Klingelzeichens; `^I' fuer die Eingabe eines Tabs.) $ ed a x^Gy^Iz . p xy z l x\007y>z Q $ Zur Erklaerung: Zuerst wird ed gestartet. Die folgenden drei Zeilen erzeugen eine Textzeile, bestehend aus: `x', Klingel- zeichen, `y', Tab, `z' (und dem abschliessenden Newline, fuer die Pedantischen). Dann wird mit dem `p' (print) KOmmando die Zeile ausgegeben. Dabei wird das Klingelzeichen nicht gedruckt (es ist nicht-druckbar), aber der Rechner piept. Das Tabzeichen erzeugt einen Vorschub bis zum naechsten Tabstopp, der in Spalte 9 liegt. Dann das `l' (list) Kommando: Das Klingelzeichen wird schoen als Oktalescape ausgegeben, der Tab dagegen als Groesser-als-Symbol. (Zum Schluss wird ed beendet und der Shellprompt kehrt zurueck.) Es erscheint seltsam, dass der Tab als Groesser-als-Zeichen aus- gegeben wird. Das Backspace-Zeichen (^H) wird als Kleiner-als- Zeichen dargestellt. Auch wenn `>' und `<' sprechender sind als `\011' und `\010', so tragen sie dennoch nicht zur gewuenschten Eindeutigkeit der Listingausgabe bei. Schaut man in den Quellcode, dann wird's noch seltsamer. Es wird naemlich nicht einfach ein Groesser-als statt einem Tab ausgege- ben, sondern `-', gefolgt von Backspace, gefolgt von `>'. Dass im anderen Fall aus Backspace die Dreierfolge `-', Backspace, `<' wird mag weniger fremd erscheinen, das lenkt aber nur ab. Wieso werden Zeichen ausgegeben die nacher doch nicht erscheinen? Ich sass da, starrte in den Quellcode und in die od(1)-Ausgabe des von ed Erzeugten und gruebelte. Ich war schon dabei eine Mail an Gunnar Ritter zu schreiben, als mir nroff einfiel. Warum fuehrt man eine Aktion durch die das Ergebnis (scheinbar) nicht veraendert? Um Seiteneffekte zu erzeugen! Wann man sich mit nroff beschaeftigt, dann hat man sicher von Overstriking (z.B. \o'O/') gelesen. Genau darum geht es hier. Dass ich zu der Erkenntnis so lange gebraucht habe, hat den gleichen Grund weshalb dieser Code in allen neuen ed-Versionen ersetzt worden ist: Zeilendrucker sind schon lange nicht mehr gaengig. Nur bei denen macht das aber Sinn. Die koennen naem- lich bereits gedruckte Zeichen nicht wieder entfernen. Ein Back- space sorgt also dafuer, dass das naechste Zeichen an die Stelle des vorhergehenden gedruckt wird. Aus der Folge `-', Backspace, `>' wird also ein Pfeil nach rechts. Damit entsteht ploetzlich eine Eindeutigkeit in der Darstellung die bei Videoterminals fehlt. Jetzt ist klar weshalb man Tab und Backspace nicht als `\011' bzw. `\010' darstellen wollte: Der Pfeil ist aussagekraef- tiger (und dennoch eindeutig). Fuer die die Zeilendrucker nicht kennen macht dieses Konstrukt erstmal wenig Sinn. Nun, ich selbst hatte Probleme es zu ver- stehen, dabei bin ich eigentlich der Meinung, dass ich (verhaelt- nismaessig eben!) viel ueber das fruehe Unix weiss. Es gibt halt noch viel zu lernen. Entscheidend ist aber, dass ich es richtig lerne. So wie heute, indem ich die Materie selbststaendig durchdringe. Haette mir Gunnar die Frage einfach beantwortet, dann bliebe kein Gefuehl des Erfolgs zurueck. Dann wuerde diese Erkenntnis kein Fels in meiner Wissensbasis werden. http://marmaro.de/apov/ markus schnalke