112 votes

Pourquoi la x86 est laid ? aka pourquoi est x86 considéré comme inférieur par rapport aux autres ?

Récemment, j'ai lu quelque SORTE les archives et rencontré des déclarations contre les architectures x86.

commentaires et beaucoup d'autres comme

  • Par rapport à la plupart des architectures X86 sont assez merdiques.

  • C'est certainement la sagesse conventionnelle que les X86 est inférieure à MIPS, SPARC, x86 et PowerPC, c'est moche

J'ai essayé de chercher mais ne trouve pas de raisons. Je ne trouve pas x86 mauvaise probablement parce que c'est la seule architecture, je suis familier avec.

Quelqu'un peut-il me fournir des raisons pour considérer x86 laid/mauvais/inférieure par rapport à d'autres.

99voto

Billy ONeal Points 50631

Quelques raisons possibles pour cela:

  1. x86 est relativement ancienne architecture (ses ancêtres étaient 8086s, après tout)
  2. x86 a considérablement évolué plusieurs fois, mais le matériel est requis afin d'assurer la rétrocompatibilité avec les anciens binaires. Moderne du matériel x86 encore contenir de soutien matériel pour exécuter les 16 bits de code natif. En outre, plusieurs de mémoire d'adressage de modèles doivent être en place pour permettre aux plus âgés de code à interagir sur le même processeur sans modification. Cela peut être déroutant pour certains.
  3. À certains égards, le x86 n'est pas inférieure, elle est simplement différente de la façon dont peut-être tous les autres de l'architecture du processeur fonctionne. Par exemple, l'entrée/sortie est traitée comme de la mémoire sur la plupart des architectures, mais pas sur les architectures x86.
  4. x86 est un CDCI de la machine, qui, pendant longtemps, de sorte qu'il était plus lent que les machines RISC. Aujourd'hui, le x86 est traduit en RISC-style instructions avant d'être exécuté de toute façon, cela importe peu dans la pratique.
  5. Le x86 a un très petit nombre de registres par rapport à la plupart des autres architectures. De nouveau, plus moderne x86 frites sont grandes risc en interne donc c'est moins un problème, mais ce n'est pas transparent à la recherche à l'ISA.
  6. x86 code assembleur est compliqué parce que x86 est un complexe d'architecture avec de nombreuses fonctionnalités. Je peux adapter les fonctionnalités disponibles sur une machine MIPS sur une seule lettre de la taille d'un morceau de papier. Même une simple table de recherche d'instructions x86 remplit plusieurs pages. Tout cela n'est pas forcément faire MIPS supérieure, pour l'enseignement d'une introduction à l'assembleur de la classe, il serait judicieux de commencer avec une simplification de l'architecture.
  7. Le x86 utilise à longueur variable opcodes, qui ajoutent de la complexité matérielle à l'égard du traitement des instructions.

EDIT: Ce n'est pas censé être un bash x86! partie. J'ai eu peu de choix, mais de faire une certaine quantité de dénigrement compte tenu de la façon dont la question est formulée. Mais, à l'exception de (1), toutes ces choses ont été faites pour de bonnes raisons (voir les commentaires). Intel concepteurs ne sont pas stupides -- qu'ils voulaient réaliser certaines choses par leur architecture, et ceux-ci sont certains de les impôts qu'ils devaient payer pour faire ces choses une réalité.

29voto

dthorpe Points 23314

Le principal frapper contre x86 dans mon esprit, c'est son CDCI origines - le jeu d'instructions contient beaucoup d'implicite des interdépendances. Ces interdépendances faire qu'il est difficile de faire des choses comme la réorganisation de l'instruction sur la puce, parce que les artefacts et la sémantique de ces interdépendances doivent être conservées pour chaque instruction.

Par exemple, la plupart des x86 entier ajouter et soustraire des instructions de modifier le registre des drapeaux. Après l'accomplissement d'ajouter ou de soustraire, l'opération suivante est souvent de regarder l'historique des indicateurs à vérifier pour le débordement, le bit de signe, etc. Si il y a un autre d'ajouter, après qui, il est très difficile de dire si elle est sûr de commencer l'exécution de la 2ème ajouter avant que le résultat du 1er à ajouter est connu.

Sur une architecture RISC, le complément d'instruction serait spécifier l'entrée d'opérandes et le registre de sortie(s), et tout sur l'opération aurait lieu seulement à partir de registres. Cela le rend beaucoup plus facile de dissocier les opérations d'ajout qui sont près les uns des autres, car il n'y a pas bloomin' historique des indicateurs obliger tout à la ligne et exécution de fichier unique.

