7
votes

Pourquoi est-il si difficile de faire des versions de logiciels de 64 bits?

Quels sont tous les aspects doivent être pris en compte lors de la conception de votre logiciel dans un environnement 64 bits et pourquoi le même code ne fonctionnerait-il pas 32 bits et 64 bits (lorsque vous parlez d'applications)?

Les chauffeurs sont évidemment une bête différente, les pilotes 64 bits manquants sont un problème infâme pour presque tous les quincailleries. Ce qui est si différent dans ce domaine qu'il est presque impossible de trouver des pilotes?

Pourquoi est-il si difficile de faire des versions de 64 bits de logiciels?

Edit: oublions les défauts de base de l'ancien logiciel de buggy avec des numéros magiques, etc. et pensez que vous créeriez vous-même créer le logiciel vous-même, pour être compatible avec les deux. Quels aspects avez-vous besoin de prendre en compte et y a-t-il des choses que vous ne pouvez tout simplement pas surmonter avec la conception actuelle du compilateur? Tous les logiciels manquants 64 bits ne peuvent pas simplement être parce que des personnes comme le code avec des nombres magiques ?! :)

conclusion : il semble être tout sur la paresse humaine et les raisons historiques, au lieu de raisons techniques.


9 commentaires

Vous devriez être plus précis si vous voulez une bonne réponse. Par exemple, il est sans cervelle de faire des versions de 64 bits d'applications .NET - définissez-la pour compiler en tant que CPU ou X64. Donc, évidemment, vous ne parlez pas d'applications .NET, mais que sont vous parlez? :)


Je demande en général quelle est la raison technique qui rend apparemment impossible d'utiliser exactement la même base de code pour construire des applications 32 bits et 64 bits. Étant donné qu'il s'agirait de recompiler, toutes les bibliothèques seraient également disponibles comme 64 bits, etc., toutes les applications pourraient également être simplement recompilées à 64 bits -> IE. aucun problème.


"Tout le logiciel 64 bits manquant ne peut pas simplement être parce que des personnes comme le code avec des nombres magiques ?!" - Un grand nombre de logiciels de 64 bits manquants pourrait être parce que cela n'est pas nécessaire. Quelqu'un s'il vous plaît corriger-moi si je me trompe, mais la règle de base que j'ai entendue est: à moins que vous ne répondiez potentiellement à plus de 4 Go de mémoire, vous devez compiler comme 32 bits.


@Nate - au moins sur Windows, des programmes 32 bits exécutés sur une couche d'émulation (WOW64). De plus, les programmes 32 bits sur Windows ne voient pas Windows de la même manière que les programmes 64 bits font, à cause de choses telles que la redirection du registre / des fichiers et d'autres choses pour la compatibilité en arrière.


@In Silice: Wow64 n'est pas (toujours) une couche d'émulation. Dans l'architecture AMD64 la plus courante, la CPU est simplement modifiée en mode 32 bits pour des fils 32 bits et aucune émulation n'est nécessaire. Voir EN.Wikipedia.org/wiki/wow64


@Nate Pinchot: la limite de 4 Go n'est pas vraiment pertinente ici. Je suis juste en ligne de SW qui ne fonctionne pas sur 64 bits (malgré Wow64) et quand on parle de la mémoire des conducteurs n'est pas un problème de toute façon. Mais je suppose que tout vient la paresseuse humaine après tout :(


Bien sûr, même si cela prend une heure ou moins pour faire une demande 64 bits, si rien n'est gagné, quel est le point? C'est une heure que vous auriez pu utiliser pour ajouter une nouvelle fonctionnalité à votre produit. Il y a aussi encore la question des dépendances ne sont pas disponibles en 64 bits, ce qui est en fait plus commun que vous ne le pensez.


@MusicFreak: Je suppose que vous n'avez aucune idée du nombre de systèmes 64 bits maintenant. Si c'était un travail d'une heure, tous les logiciels se feraient également 64 bits. La partie dépendances est vraie comme indiqué ici déjà, c'est ce que je parle de «raisons historiques».


@Thuminoïde: pas nécessairement, en raison de la même paresse que vous avez citée. :) Pour la plupart des applications, il n'y a absolument rien à gagner de la rédaction d'une version 64 bits. Les versions 64 bits des applications Windows exécutées 32 bits également - même avec Mac OS X aussi loin que je suis au courant. Linux est une histoire différente, auquel cas vous avez raison, mais pour Windows / Mac, il n'y a pas de point.


3 Réponses :


15
votes

Une raison spécifique pour laquelle cela pourrait être difficile, c'est que les tailles de pointeur vont être différentes. Au lieu d'un pointeur prenant 32 bits, un pointeur prendrait désormais 64 bits.

C'est un problème si le logiciel est quelque part chausse-pied un pointeur dans un int via un REINERPRET_CAST en C ++ (qui peut survenir dans un code de niveau vraiment faible), et c'est arrivé Travailler parce que la taille d'un int et un pointeur était la même taille. Fondamentalement, le code a supposé une certaine taille pour un pointeur.

Une autre façon qui peut mordre le dos est si le code est jumelé avec des nombres magiques tels que 4 au lieu de Tailleof (VOID *) ou 0xFFFFFFF au lieu de int_max ou quelque chose de similaire.

