Bernd Leitenbergers Blog

Am Anfang war das Wort

Hans lieferte mir den Aufhänger für den heutigen Artikel, der sich auch mit Prozessorarchitekturen beschäftigt. Nämlich die Frage wie man 16 Bits in der Informationstechnik bezeichnet. Schon mal der Ansatz wie Hans diese Frage löst ist interessant. Ich würde in Google Books nachschauen oder in meinem Bücherregal. Hans stellt die Frage in einem Forum, was angesichts einer Generation die mit der x86 Architektur aufgewachsenen ist und vielen Softwerkern, die meinen die Bezeichnungen in ihrer Programmiersprache wären Standardausdrücke, in etwa so ist als wenn man auf einem mittelalterlichen Markt fragt „Ist die rothaarige Frau eine Hexe?„.

Also welche standardisierten Ausdrücke gibt es in der Informationstechnik? Nun als erstes gibt es mal das Bit. Ein Bit ist die kleinste Einheit, die gespeichert werden kann. Bei den meisten Computern ist es aber nicht die kleinste Einheit die sie ansprechen können, außer sie haben Bitmanipulationsbefehle. Doch Speicherbausteine waren sehr lange bitweise organisiert. Früher war das sogar noch zu sehen. Bei Ringkernspeichern entsprach das genau einem Eisenkern. Die bitweise Organisation sieht man heute noch manchmal in den Anzahl der Speicherbausteine auf DIMMs, auch wenn es hier noch die Organisation in 4 und 16 Bit Einheiten gibt die gängiger ist, weil man so weniger Chips braucht. (16 oder 4 für die heutigen DIMM die 64 Bit Datenbusse haben anstatt 64 Stück).

Schon bei den beiden nächsten begriffen, dem Byte und Nibble hört die Standardisierung auf. Unter einem Byte versteht man heute 8 Bit. Doch dem war nicht immer so. Als Byte versteht man die Anzahl der Bits die man braucht um ein Zeichen in dem Zeichensatz des Computers abzulegen. Jeder Wert steht für einen Charaktercode. Der erste Standard der sich einbürgerte, kam vom American Standards Association es war der American Standard Code for Information Interchange (ASCII). Er hatte den Zweck die vorher unterschiedlichen Zeichensätze bei verschiedenen Computern zu vereinheitlichen. Wie der Name sagte, war es ein Zeichensatz für die USA. (eigentlich nach dem Wortlaut Amerika, doch spanisch sprechende Länder die Accents brauchen ignorierte der Standard). Er enthielt in den ersten 32 Positionen keine druckbaren Zeichen sondern Steuerzeichen, die bei einem Drucker oder Fernschreiber Aktionen auslösten oder in bestimmten Programmiersprachen zweckentfremdet als Stringende (Nullzeichen) genutzt wurden. Bis heute wichtig sind Tabulator (9), Zeilenvorschub (Carriage Return – cr) (13) und Wagenrücklauf (line feed lf) (10). In Windows wird jede Zeile von Wagenrücklauf und Linefeed abgeschlossen. Das Zeilenendzeichen in Unix ist es nur der Zeilenvorschub. Das hat historische Gründe, Windows übernahm das von DOS und dieses die Codierung von CP/M die sie für die damals noch üblichen Typenraddrucker einführte. Bei Unix hat man sich wohl gedacht das ein Zeichen genügt. Das ist bis heute so, so werden beim Kopieren von Winscp meine Pascal Quelltexte auf dem Raspberry Pi kleiner – das Programm ersetzt cr/lf durch Lf.

Seit etwa der siebziger Jahre sind daher 8 Bit die Standardgröße für ein Byte. Für ASCII braucht man eigentlich nur 7 Bit, doch da Computerarchitekturen meist ein Vielfaches von geraden Bitanzahlen verarbeiten, hat man das Byte auf 8 Bit gesetzt. Bei ASCII-Codes sind die Codes von 128 bis 255 daher nicht definierte und man nutzte sie für Erweiterungen. So z. B. die Umlaute die man in den USA nicht kennt oder Blockgrafikzeichen. Diese waren dann von Computer zu Computer unterschiedlich. So gab es in den Achtziger Jahren eigene Drucker für den Apple, C64, den IBM PC oder für andere populäre Computer die sich nur im Zeichensatz unterschieden.