Le DEC Alpha AXP puce, un MIPS style RISC design, a été douloureusement spartan dans les instructions disponibles, mais le jeu d'instruction a été conçu pour éviter l'inter-instruction implicite registre des dépendances. Il n'y a pas de matériel défini pile de registre. Il n'y a pas de matériel défini par l'historique des indicateurs. Même le pointeur d'instruction a été OS défini - si vous voulez retourner à l'appelant, vous avez eu à travailler sur la façon dont l'appelant a été va vous permettre de savoir quelle est l'adresse pour y retourner. C'était généralement défini par le système d'exploitation convention d'appel. Sur x86, si, elle est définie par la puce du matériel.

De toute façon, plus de 3 ou 4 générations de Alpha AXP la conception de puces, le matériel est passée d'un littéral de mise en œuvre de la spartan jeu d'instructions 32 int registres et 32 float registres massivement de l'exécution des ordres du moteur avec 80 registres internes, registre de renommage, résultat forwarding (d'où le résultat d'une instruction précédente est renvoyée à plus tard l'instruction, qui dépend de la valeur) et toutes sortes de sauvage et fou les performances des boosters. Et avec toutes les cloches et de sifflets, le AXP puce de mourir était encore considérablement plus petite que la comparable Pentium puce de mourir de cette époque, et l'AXP était un enfer de beaucoup plus rapide.

Vous ne voyez pas ces sortes d'éclats de booster de performance choses dans la famille x86 arbre en grande partie parce que le jeu d'instructions x86 complexité du fait de nombreux types de l'exécution des optimisations de coût prohibitif si ce n'est impossible. Intel coup de génie a été de renoncer à la mise en œuvre du jeu d'instructions x86 dans du matériel plus moderne x86 jetons sont en fait RISC cœurs qu'à un certain degré d'interpréter les instructions x86, à les traduire en interne microcode qui préserve toute la sémantique de l'original d'instructions x86, mais permet un petit peu de RISC out-of-order et d'autres optimisations sur le microcode.

J'ai écrit beaucoup de l'assembleur x86 et peut apprécier pleinement le confort de son CDCI racines. Mais je n'ai pas apprécier pleinement à la complexité de x86 a été jusqu'à ce que j'ai passé un certain temps à écrire Alpha AXP assembleur. J'ai été estomaqué par AXP la simplicité et l'uniformité. Les différences sont énormes, et profonde.

21voto

staticsan Points 14435

L'architecture x86 dates de la conception de la 8008 microprocesseur et les parents. Ces Processeurs ont été conçus à une époque où la mémoire a été lente et si vous pouviez le faire sur le PROCESSEUR, il est souvent beaucoup plus rapide. Cependant, PROCESSEUR-espace était aussi cher. Ces deux raisons expliquent pourquoi il y a seulement un petit nombre de registres qui ont tendance à avoir des fins spéciales, et un complexe jeu d'instructions avec toutes sortes de pièges et les limites.

Les autres processeurs de la même époque (par exemple, le 6502 de la famille) ont aussi des limites semblables et de bizarreries. Il est intéressant de noter, à la fois le 8008 série et le 6502 de la série ont été conçus comme des contrôleurs intégrés. Même alors, les contrôleurs embarqués étaient censés être programmé en assembleur et dans de nombreux cas pris en charge à l'assemblée programmeur plutôt que le compilateur de l'écrivain. (Regardez le VAX puce pour ce qui se passe quand vous accueillir pour le compilateur écrire.) Les concepteurs n'ont pas s'attendre à devenir l'objet général des plates-formes informatiques; c'est ce que des choses comme les prédécesseurs de la PUISSANCE archicture étaient pour. L'Ordinateur à la Maison de la révolution qui, bien entendu.

13voto

Olof Forshell Points 1754

J'ai quelques aspects supplémentaires ici:

Envisager l'opération "a=b/c" x86 mise en œuvre de cette comme

  mov eax,b
  xor edx,edx
  div dword ptr c
  mov a,eax

Comme un bonus supplémentaire de la div instruction edx contiendra le reste.

Un processeur RISC nécessiterait d'abord de chargement les adresses de b et c, le chargement b et c à partir de la mémoire de registres, de faire la division et de chargement de l'adresse de l'un puis de stocker le résultat. Dst,src syntaxe:

  mov r5,addr b
  mov r5,[r5]
  mov r6,addr c
  mov r6,[r6]
  div r7,r5,r6
  mov r5,addr a
  mov [r5],r7

