64-Bit-Architektur
Unter 64-Bit-Architektur versteht man in der EDV eine Prozessorarchitektur, deren Verarbeitungsbreite 64 Bit beträgt. Durch 64 Bit große Adressregister sind solche Prozessoren in der Lage, einzelnen Prozessen größere (nicht segmentierte) Adressräume als 4 GiB zur Verfügung zu stellen.
Einige Prozessoren unterstützen (aus Kompatibilitätsgründen) mehrere Architekturen, beispielsweise PowerPC, wo die Architektur selbst zwar auf 64-Bit basiert („ppc64“), Prozessoren der 1990er und frühen 2000er Jahre jedoch fast immer nur ein 32-Bit-Subset unterstützten („ppc“ oder, meist retronym: „ppc32“), oder auch die x86-Prozessoren der meisten (geschichtlich betrachtet IBM-kompatiblen) PCs. Die x86-Architektur wird maßgeblich von Intel und AMD entwickelt und beinhaltet sowohl eine 16-Bit-Architektur (seit dem Intel 8086, dessen Weiterentwicklungen „80x86“ wie 80186, 80286, 80386 usw. der Architektur den Namen geben), eine 32-Architektur (seit dem Intel 80386) als auch eine 64-Architektur (seit dem AMD Opteron). Die 64-Bit-x86-Architektur heißt „x64“ oder „x86-64“ (teils auch „amd64“), beinhaltet jedoch auch die 32-Bit-x86-Architektur „IA-32“ (retronym auch „x86-32“) und sogar die ursprüngliche 16-Bit-x86-Architektur, obwohl diese so gut wie keine Verwendung mehr findet. Als „x86S“ könnten zukünftige x86-Prozessoren jedoch komplett auf die 16- und 32-Bit-Architekturteile verzichten.
Analog dazu werden auch Betriebssysteme und Computerprogramme, die auf eine solche Architektur ausgelegt sind, mit dem Attribut 64-Bit versehen (z. B. „64-Bit-Betriebssystem“ oder „Windows 64-Bit“).[1]
Entwicklung
[Bearbeiten | Quelltext bearbeiten]Als IBM Ende der 60er Jahre den IBM System/360 Mainframe-Computer vorstellte, der eine 32-Bit-Architektur benutzte, begann die Entwicklung der 64-Bit-Architektur. Verschiedene 64-Bit-Systeme wurden in den kommenden Jahrzehnten entwickelt, doch erst in den 1990er Jahren begann die 64-Bit-Architektur tatsächlich an Relevanz zu zunehmen. Die Implementierung von 64-Bit-Computing-Prozessoren wie dem DEC Alpha und dem MIPS R4000 war ein bedeutender Fortschritt.[2]
Die weitere Entwicklung von 64-Bit-Architekturen wurde durch immer preiswerter herstellbaren Hauptspeicher vorangetrieben. Dies führte Anfang der 1990er Jahre zu 64-Bit-Architekturen im Serverbereich (MIPS 4000, DEC Alpha, SPARC64, HP PA-RISC, IBM Power 3, Intel Itanium bzw. IA-64), Anfang der 2000er Jahre im PC-/Workstation-Bereich (x64) und Anfang der 2010er Jahre selbst im Bereich von Smartphones (ARM64). Einige der älteren Architekturen hatten dabei schon vor der Entwicklung zur vollen 64-Bit-Architektur die Datenpfade immer weiter verbreitert, etwa der Pentium P5 (64-Bit-Datenbus, Befehle 8 bis 120 Bit lang) oder gar der Pentium 4 (hier sogar zwei 64-Bit-Datenbusse, über die im Allgemeinen 512-Bit-Worte transferiert werden).
Frühe Spezial-Architekturen von Supercomputern mit Busbreiten ab 64 Bit:
- 1961: die IBM 7030 Stretch mit 18-Bit-Adress- und 64-Bit-Datenbus und Unterstützung von Worten variabler Bitbreite[3]
- 1974: der CDC STAR-100 (Nachfolger der 60-Bit-Rechner der Control Data Corporation), ein Vektorrechner in Harvard-Architektur. Mittels 16-Bit-Adressbus können bis zu 65536 Superworte zu je 512 Bit über einem 512-Bit-Datenbus übertragen werden. Für Befehle gab es einen separaten 128-Bit-Bus.
- 1976: Cray-1, der erste 64-Bit-Vektorrechner, Vorläufer der Cray Supercomputerlinie: 24-Bit-Adressraum, 16 oder 32 Bit lange Befehle, 16 Datenbusse mit je 64 Bit
- 1983: Elxsi 6400 sogenannter „Minisupercomputer“ mit 64-Bit-Datenpfaden, 64-Bit-Ganzzahlregistern, aber 32-Bit-Adressraum, Unterstützung von Clustern von bis zu 12 CPUs.
64-Bit-Architekturen für Server in Universalprozessoren:
- 1991: von MIPS (später SGI) ab dem MIPS R4000 eine 64-Bit-MIPS-Architektur (32- und 64‑Bit)
- 1992: von DEC die Alpha-Prozessor-Serie
- 1995: von Sun Microsystems die SPARC-Architektur („UltraSPARC,“ 32- und 64‑Bit)
- 1995: von Hewlett-Packard die PA‑RISC-Serie (32- und 64‑Bit[4])
- 1997: von IBM die Power-Serie (32- und 64‑Bit)
- 1998: von Apple/IBM/Motorola (bzw. ab 2005 Freescale und ab 2015 NXP) die PowerPC-Serie (32- und 64‑Bit)
- 2000: von IBM die System‑z-Serie (vormals S/390)
- 2001: von Intel und Hewlett-Packard die Itanium-Architektur „IA‑64“
- 2005: von Fujitsu die SPARC64‑V-Architektur
64-Bit-Architekturen für Server, PCs, Tablets und Smartphones in Universalprozessoren:
- 2003: von Apple/IBM/Motorola (bzw. ab 2005 Freescale und ab 2015 NXP) die PowerPC-Serie (32- und 64‑Bit)
- 2003: von AMD/Intel x64, eine Befehlssatzerweiterung für die Familie der x86-Prozessoren (16- und 32‑Bit, mit x64 erweitert um 64‑Bit)
- 2013: von ARM Limited die Armv8-A-Architektur
Die Koprozessoren sind in ihrer Entwicklung jeweils durch die Datenpfade des Hauptprozessors beschränkt gewesen. Dabei hatte der Intel 8087 als erster mathematischer Koprozessor (FPU) des 16-Bit Intel 8086 sogar schon 80-Bit Register zur Verfügung. Die späteren Grafikprozessoren (GPU) optimierten für 3D-Berechnungen auf eine vierfach gepackte Darstellung der Matrizen, sodass sich diese zu 128-Bit und 256-Bit-Prozessoren entwickelten. Da sie keine eigenen Applikationen und Betriebssysteme mit dieser Bitbreite haben, handelt es sich nicht um volle Architekturen.
Hardware
[Bearbeiten | Quelltext bearbeiten]Die Architektur eines Prozessors sagt nichts darüber aus, wie einzelne Funktionen konkret im Chipdesign implementiert sind. So können einzelne Befehle im Innern weiterhin als 32-Bit-Operationen ausgeführt sein (so wie z. B. Verschiebebefehle in MIPS-R4000-Prozessoren).
Die konkrete Hardware von 64-Bit-Prozessoren ist wesentlich mehr durch das Prozessordesign der Jahre bestimmt, in denen sie eingeführt wurden. Dazu zählen
- meist Multicore-Systeme
- meist mehrere 64-Bit-Busse zum Hauptspeicher
- immer Super-Pipelined-Architektur
- meist Out-Of-Order-Ausführung, superskalare Ausführung
- meist Vektorbefehle ab 128 Bit Breite
- Gleitkommaeinheit, die zum Teil mehrere Dutzend Gleitkomma-Befehle pro Core gleichzeitig ausführen können
- umfangreiche Cache-Architekturen mit 2 bis 3, teilweise 4 Hierarchien
- Virtualisierungsmöglichkeiten für Speicher und teilweise I/O-Operationen
Der Mehraufwand für die Erweiterung einer 32-Bit-Architektur auf 64 Bit lag bei etwa 10 Prozent. Der 32-Bit-Prozessor Intel Core Duo Processor T2700[5] kam mit 151 Millionen Transistoren aus, der ansonsten weitgehend identische 64-Bit-Prozessor Intel Core2 Duo Processor E4300[5] benötigte 167 Millionen. Der Hintergrund ist, dass in den Prozessoren ohnehin schon fast alles 64 Bit oder breiter war und nur die allerletzten Komponenten auf 64 Bit erweitert werden mussten.
Die PowerPC-Architektur wurde von Anfang an als 64-Bit-Architektur entworfen, da sie von der ursprünglich aus dem Bereich der Großrechner stammenden Power-Architektur abgeleitet ist. Auch für die MIPS-Architektur wurde frühzeitig als 64-Bit-Architektur entworfen. In beiden Fällen erfolgte die Realisierung in Hardware allerdings erst einige Jahre später und anfangs wurde ein 32-Bit-Subset verwendet.
Software
[Bearbeiten | Quelltext bearbeiten]Kompatibilität
[Bearbeiten | Quelltext bearbeiten]Computerprogramme, die auf eine 64-Bit-Architektur ausgelegt sind, verwenden 64 Bits für die Adressierung des Arbeitsspeichers (bzw. ihres virtuellen Speichers) und sind daher nicht kompatibel zu einer Prozessorarchitektur mit einer niedrigeren Bitzahl (z. B. 32-Bit-Architektur). Nur mit Virtualisierungssoftware ist es unter 32-Bit-Betriebssystemen möglich, ganze 64-Bit-Betriebssysteme (virtualisiert) laufen zu lassen – vorausgesetzt der Prozessor bietet einen 64-Bit-Betriebsmodus.
Für einen sanften Übergang von 32- auf 64-Bit können einige 64-Bit-Prozessoren weiterhin auch 32-Bit-Code ausführen, teilweise (für den Übergang von 16- auf 32-Bit) sogar weiterhin 16-Bit-Code. Wird diese Fähigkeit auch durch ein 64-Bit-Betriebssystem (das prinzipiell zur Ausführung von 64-Bit-Programmen notwendig ist) unterstützt, so ist auch dieser ältere Code unter diesen Betriebssystemen (nativ) ausführbar. Dazu muss der Prozessor einen Modus für 32-Bit-Programme bieten, der innerhalb des 64-Bit-Ausführungsmodus funktioniert, und das Betriebssystem muss eine 32-Bit-Programmierschnittstelle enthalten (API; meist als Wrapper). Beispielsweise bieten x64-Prozessoren einen 32-Bit-x86-Kompatibilitätsmodus innerhalb des 64-Bit-Betriebsmodus. Auch der 64-Bit-PowerPC-Prozessor G5 kann weiterhin nativ 32-Bit-Code ausführen und ist somit zu den früheren 32-Bit-Prozessoren bis zum PowerPC G4 kompatibel. So können weiterhin 32-Bit-Programme ausgeführt werden, was die Nutzung älterer 32-Bit-Programme ermöglicht – weil in einer Übergangszeit jedoch weiterhin viele 32-Bit-Prozessoren verwendet wurden, waren auch einige zu dieser Zeit aktuellen Programme weiterhin in 32-Bit ausgeführt.
Neben der Fähigkeit zur Interpretation des 32-Bit-Befehlssatzes im Prozessor müssen jedoch auch die Betriebssysteme den 32-Bit-Kompatibilitsmodus für die jeweiligen Prozesse unterstützten. Eine Markierung an der Programmdatei zeigt dem Betriebssystem an, ob sie im erweiterten 64-Bit-Modus oder im kompatiblen 32-Bit-Modus auszuführen sind. Vom Betriebssystem muss dann auch die Programmierschnittstelle (API, kurz für englisch Application Programming Interface) als 32-Bit-Version zur Verfügung gestellt werden. Bei Windows wird dies durch das WOW64-Subsystem realisiert.[6] Auch 64-Bit-macOS kann bis Version 10.14 Mojave 32-Bit-Programme ausführen. Unter 32-Bit-Windows war es auch noch möglich, 16-Bit-Programme zu nutzen, doch mit dem Schritt auf 64-Bit musste die 16-Bit-Kompatibilität fallen gelassen werden, weil es im 64-Bit-Ausführungsmodus eines x86-Prozessors keine Möglichkeit mehr gibt, 16-Bit-Programme nativ ablaufen zu lassen. Auf Prozessoren, die keine Rückwärtskompatibilität in Hardware anbietet, besteht auch die Möglichkeit, das Ziel der Ausführung von 32-Bit- oder 16-Bit-Programmen über eine Hardware-unterstützte Virtualisierung oder über eine vergleichsweise langsame, softwarebasierte Emulation zu realisieren. So ist z. B. der x64-Version von Windows 7 optional 16-Bit-Kompatibilität in Form von Software-Emulation vorhanden – der „Windows-XP-Modus“ ist ein emuliertes oder virtualisiertes 32-Bit-Windows-XP, mit dessen Hilfe unter 64-Bit-Windows-7 weiterhin 16-Bit-Programme ausgeführt werden können (nebst 32-Bit-Programmen, die nur unter Windows XP richtig funktionierten).
Manchmal wird jedoch nach der Übergangszeit die Unterstützung dafür seitens des Betriebssystems eingestellt, was beispielsweise Apple mit macOS Catalina (Version 10.15) gemacht hat, obwohl die in Macs verwendeten 64-Bit-Intel-Prozessoren zu dieser Zeit weiterhin einen 32-Bit-Kompatibilitätsmodus bieten. Auch bei Windows war ab Windows 8 der „Windows-XP-Modus“ (u. a. für 16-Bit-Programme) nicht mehr vorhanden.
Mit Virtualisierungssoftware oder Emulatoren ist es auf so gut wie jedem Betriebssystem jedoch weiterhin möglich, ganze (ältere) 32-Bit- oder sogar 16-Bit-Betriebssysteme auszuführen. Dadurch besteht immer die Möglichkeit, alte Software auf modernen Systemen zu nutzen, wenn auch eingeschränkt.
Programmiermodell
[Bearbeiten | Quelltext bearbeiten]Unter der Programmiersprache C schlägt sich die Ausrichtung auf eine 64-Bit-Architektur sowohl bei der Größe der Zeiger-Typen (z. B. void*
) als auch der Integer-Typen (insbesondere int
und long
) nieder. Beim Übergang von einer 32-Bit-Architektur verbreitert man in der Regel Zeiger und den Datentyp long
auf 64 Bit, wogegen der Datentyp int
bei 32 Bit verbleibt. Dieses nennt man dann abgekürzt LP64. Zur Rückwärtskompatibilität mit der 32-Bit-Architektur, die meist als ILP32 ausgeführt wurde, hatte man teils auch long
identisch mit int
gelassen, was als LLP64 bezeichnet wird. Alle heutigen unixartigen 64-Bit-Betriebssysteme drücken die 64-Bit-Architektur in einem LP64-Typenmodell aus, Windows verwendet das LLP64-Modell.
Das ILP64-Datenmodell wurde eingeführt, da Quellcode von alter Software häufig unter der unzulässigen Annahme entwickelt wurde, dass ein int
einen Zeiger halten kann. Es wird auf frühen 64-Bit-Systemen vorgefunden, die schnell auf den Markt wollten, ohne vorher vorhandenen Quellcode bereinigen zu müssen.
Daten- modell |
short (integer) |
int |
long (integer) |
long long |
pointer |
Beispiel Betriebssystem/Compiler[8] |
---|---|---|---|---|---|---|
LLP64 | 16 | 32 | 32 | 64 | 64 | Microsoft Win64 (x64/IA64) |
LP64 | 16 | 32 | 64 | 64 | 64 | Unix und Unixoide Systeme, z. B. Linux, macOS, Solaris |
ILP64 | 16 | 64 | 64 | 64 | 64 | Cray |
SILP64 | 64 | 64 | 64 | 64 | 64 | Manche Unicos-Systeme[9] |
Vorteile
[Bearbeiten | Quelltext bearbeiten]Im Vergleich zu ihren Vorgängern bringt die 64-Bit-Architektur zahlreiche Vorteile mit sich, vor allem in Bezug auf Leistung, Datensupport, Sicherheit und Zukunftssicherheit.
Die verschiedenen Vorteile der 64-Bit-Architektur und ihre Auswirkungen auf die moderne Computertechnologie:
A. Steigerung der Speicherkapazität
Durch die erweiterte Wortbreite von 64 Bit kann die Rechenleistung deutlich gesteigert und die Speicheradressierung verbessert werden. Darüber hinaus kann die 64-Bit-Architektur die Verarbeitungsgeschwindigkeit von Anwendungen steigern, vor allem bei anspruchsvollen Tätigkeiten wie der Multimedia-Verarbeitung und der Abfrage von Datenbanken.[10]
B. Unterstützung großer Datenmengen
Die 64-Bit-Architektur unterstützt umfangreiche Datenmengen und anspruchsvolle Berechnungen besser, was insbesondere in Feldern wie Datenanalyse, Simulationen und wissenschaftlicher Forschung von Nutzen ist.
1.Die 64-Bit-Architektur verfügt über eine gesteigerte Speicheradressierungsfähigkeit, wodurch eine reibungslose Verarbeitung umfangreicher Datenmengen in Echtzeit möglich ist. Dies spielt in Bereichen wie der Videoverarbeitung, dem Streaming und der Finanzanalyse eine besondere Rolle.[11]
2. Komplexe Berechnungen und Simulationen sind auf 64-Bit-Systemen aufgrund der größeren Datenpfadbreite und der gesteigerten Rechenleistung effizienter durchzuführen. Es wurde deutlich, dass dies in verschiedenen wissenschaftlichen und technischen Bereichen zu genaueren Resultaten und einer erhöhten Innovationsrate führt.[12]
C. Sicherheit
Im Gegensatz zu 32-Bit-Systemen verfügt die 64-Bit-Architektur auch über verbesserte Sicherheitsfunktionen sowie eine bessere Fehlererkennung und Fehlerbehebung.
1. Erweiterte Adressraumisolierung: Durch den Einsatz von 64-Bit-Adressen wird eine widerstandsfähigere Adressraumisolierung möglich, was zu einer Verringerung der Speicherfehler- und Sicherheitsverletzungsmöglichkeiten führt. Dies leistet einen Beitrag zu einer generell sichereren Systemumgebung.[13]
2. Die verbesserten Fehlererkennungs- und Fehlerkorrekturfunktionen von 64-Bit-Systemen helfen dabei, die Stabilität und Verlässlichkeit des Systems zu steigern. Dadurch können mögliche Sicherheitslücken und Systemausfälle frühzeitig identifiziert und behoben werden.[14]
Nachteile
[Bearbeiten | Quelltext bearbeiten]1. Komplexität und Kosten
Da 64-Bit-Systeme eine spezielle Hardware und Software benötigen, um die Vorteile der erweiterten Architektur voll auszuschöpfen, führt ihre Einführung zu zusätzlicher Komplexität und zusätzlichen Kosten.[15]
2. Kompatibilitätsprobleme mit älterer Hardware und Software
Kompatibilitätsprobleme mit älterer Hardware und Software, die möglicherweise nicht mit den neuen Architekturen kompatibel sind, können durch die Implementierung und Verwendung von 64-Bit-Systemen entstehen.[16]
3.Einschränkungen bei der Leistungsoptimierung
Trotz der Tatsache, dass die 64-Bit-Architektur eine gesteigerte Rechenleistung bereitstellt, können bei der Leistungsoptimierung gewisse Beschränkungen auftreten, vor allem bei Anwendungen, die die Vorteile der erweiterten Architektur nicht voll ausschöpfen können.[17]
Probleme
[Bearbeiten | Quelltext bearbeiten]Ohne speziell angepasste Ausführungsumgebung kann allerdings kein Vorteil durch den Wechsel von 32-Bit- auf 64-Bit-CPUs gezogen werden. Dies wird insbesondere bei abwärtskompatiblen CPUs wie AMD Athlon 64 X2, AMD Phenom X3/X4, Intel Pentium D, Intel Pentium Extreme Edition, Intel Core 2 Duo, Intel Core 2 Quad, Intel Core i7 oder den 64-Bit-PowerPC-CPUs deutlich. Dies betrifft nicht nur die Betriebssysteme mit 64-Bit-Systemkern zur Paging-Verwaltung mit großen Adressen, sondern auch die Hilfsbibliotheken der Programme mit den darin eingesetzten Algorithmen: Viele alte Systeme verwenden 32-Bit-optimierte Algorithmen, die erst nach Anpassung durch Programmierer von der 64-Bit-Erweiterung profitieren.
Die Notwendigkeit der Anpassung betrifft im Anwendungsbereich besonders mathematische Hilfsfunktionen (auch Multimedia und Spiele), aber auch die Speicherverwaltung. Viele Programme aus dem Unix-Bereich haben hierbei einen Vorsprung, da dort 64-Bit-Architekturen schon lange üblich sind. Über die Entwicklung der Workstations wurden im Unixbereich (einschließlich Linux) auch Desktopprogramme schon langjährig auf 64 Bit angepasst, bevor die Windowsprogramme auf die 64-Bit-Editionen von Windows angepasst wurden. Bei macOS ist die Entwicklung gemischt, da der Unix-basierte Kern und die Desktopoberfläche aus verschiedenen Entwicklungszweigen stammen. Gerade letztere Systeme machen dabei Gebrauch von der Möglichkeit der abwärtskompatiblen CPUs, auf einem 64-Bit-Betriebssystemkern sowohl 32- als auch 64-Bit-Programme parallel auszuführen – diese haben jedoch das Problem, dass die Wechselwirkung der Programme auf dem Desktop gehemmt sein kann (bekannt etwa für Browser-Plugins).
Ähnlich wie bei SIMD oder AltiVec-Erweiterungen ist also auch für 64-Bit-Systeme in der Regel speziell angepasste Software nötig.
Weblinks
[Bearbeiten | Quelltext bearbeiten]- Andrew Josey: Data Size Neutrality and 64-bit Support. USENIX, 4. Dezember 1997 (englisch; 32-/64-Bit-Programmierersicht).
- M. Jungowski: WoW64 Microsofts Starthilfe für 64-Bit Windows. Online-Magazin Planet 3DNow!, 14. Juli 2004 (32-/64-Bit-Mischbetrieb).
Einzelnachweise
[Bearbeiten | Quelltext bearbeiten]- ↑ Harry Phillips: New Perspectives on Microsoft Windows Vista for Power Users. Cengage Learning, 2008, ISBN 978-1-4239-0603-2, S. 16 (eingeschränkte Vorschau in der Google-Buchsuche).
- ↑ Hennessy, John L., and Patterson, David A. "Computer Architecture: A Quantitative Approach." Morgan Kaufmann, 2011.
- ↑ Index of /pdf/ibm/7030. Abgerufen am 4. April 2024.
- ↑ PA-RISC 2.0 Architecture Specifications, ftp.parisc-linux.org (englisch, PDF-Datei)
- ↑ a b Product Specifications. Abgerufen am 5. November 2021 (englisch).
- ↑ Jorge Orchilles: Microsoft Windows 7 Administrator’s Reference: Upgrading, Deploying, Managing, and Securing Windows 7. Syngress, 2010, ISBN 978-1-59749-562-2, S. 9 (eingeschränkte Vorschau in der Google-Buchsuche).
- ↑ 64-Bit Programming Models: Why LP64? The Open Group, 1998, abgerufen am 1. Januar 2016 (englisch).
- ↑ Das Datenmodell ist eine Eigenschaft des Compilers unter dem entsprechenden Target-Betriebssystems, nicht des Betriebssystems allein.
- ↑ Cray C/C++ Reference Manual. (PDF; 1,9 MB) In: audentia-gestion.fr. Cray Inc, S. 131, abgerufen am 5. September 2023 (englisch).
- ↑ Smith, J. E., & Wang, C. (2002). Architectural innovations in 64-bit processors. IEEE Micro, 22(2), 22-29.
- ↑ Hennessy, J. L., & Patterson, D. A. (2018). Computer architecture: A quantitative approach (6th ed.). Morgan Kaufmann.
- ↑ Smith, J. E., & Ravi, S. S. (2019). The impact of 64-bit computing on scientific research. Communications of the ACM, 62(1), 68-75.
- ↑ Stallings, W. (2016). Computer organization and architecture: Designing for performance (10th ed.). Pearson.
- ↑ Tanenbaum, A. S., & van Steen, M. (2018). Distributed systems: Principles and paradigms (3rd ed.). Pearson.
- ↑ Flynn, M. J., & Harris, D. (2019). Computer architecture: Pipelined and parallel processor design. Jones & Bartlett Learning.
- ↑ Tanenbaum, A. S., & Austin, T. (2019). Structured computer organization (7th ed.). Pearson.
- ↑ Patterson, D. A., & Hennessy, J. L. (2018). Computer organization and design: The hardware/software interface (5th ed.). Morgan Kaufmann.