Il pourrait ne pas y avoir une version 64 bits d'un logiciel si elle dépend d'une bibliothèque ou d'une fonction non disponible en 64 bits. Vous ne pouvez pas avoir une application qui fait partie 32 bits et 64 bits. Par exemple, sous Windows, il existe une fonction appelée Setwindowlong qui ne peut accepter que 32 bits de données, ce n'est donc pas très utile pour les programmes 64 bits si un pointeur doit être transmis à la fonction. C'est pourquoi il y a une fonction appelée SetWindowLONGPTR qui peut gérer jusqu'à 64 bits dans des programmes 64 bits et 32 ​​bits dans des programmes 32 bits.

Notez que Internet Explorer s'exécute sur 32 bits par défaut, même sur des fenêtres de 64 bits, car une énorme majorité de plugins n'est disponible que dans 32 bits. Un gros exemple de ceci est Le lecteur Adobe Flash , disponible uniquement dans 32 -morceaux. Donc, apparemment même pour une grande entreprise comme Adobe, le portant pour 64 bits peut ne pas toujours être trivial.

Les opérations de bit-bit peuvent être affectées. Par exemple, Bit Shifting 0x80000 gauche 10 fois dans 32 bits vous donne 0x0 , mais changeant de bits 0x80000 10 fois dans 64 bits vous donne < Code> 0x200000000 .

Tout ce qui étant dit, il n'y a pas de vraie raison technique pour laquelle il est trop difficile de porter une application à 64 bits si le code a été écrit bien. Le meilleur scénario des cas est une simple reconfiguration de projet et La reconstruction complète est tout ce qui est nécessaire.

Le côté cynique de moi affirme que les entreprises utilisent cela comme moyen de mettre en œuvre une obsolescence planifiée - forcer ou encourager les personnes à améliorer / acheter les nouveaux produits!


6 commentaires

Mais pourquoi est-ce un problème? Ne devrait-il pas savoir mieux?


Il fait, mais si le code utilise REINERPRET_CAST , le compilateur n'émettra pas de diagnostic (c'est pourquoi la typographie doit être effectuée avec soin).


Et je parle de logiciel de qualité raisonnable non rempli de chiffres magiques, etc. Si cela aide, réfléchissez à la création de logiciels vous-même pour être compatible sur les deux mondes.


Merci d'avoir mis à jour votre réponse, mais que la question de la bibliothèque serait une non-question s'il s'agissait de recompiler seulement. Toutes les libs existeraient également en tant que versions 32 et 64 bits. Je cherche une réponse pourquoi ce n'est pas le cas :)


@Thuminoïde - qui dépend des auteurs de la bibliothèque prenant le temps de le faire. :-) Le code source de la bibliothèque ne peut même plus être disponible.


Même un programme parfaitement portable pourrait être soumis à des débordements de pile car la convention d'appel X64 peut effectuer un programme de 64 bits prendre plus de deux fois plus d'espace de pile que le même programme 32 bits.



4
votes

Le logiciel raisonnablement écrit est généralement très facile à porter à une autre architecture. Il suffit de regarder netbsd, Debian ou d'autres grands systèmes d'exploitation gratuits ... Beaucoup de logiciels open-source fonctionnent sur plus de deux architectures.

Le problème est que les lots et beaucoup de logiciels sont écrits avec mépris des bonnes pratiques. Faire du travail "Ça" est généralement la seule chose que le programmeur typique pense, ignorant d'autres problèmes. L'explication typique est la suivante: pourquoi se soucier de bonnes pratiques si le client ne voit pas le code, et cela fonctionne? Pourquoi passer plus de temps sur quelque chose qui fonctionne déjà?

Les pilotes sont légèrement différents ici. Différentes architectures peuvent gérer des trucs de bas niveau de différentes manières. x86 et AMD64 sous Windows a un autre problème: Microsoft Set plus de normes strictes pour AMD64 Pilotes - Les entreprises matérielles ne se soucient pas de produire des pilotes pour vieux Le matériel conforme aux exigences plus strictes (à nouveau: pourquoi déranger? Le client a déjà acheté un nouveau matériel avec leurs nouvelles boîtes 64 bits; et s'il ne le fera pas, nous le ferons de toute façon en fournissant des conducteurs). Encore une fois, les pilotes open source travaillent très souvent sur les deux AMD64 et x86 .

J'ai une carte son qui fonctionne assez bien sur les deux x86 et AMD64 sur Linux, mais ne fonctionne pas avec amd64 Windows exactement à cause de cette question. Il n'était donc pas impossible d'écrire un pilote pour AMD64 pour cela; La compagnie matérielle ne voulait tout simplement pas.

Alors, la réponse ultime à votre question est la suivante: argent.


1 commentaires

J'ai une imprimante laser couleur canon de 6 mois et ils n'ont pas fourni de pilotes de 64 bits, une douleur majeure dans le ***. Ainsi, l'achat de nouveau matériel ne fournit pas le bonheur ...



5
votes

La version de notes: dans la famille de langues les plus populaires - C et ses enfants - La taille et la structure des types de données sont à la fois très importantes et définies par la mise en œuvre . En fait, C a beaucoup de fonctionnalités dépendantes de la mise en œuvre. Cela signifie qu'il est facile d'écrire un code non-sport. Il n'est pas impossible d'écrire du code qui ne fait pas d'hypothèses sur l'architecture sous-jacente, mais il est très facile de dépendre des comportements spécifiques x86 sans réaliser ce que vous avez fait jusqu'à ce que vous essayiez d'exécuter le code dans un environnement différent.

Ce sont principalement ces caractéristiques de bas niveau qui rendent l'indépendance de l'architecture. Dans des langages de plus haut niveau comme Python et C #, c'est beaucoup plus facile.


0 commentaires