Was sind Universal Binaries?
MTN erklärt Fachbegriffe, Teil 17
Universal Binaries
Mit dem angekündigten Umstieg auf Intel-Prozessoren tauchte auch ein neuer Begriff auf, der seitdem im Zusammenhang mit nahzu jeder Software verwendet wird: Universal Binary.
Da nun eine komplett neue Prozessorarchitektur eingesetzt wird, war es nötig, dass
Applikationen in zwei Versionen vorliegen mussten. Der Intel-Prozessor kann keine Programme für PowerPC-Prozessoren ausführen und umgekehrt. Zwar hat Apple in Mac OS X mit Rosetta einen dynamischen Recompiler integriert, mit dem sich auf Intel-Prozessoren PowerPC-Anwendungen ausführen lassen, doch dies ist mit einem spürbaren Performanceverlust verbunden und nur als Übergangslösung gedacht.
Es ist also notwendig, dass Programme, um auf Intel-Prozessoren und auf PowerPC-Prozessoren nativ lauffähig sind, in einer besonderen Form vorliegen. Der Programmcode muss einmal nativ für PowerPC- und nativ für Intel-Prozessoren vorliegen, damit die Applikation auf beiden Architekturen nativ lauffähig ist. Dies nennt Apple ein Universal Binary.
Läuft ein Programm nativ auf einer Architektur, bedeutet dies, dass kein Emulator oder ähnliches notwendig ist, um die Programme auszuführen. Deshalb laufen die Programme, wenn sie nativ ausgeführt werdne können, erheblich schneller als mit einer Emulationsumgebgung.
Beide Architekturen unterscheiden sich in wesentlichen Punkten. Nur ein Beispiel dabei sind RISC (Reduced Instruction Set Code) und CISC (Complex Instruction Set Code), wobei zu sagen ist, dass keine der beiden Plattformen nur auf RISC oder CISC setzt. Viel mehr wurden die Perlen aus beiden Möglichkeiten herausgepickt und somit ein Kompromiss geschaffen, der eben beim PPC eher in Richtung RISC, beim x86 in RIchtung CISC ging. Stark vereinfacht gesagt, wird ein RISC-Prozessor mit vielen kurzen Instruktionen gefüttert, der CISC-Prozessor kann mit längeren, komplizierteren Befehlen angesteuert werden. Theoretisch ist damit der RISC-Prozessor etwas leistungsfähiger, da die Befehle schneller abgearbeitet werden können. Das bekannteste Beispiel für ein CISC-Element innerhalb einer RISC-CPU ist das im PPC zum EInsatz kommende Altivec.
Kurzum sind die Architekturen von den Befehlsschätzen her so unterschiedlich, dass es nicht möglich ist, Code zu schreiben, der auf beiden Prozessoren lauffähig ist.
Auf der Keynote sah die Umsetzung kinderleicht aus. Wie Theo Gray, CEO von Wolfram Research angab, habe man nur eine kleine Checkbox aktivieren und rund 20 Zeilen Code anpassen müssen. Das war natürlich heillos übertrieben, gerade für ein so kompliziertes Projekt, dennoch wird dem Programmierer die Umsetzung recht einfach gemacht. Einige Monate später meldete auch Wolfram Research, um wirklich sauberen Code und gute Performance zu haben, müssen man doch ein wenig mehr tun, weswegen sich die Entwicklung noch in die Länge ziehe.
Grundsätzlich können sauber geschriebene und neue Projekte, die in Xcode entwickelt worden sind, recht einfach als Universal Binary rekompiliert werden. Bei älteren, über Jahre hinweg gewachsenen Programmen kann es allerdings schwieriger werden, da diese häufig noch in der damals aktuellen CodeWarrior-Programmierumgebung geschrieben wurden. Zwar unterstützt CodeWarrior auch Carbon- und Cocoa-Progammierung, dennoch gibt große Unterschiede zwischen dem Metrowerks- und dem GCC-Compiler aus Xcode. Dies kann dazu führen, dass einige Programmteile neu geschrieben werden müssen, außerdem muss das Projekt von CodeWarrior in ein Xcode-Projekt umgestellt werden, was manchmal einige Hürden mit sich bringt.
Zusätzlich gibt es einen großen Unterschied zwischen der Intel- und PowerPC-Architektur, die auch Programmierern, die in Hochsprachen wie C++ oder Objective-C programmieren, Probleme bereiten kann. Die interne Anordnung von Zahlen unterscheidet sich zwischen den Architekturen, so dass eine 32-Bit lange Zahl, als Datei geschrieben auf einem PowerPC-Mac, nicht die selbe Zahl ist, wenn man diese Datei wieder auf einem Intel-Mac einließt. Dies muss der Programmierer berücksichtigen, damit Dateien auf beiden Architekturen lesbar sind. Solche Probleme können auch auftreten, wenn Daten über ein Netzwerk übermittelt werden.
Schon damals, Anfang der 90er, als Apple von der Motorola 68k-Architektur auf die PowerPC-Architektur wechselte, war ein solcher Schritt notwendig. Damals hießen die Programme, die auf 68k- und PowerPC-Maschinen liefen, Fat Binaries.