Die Entwurfskomplexität einer virtuellen Maschine hängt davon ab, wie viele Arten von Vorgängen sie ausführen kann. Es ist einfacher, vier Implementierungen eines Befehls wie "Multiplizieren" zu haben - jeweils eine für 32-Bit-Ganzzahl, 64-Bit-Ganzzahl, 32-Bit-Gleitkomma und 64-Bit-Gleitkomma - als zusätzlich zu den oben genannten auch Versionen für die kleineren numerischen Typen. Eine interessantere Entwurfsfrage ist, warum es vier Typen geben sollte, anstatt weniger (alle Ganzzahlberechnungen mit 64-Bit-Ganzzahlen durchführen und / oder alle Gleitkommaberechnungen mit 64-Bit-Gleitkommawerten durchführen). Der Grund für die Verwendung von 32-Bit-Ganzzahlen besteht darin, dass Java auf vielen Plattformen ausgeführt werden sollte, auf denen 32-Bit-Typen genauso schnell wie 16-Bit- oder 8-Bit-Typen verarbeitet werden können, Operationen mit 64-Bit-Typen jedoch spürbar sind Langsamer.nur mit 32-Bit-Typen.
Bei der Durchführung von Gleitkommaberechnungen mit 32-Bit-Werten liegen die Vorteile etwas weniger auf der Hand. Es gibt einige Plattformen, auf denen eine Berechnung gefälltfloat a=b+c+d;
Dies kann am schnellsten durchgeführt werden, indem alle Operanden in einen Typ mit höherer Genauigkeit konvertiert, hinzugefügt und das Ergebnis dann zur Speicherung wieder in eine 32-Bit-Gleitkommazahl konvertiert werden. Es gibt andere Plattformen, auf denen es effizienter wäre, alle Berechnungen mit 32-Bit-Gleitkommawerten durchzuführen. Die Entwickler von Java entschieden, dass alle Plattformen die gleichen Schritte ausführen sollten und dass sie die Hardwareplattformen bevorzugen sollten, für die 32-Bit-Gleitkommaberechnungen schneller sind als längere, obwohl dieser PC sowohl die Geschwindigkeit stark verschlechterte und Präzision der Gleitkomma-Mathematik auf einem typischen PC sowie auf vielen Maschinen ohne Gleitkommaeinheiten. Beachten Sie übrigens, dass abhängig von den Werten von b, c und d Zwischenberechnungen mit höherer Genauigkeit verwendet werden, wenn Ausdrücke wie die oben genannten berechnet werdenfloat a=b+c+d;
liefert manchmal Ergebnisse, die wesentlich genauer sind, als dies bei allen Zwischenoperanden der Fall wäre, die mit float
Genauigkeit berechnet wurden , liefert aber manchmal einen Wert, der ein wenig weniger genau ist. In jedem Fall entschied Sun, dass alles auf die gleiche Weise erfolgen sollte, und entschied sich für die Verwendung von float
Werten mit minimaler Genauigkeit .
Beachten Sie, dass die Hauptvorteile kleinerer Datentypen offensichtlich werden, wenn eine große Anzahl von ihnen zusammen in einem Array gespeichert wird. Selbst wenn es keinen Vorteil hätte, einzelne Variablen von Typen zu haben, die kleiner als 64 Bit sind, lohnt es sich, Arrays zu haben, die kleinere Werte kompakter speichern können. Wenn eine lokale Variable eher eine byte
als eine ist, werden long
sieben Bytes gespeichert. Ein Array mit 1.000.000 Nummern enthält jede Nummer als a byte
und nicht alslong
Wellen 7.000.000 Bytes. Da jeder Array-Typ nur wenige Vorgänge unterstützen muss (insbesondere ein Element lesen, ein Element speichern, einen Bereich von Elementen innerhalb eines Arrays kopieren oder einen Bereich von Elementen von einem Array in ein anderes kopieren), erhöht sich die Komplexität, mehr zu haben Array-Typen sind nicht so schwerwiegend wie die Komplexität, mehr Typen direkt verwendbarer diskreter numerischer Werte zu haben.