Ici, il ne sera pas en reste.

Si toutes les variables doivent être chargés par le biais de pointeurs les deux séquences peuvent devenir plus si c'est de moins en moins de possibilité pour le RISC, car il peut avoir un ou plusieurs pointeurs déjà chargé dans un autre registre. x86 a moins de registre de sorte que la probabilité que le pointeur se trouve dans l'un d'entre eux est plus petit.

Avantages et inconvénients:

Le RISC manuels utilisateur peuvent être mélangés avec les environs de code pour améliorer l'enseignement de la planification, c'est moins d'une possibilité avec x86 au contraire qui cela fonctionne (plus ou moins bien en fonction de la séquence) à l'intérieur du PROCESSEUR lui-même. Le RISC séquence ci-dessus sera généralement 28 octets de long (7 instructions de 32 bits/4 octets largeur chacune) sur une architecture 32 bits. Ce sera la cause de l'arrêt de la puce de mémoire de travail de plus lors de l'extraction de l'emploi (sept extrait). Le plus dense x86 séquence contient moins d'instructions et, même si leurs largeurs varient vous êtes probablement à la recherche à une moyenne de 4 octets/l'instruction. Même si vous disposez d'instruction met en cache pour accélérer les sept récupère signifie que vous aurez un déficit de trois ailleurs à rattraper par rapport à la x86.

L'architecture x86 avec moins de registres à sauvegarder/restaurer les moyens qu'il va probablement faire les commutateurs de thread et de traiter les interruptions plus vite que RISC. Plus de registres pour enregistrer et restaurer nécessite plus de RAM temporaire de la pile d'espace pour faire les interruptions et les plus permanents de la pile d'espace pour stocker fil unis. Ces aspects devraient faire x86 un meilleur candidat pour l'exécution pure RTOS.

Sur une note plus personnelle, je le trouve plus difficile à écrire RISC assemblée que x86. - Je résoudre ce par écrit le RISC routine en C, la compilation et la modification du code généré. C'est plus efficace à partir d'un code de production point de vue et probablement moins efficace d'un point de vue de l'exécution. Tous ces 32 registres de garder une trace de. Avec x86 c'est dans l'autre sens: de 6 à 8 registres, avec de "vrais" noms rend le problème plus facile à gérer et inspire plus de confiance que le code produit fonctionnera comme prévu.

Laid? C'est dans l'oeil du spectateur. Je préfère sont "différents".

12voto

R.. Points 93718

Je pense que cette question a une fausse hypothèse. Il est principalement RISC obsédé par les universitaires qui appel x86 laid. En réalité, le x86 ISA pouvez le faire en une seule instruction des opérations qui prendrait 5-6 instructions RISC Isa. RISC fans peuvent compteur moderne les Processeurs x86 briser ces "complexes" instructions en microops; cependant:

  1. Dans de nombreux cas, c'est que partiellement vrai ou pas vrai du tout. Le plus utile "complexe" instructions x86 sont des choses comme mov %eax, 0x1c(%esp,%edi,4) d. modes d'adressage, et ce ne sont pas ventilés.
  2. Ce qui est souvent plus important sur les machines modernes n'est pas le nombre de cycles passé (car la plupart des tâches ne sont pas lié au processeur), mais le cache d'instructions de l'impact de code. 5-6 de taille fixe (généralement 32 bits) instructions auront un impact sur le cache beaucoup plus que d'un complexe d'instruction rarement plus de 5 octets.

x86 vraiment absorbé tous les bons aspects de RISC environ 10-15 ans, et les autres qualités de RISC (en fait, la définition de l'un - le peu d'instruction set) sont nuisibles et indésirables.

Mis à part les coûts et la complexité de la fabrication de Processeurs et de leurs besoins en énergie, x86 est le meilleur ISA. Quelqu'un qui vous dit le contraire est de laisser l'idéologie ou l'ordre du jour obtenir de la manière de leur raisonnement.

D'autre part, si vous êtes cibler les systèmes embarqués, où le coût de la CPU compte, ou incorporé/appareils mobiles, où la consommation d'énergie est une préoccupation majeure, ARM ou MIPS probablement plus de sens. Gardez à l'esprit que vous devez toujours avoir à traiter avec de la ram supplémentaire et binaire de la taille nécessaire pour gérer le code est facilement 3 à 4 fois plus grande, et vous ne serez pas en mesure d'obtenir près la performance. Si cette matière dépend beaucoup de ce que vous allez être en cours d'exécution sur elle.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X