Warum kann es schwierig sein, eine 64-Bit-Version eines Programms zu erstellen?

29

In meiner kurzen Programmierzeit war es trivial, C ++, Java usw. für eine 32- oder 64-Bit-Maschine zu kompilieren, sofern ich die vollständige Programmquelle besitze.

Aber viele Software wird nicht 64bit veröffentlicht. Am ärgerlichsten ist, dass es noch kein 64-Bit-Release der Unity-Engine gibt.

Was macht es schwierig, einige Programme für 64-Bit-Maschinen zu kompilieren?

Calben
quelle
57
weil dumme programmierer immer wieder davon ausgehensizeof(int)==sizeof(void*)
ratschenfreak
16
Der Hauptgrund in unserer Umgebung ist die Abhängigkeit von einigen Komponenten von Drittanbietern, die nicht als 64-Bit-Version verfügbar sind. Ich weiß nicht, ob dies auch für die Einheit gilt, aber ich wäre nicht allzu überrascht, wenn dies der Fall wäre.
Doc Brown
Sie können typedef wie int32, int64 für int, float, pointer verwenden, anstatt ihre Größe anzunehmen. Welches könnte ein großes Problem lösen. Viele Probleme beginnen mit der Annahme.
Kshitij
Dies ist in der Tat eine durchaus vernünftige Annahme für flache Architekturen. Windows hat es absichtlich falsch gemacht, die eigenen Fehler zu vermeiden.
Joshua
3
Warum sollte das eine vernünftige Annahme sein? Ich würde erwarten, eine anständige operator*für zu haben int, aber Zeiger brauchen das nicht. Auch haben die meisten Linux- und Unix-Umgebungen int32 Bit.
MSalters

Antworten:

61

Das allgemeine Problem ist, dass es sehr einfach ist, undokumentierte Annahmen in einem Programm zu codieren, und sehr schwer, Orte zu finden, an denen diese Annahmen gemacht wurden. Hochrangige Sprachen schirmen uns in der Regel ein wenig von diesen Problemen ab. In niedrigeren Sprachen, die für die Implementierung von Plattformen und Diensten verwendet werden, ist es jedoch einfach, Dinge zu tun, die nicht unbedingt auf Architekturen übertragbar sind:

  • Vorausgesetzt, das intist groß genug, um einen Zeiger zu speichern

  • Angenommene Eigenschaften der Darstellung von Zeigern, z. B. zur Zeigermarkierung

  • Angenommen, Datenzeiger und Codezeiger haben die gleiche Größe

Es gibt auch das praktische Anliegen des Release-Managements. Wenn ich nur einen x86-Build erstelle, läuft dieser immer noch auf x86-64, wenn auch möglicherweise langsamer, da nur begrenzte Register verfügbar sind. Wenn ich für x86 und x86-64 arbeite, muss ich jetzt beide Architekturen testen und Fehler beheben, die möglicherweise nur für eine Architektur auftreten, was die Kosten für den Versand einer neuen Version erhöht.

Jon Purdy
quelle
10
Beachten Sie, dass es möglich ist, einen Fehler zu schreiben, der nur auftritt, wenn auf der 64-Bit-Version des Betriebssystems eine x86-Binärdatei ausgeführt wird. Es ist nur schwieriger ;-)
Steve Jessop
6
+1. Ich möchte dem Punkt "Release-Management" Folgendes hinzufügen: Wenn meine Software auf Komponenten von Drittanbietern basiert, ist der zusätzliche Aufwand für das Testen neuer Releases auch dann, wenn eine 32- und eine 64-Bit-Version einer bestimmten Komponente verfügbar sind sollte nicht unterschätzt werden. IMHO Release Management sollte also der erste Punkt auf dieser Liste sein, nicht nur eine Randnotiz.
Doc Brown
Könnten Sie das Problem der int-Zeigergröße näher erläutern? Liegt es daran, dass in einer 64-Bit-Umgebung der Speicherplatz höher ist als von einem int zugelassen?
TankorSmash
4
@TankorSmash: auf x86 normalerweise sizeof(int) == sizeof(void *)(beide sind 32 Bit); Auf x86_64 ist es normal, int32-Bit beizubehalten (es bleibt mit x86 kompatibel und vermeidet die Verschwendung von Speicherplatz), aber Zeiger müssen 64-Bit sein (da der virtuelle Adressraum bis zu 2 ^ 64 reicht), sodass sie nicht länger sein können in ein intoder geschoben unsigned int.
Matteo Italia
26