Die 8 Bit breite Byte gilt in etwa seit Anfang der siebziger Jahre als die US-Regierung aktiv die Anschaffung von Computern förderte die den ASCII-Zeichensatz unterstützten. Den vorher war es so das jeder Hersteller seine eigene Codierung hatte und die meisten waren auch nicht 8 Bits lang sondern nur 6, Das reicht nur für 64 Zeichen. 26 Groß- und Kleinbuchstaben und 10 Ziffern ergeben zwar 62 Codierungen, doch man braucht ja noch einige andere Zeichen wie Satzzeichen, Klammern, Leertaste, mathematische Operationen und Steuerzeichen. So hatten diese 6 Bit Codierungen keine Kleinbuchstaben. Das sieht man in zahlreichen frühen Programmiersprachen wo Befehle nur in Großbuchstaben stehen wie Fortran oder Cobol.

IBM nutzte z.b. EBCDIC, ein Zeichensatz den es in sechs verschiedenen Versionen von 6 bis 8 Bits Breite gibt. Andere Hersteller hatten andere Codierungen so CDC in den ersten Modellen von Cray. Die Dominanz von 6 Bits in der frühen Computertechnik zeigt sich auch in Architekturen die ein Vielfaches von 6 Bits waren wie 12 Bit, 18 Bit und 30 Bit Rechner bei PDP (PDP-7, PDP-9 und PDP-10). Es gab auch 24, 48,36 und 60 Bit Rechner. Die Einführung der Oktalschreibweise in C, die man heute kaum noch braucht, drückt sich auch darin aus dass 3 Bit mit den Ziffern von 0 bis 7 ausgedrückt werden können. Das leitet über zum Nibble. Ein Nibble ist per Definition ein halbes Byte. Damit ist es auch nicht konstant groß, sondern war früher 3 Bits breit (Oktalnotation) heute dagegen 4 Bit breite Da man die 16 Zustände der 4 Bits nun nicht mehr mit den Zahlen von 0 bis 9 ausdrücken kann schreibt man heute Nibbles in Hexadezimalschreibweise auf der Basis von 16, wobei man die Buchstaben A bis F für sei werte von 10 bis 15 nimmt.

Also Bytes und Nibbles sind nicht standardisiert. Daher hat man als Standard auch einen anderen Begriff für das 8 Bit Byte gewählt: Oktett. Wer Standards z.B. für Internet Protokolle durchliest, wird diesen Begriff öfters lesen. Die Franzosen wird es auch freuen, denn die haben schon in den Achtzigern per Deklaration das Byte im Sprachgebrauch durch das Oktett ersetzt. Man hat ja dort eine Abneigung gegen Fremdwörter und will die Sprache französisch „rein“ halten.

Das einzige was nach dem Bit und Oktett standardisiert ist das Wort, bzw. Vielfache davon Doppelwort, Quadwort. Ein Wort entspricht der Bitanzahl der Architektur des Computers. Wenn man von der heutigen x86-Architektur, die den Speicher byteweise anspricht, den Blick auf andere CPU-Architekturen schweifen lässt, dann herrschte früher die wortweise Adressierung vor. Das war nur logisch: Der Datenbus war wortweise organisiert und so lud man immer ein Wort ein. Als Nebeneffekt hatte man so bei mehr als 8 Bits in der Architekt auch mehr Speicher. Die Cray 1 hatte in der Standardausführung z.B. einen Speicher von 1 MWorten was bei ihrer 64 Bit Architektur 8 Megabyte entspricht. RISC Prozessoren hatten, als sie einzogen, auch nur eine wortweise Adressierung bzw. Befehle zum wortweisen Verarbeiten von Daten. (ob dem heute noch bei den neuesten Exemplaren so ist weiß ich leider nicht).

