Pourquoi pourrait-il être difficile de créer une version 64 bits d'un programme?

29

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?

calben
la source
57
parce que les programmeurs stupides continuent de supposersizeof(int)==sizeof(void*)
cliquetis monstre
16
La principale raison dans notre environnement est la dépendance à l'égard de certains composants tiers qui ne sont pas disponibles en 64 bits. Je ne sais pas si cela s'applique également à Unity, mais je ne serais pas trop étonné si tel était le cas.
Doc Brown du
Ils peuvent utiliser typedef comme int32, int64 pour int, float, pointer au lieu d'assumer leur taille. Ce qui pourrait résoudre beaucoup de problèmes. Beaucoup de problèmes commencent à partir du moment où nous commençons à supposer.
Kshitij
Ce qui est en fait une hypothèse parfaitement raisonnable sur les architectures plates. Windows s'est trompé délibérément pour éviter de casser ses propres erreurs.
Joshua
3
Pourquoi serait-ce une hypothèse raisonnable? Je m'attendrais à avoir un bon operator*pour int, mais les pointeurs n'en ont pas besoin. De plus, la plupart des environnements Linux et Unix ont également int32 bits.
MSalters

Réponses:

61

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 intsoit suffisamment grand pour stocker un pointeur

  • Supposer 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.

Jon Purdy
la source
10
Notez qu'il est possible d'écrire un bogue qui ne se manifeste que lorsqu'un binaire x86 est exécuté sur la version 64 bits du système d'exploitation. C'est juste plus difficile ;-)
Steve Jessop
6
+1. Je voudrais ajouter ce qui suit au point de "gestion des versions": si mon logiciel repose sur des composants tiers, même si une version 32 et 64 bits d'un composant spécifique est disponible, l'effort supplémentaire pour tester les nouvelles versions ne doit pas être sous-estimé. La gestion des versions à mon humble avis devrait donc être le premier point de cette liste, et pas seulement une note annexe.
Doc Brown du
Pourriez-vous élaborer sur le problème de la taille du pointeur int? Est-ce parce que dans un environnement 64 bits, l'espace mémoire serait supérieur à ce que permet un int?
TankorSmash
4
@TankorSmash: sur x86 normalement sizeof(int) == sizeof(void *)(ils sont tous les deux 32 bits); sur x86_64, il est normal de garder int32 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 un intou unsigned int.
Matteo Italia
26

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 queint32_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

Tulains Córdova
la source
8
Les problèmes peuvent aller plus loin que la simple compilation aussi; J'ai un ami musclé qui ne peut pas utiliser le FL Studio 64 bits disponible car ils nécessitent de nombreux VSTi qui ne sont que 32 bits; d'autres architectures de plug-in basées sur des liens dynamiques sont également affectées.
StarWeaver
Merci pour l'édition: je suis normalement très pointilleux sur la grammaire mais j'ai fait quelques erreurs. Et @StarWeaver, je pense que j'ai abordé cela lorsque j'ai dit que le code pouvait compiler mais comportait des bogues. Cela revient toujours à mon point sur l'écriture de code propre pour la langue et la plate-forme que vous ciblez.
"ont des bogues de show-stopper" Le show stopper est évident et "dans votre visage" et peut être traité. Ce que je pense est probablement pire, c'est tous les problèmes qui produisent des résultats subtilement incorrects qui passeront inaperçus pendant longtemps.
Burhan Ali