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?
sizeof(int)==sizeof(void*)
operator*
für zu habenint
, aber Zeiger brauchen das nicht. Auch haben die meisten Linux- und Unix-Umgebungenint
32 Bit.Antworten:
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
int
ist groß genug, um einen Zeiger zu speichernAngenommene 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.
quelle
sizeof(int) == sizeof(void *)
(beide sind 32 Bit); Auf x86_64 ist es normal,int
32-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 einint
oder geschobenunsigned int
.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 z
int32_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
quelle