Die nur wortweise Adressierung hat einige Vorteile. Der erste ist, dass man eine Menge Opcodes spart um Bytes oder andere Bruchteile eines Wortes als Operanden zu unterstützen. Das Verarbeiten von kürzeren Operanden macht nur in wenigen Fällen Sinn. Man muss z.b. drauf achten das die höherwertigen Bits von Registern nicht verändert werden, d.h. man kann nicht einfach die 8-bit-Operation durch eine wortweise Operation ersetzen. Sinn macht es nur bei Zeichenoperationen die früher eben immer 8 Bit umfassten (heute dank weiterer Standards auch 16 Bit). Früher waren Computer fast ausschließlich zum Rechnen da und Zeichenoperationen beschränkten sich meist auf die Ein/Ausgabe von Zeichenketten. So gab es in Crays Rechnern keine Operationen für 6 oder 8 Bits. Man packte eben einfach 10 bzw. 8 Zeichen in Wort und gab sie aus. Was man nicht brauchte, füllte man mit Nullbytes auf. Lediglich der Vergleich, den man mit dem Durchsuchen von Zeichenketten braucht, geht so nicht. Bei einigen 16-Bit Prozessorarchitekturen machte die byteweise Operationen einen Sinn wenn sie nur einen 8-Bit Datenbus hatten oder ihre ALU nur 8 Bit breit war, dann wurden die 16 Bit Operationen in zwei Durchgängen erledigt.

Die heutige Dominanz des Bytes und das man Worte oft als EDV-Begriff nicht (mehr) kennt, kommt daher das heute die x86 Architektur vorherrscht und die basiert auf der 8 Bit Architektur des 8080. Der 8086 hatte daher auch alle 8 Bit Verarbeitungsbefehle und adressierte wie der 8080 byteweise. Das war nicht bei allen damals neu erschienen Prozessoren. Der TMS 9900 adressierte z.B. nur 16 Bit weise (ganz durchdacht hatte man das Konzept aber nicht, denn der Adressbus war nur 15 Bit breit, sodass er in der Praxis auch nur 64 KByte ansprechen konnte). Andere Prozessoren wie der MC68000 hatten einen universelleren Ansatz und unterstützen byte, word und long word (so heißen in Motorola Nomenklatur 8, 16 und 32 Bit).

Ein zweiter Grund war die mit den ersten Personalcomputern entstandenen Anwendungen. Eine der ersten war Textverarbeitung. Sie erleichterte zuerst das Leben von Sekretärinnen und rationalisierte sie dann später weg. Texte zu verarbeiten bedeutet Zeichenketten zu verarbeiten und deren kleinste Einheit ist eben 8 Bit breit.
Was nicht standardisiert ist auch die Bezeichnung von Typen in Programmiersprachen. Im ursprünglichen C Standard steht z.B. nur die Reihenfolge der Typen, d.h. das ein int größer als ein short int ist. Der erste von Kerningham und Ritche für eine Fremdplattform (Honeywell 6000) übersetzte C-Compiler nutzte z.B. dort einen 6 Bit Code (die PDP-11 auf der C entwickelt wurde war eine 16 Bit Maschine mit 8 Bit Bytes), da dieser Rechner eine 36 Bit Architektur hatte. Alle Datentypen waren dort anders groß als auf der PDP-11. Wer schon in DOS Zeiten C programmierte wird auch noch wissen, das damals der Int auch nur 16 Bit breit war. Es wäre interessant zu wissen ob heute auf einem 64 Bit Compiler dann int 64 bits breit ist, bei 32 Bit Windows war er zumindest nur 32 Bit breit und 64 Bit waren dort ein long int. Ähnliches gibt es bei anderen Programmiersprachen. In Pascal ist der Typ Real auch nicht standardisiert. Turbo Pascal nutzte dafür 48 Bits, doch wenn man heute ein Programm mit Real als Datentyp schreibt wird man bald feststellen das es intern ein 64 Bit Wert ist – die 48 Bit Typen wurden durch Software berechnet und heute hat jeder Prozessor die Möglichkeit Fließkommazahlen in Hardware zu berechnen.

In jedem Falle sind die Bezeichnungen aus Programmiersprachen nicht standardisiert. Standardisiert sind die Bezeichnungen für Fließkommazahlen sowie ihr Aufbau und Genauigkeit in IEEE 754, doch deren Bezeichnungen wie „Binary64“ für den Typ Double (64 Bit Fließkommazahl) sind nicht allgemein üblich und Ganzzahlen hat IEEE leider nie standardisiert.

Wie bezeichnet man 16 Bits denn nun am besten? Also ich würde zu „16 Bit Wort“ greifen, schon alleine weil auch das Wort unterschiedlich groß sein kann (ich kenne Worte von 12 bis 64 Bit Größe).

Die mobile Version verlassen