Die meiste Software funktioniert beim Kompilieren sowohl für die 32- als auch für die 64-Bit-Intel / AMD-Architektur gleich. Einige Softwareprogramme werden dies jedoch nicht tun. Abgesehen von Faulheit oder dem Erreichen eines größeren Publikums gibt es einige spezifische Gründe, warum das Neukompilieren als 64-Bit nicht funktioniert.

  • Die Software verwendet möglicherweise unsichere Zeigeroperationen. Vielleicht setzt ein Programm einen Zeiger in ein int, was in der Regel 32 Bit für die meisten C- und C ++ - Compiler ist. Zeiger sind 64 Bits in einem 64-Bit-Programm. Das funktioniert nicht.

  • Bitverschiebungsoperationen können zu unterschiedlichen Ergebnissen führen, wenn der verwendete Integer-Typ eine andere Größe hat. Dies kann ein Problem sein, wenn Sie einen regulären Datentyp anstelle eines Standardtyps wie zint32_t

  • Ein in einer Union verwendeter Datentyp kann die Größe und das Verhalten der Union ändern.

  • Die Software verwendet möglicherweise nur 32-Bit-Bibliotheken. Im Allgemeinen funktioniert ein 64-Bit-Programm aufgrund von Annahmen zu Stack, Zeigern usw. nur mit 64-Bit-Bibliotheken.

Die Schwierigkeit, die Sie sich bei Ihrer Frage stellen, besteht einfach darin, dass es in einigen Codebasen Millionen von Codezeilen gibt, die unsichere Vorgänge ausführen, unsichere Annahmen treffen, Verknüpfungen und clevere "Optimierungen" haben, die von Entwicklern eingegeben wurden. Der Code wird entweder nicht in einer 64-Bit-Umgebung kompiliert, oder er wird kompiliert, weist jedoch Show-Stopper-Fehler auf. Es kann lange dauern, bis alle Probleme behoben sind. Vielleicht werden sie von einem Unternehmen im Laufe der Zeit behoben, bis eine 64-Bit-Version veröffentlicht werden kann. Möglicherweise wird ein Unternehmen neben den aktuellen Wartungsversionen eine "Version 2" entwickeln, da ein vollständiges Umschreiben erforderlich ist.

Die Moral der Geschichte ist, sauberen Code zu schreiben und nicht zu versuchen, den Compiler zu hinterfragen oder clevere Optimierungen hinzuzufügen, die nicht benötigt werden, die Software beschädigen können und wahrscheinlich sowieso nicht helfen.

Dieser Artikel enthält weitaus mehr Details, als ich mir vorstellen kann: 20 Probleme beim Portieren von C ++ - Code auf der 64-Bit-Plattform

Tulains Córdova
quelle
8
Die Probleme können auch weiter gehen als nur die Zusammenstellung; Ich habe einen Musiker, der das verfügbare 64-Bit-FL-Studio nicht verwenden kann, weil er viele VSTi-Dateien benötigt, die nur 32-Bit sind. Andere Dynamic Link-basierte Plugin-Architekturen sind ebenfalls betroffen.
StarWeaver
Vielen Dank für die Bearbeitung: Ich bin normalerweise sehr wählerisch in Bezug auf Grammatik, habe aber ein paar Fehler gemacht. Und @StarWeaver Ich glaube, ich habe das angesprochen, als ich sagte, der Code könnte kompiliert werden, aber es gibt Fehler. Dies geht immer noch auf meinen Punkt zurück, der darin besteht, sauberen Code für jede Sprache und Plattform zu schreiben, auf die Sie abzielen.
"Show Stopper Bugs haben" Die Show Stopper sind offensichtlich und "in deinem Gesicht" und können behandelt werden. Was ich wahrscheinlich für schlimmer halte, sind all die Probleme, die zu subtil falschen Ergebnissen führen, die lange Zeit unbemerkt bleiben.
Burhan Ali