Dans ma programmation à court terme, il a été trivial de compiler n'importe lequel de mes C ++, Java, etc. pour une machine 32 ou 64 bits tant que j'ai la source complète du programme.
Mais beaucoup de logiciels ne sortent pas 64 bits. Plus ennuyeux encore, il n'y a pas encore de version 64 bits du moteur Unity.
Qu'est-ce qui rend difficile la compilation de certains programmes pour les machines 64 bits?
sizeof(int)==sizeof(void*)
operator*
pourint
, mais les pointeurs n'en ont pas besoin. De plus, la plupart des environnements Linux et Unix ont égalementint
32 bits.Réponses:
Le problème général est qu'il est très facile de coder des hypothèses non documentées dans un programme et très difficile de trouver des endroits où ces hypothèses ont été faites. Les langages de haut niveau ont tendance à nous isoler quelque peu de ces préoccupations, mais dans les langages de bas niveau utilisés pour implémenter des plates-formes et des services, il est facile de faire des choses qui ne sont pas nécessairement transférables entre architectures:
En supposant qu'il
int
soit suffisamment grand pour stocker un pointeurSupposer les propriétés de la représentation des pointeurs, par exemple pour le marquage de pointeurs
En supposant que les pointeurs de données et les pointeurs de code ont la même taille
Il y a aussi le souci pratique de la gestion des versions. Si je ne crée qu'une version x86, elle fonctionnera toujours sur x86-64, quoique peut-être plus lentement en raison de la disponibilité limitée des registres. Alors que si je compile à la fois pour x86 et x86-64, je dois maintenant tester sur les deux architectures et traiter les bogues qui ne peuvent survenir que sur une seule architecture, ce qui augmente le coût d'expédition d'une nouvelle version.
la source
sizeof(int) == sizeof(void *)
(ils sont tous les deux 32 bits); sur x86_64, il est normal de garderint
32 bits (il reste compatible avec x86 et évite de gaspiller de l'espace en mémoire), mais les pointeurs doivent être de 64 bits (puisque l'espace d'adressage virtuel va jusqu'à 2 ^ 64), donc ils ne peuvent plus être poussé dans unint
ouunsigned int
.La plupart des logiciels fonctionnent de la même manière lorsqu'ils sont compilés pour les architectures Intel / AMD 32 et 64 bits. Cependant, certains logiciels ne le seront pas. En plus de la paresse ou d'atteindre un public plus large, il existe des raisons spécifiques pour lesquelles la recompilation en 64 bits ne fonctionnera pas.
Le logiciel peut utiliser des opérations de pointeur non sécurisées. Peut-être qu'un programme place un pointeur dans un int, qui est généralement de 32 bits pour la plupart des compilateurs C et C ++. Les pointeurs sont 64 bits dans un programme 64 bits. Cela ne fonctionne pas.
Les opérations de décalage de bits peuvent produire des résultats différents si le type entier utilisé est de taille différente. Cela peut être un problème lors de l'utilisation d'un type de données standard au lieu d'un typedef standard tel que
int32_t
Un type de données utilisé dans une union peut changer de taille, modifiant le comportement de l'union.
Le logiciel peut s'appuyer sur des bibliothèques 32 bits uniquement. En général, un programme 64 bits ne fonctionnera qu'avec des bibliothèques 64 bits en raison d'hypothèses sur la pile, les pointeurs, etc.
La difficulté que vous posez dans votre question est simplement que dans certaines bases de code, il peut y avoir des millions de lignes de code qui effectuent des opérations dangereuses, font des hypothèses dangereuses, ont des raccourcis et des "optimisations" intelligentes mises en place par les développeurs. Le code ne sera pas compilé dans un environnement 64 bits, ou il compilera mais aura des bugs show-stopper. La résolution de tous les problèmes peut prendre du temps. Peut-être qu'une entreprise les corrigera au fil du temps jusqu'à ce qu'il soit possible de publier une version 64 bits. Peut-être qu'une entreprise développera une "version 2" aux côtés des versions de maintenance actuelles car une réécriture totale est nécessaire.
La morale de l'histoire est d'écrire du code propre et de ne pas essayer de deviner le compilateur ou d'ajouter des optimisations intelligentes qui ne sont pas nécessaires, peuvent casser le logiciel et n'aideront probablement pas de toute façon.
Cet article est beaucoup plus détaillé que je ne pouvais espérer inclure dans cette réponse: 20 problèmes de portage de code C ++ sur la plate-forme 64 bits
la source