web-dev-qa-db-fra.com

Le langage machine est-il toujours binaire?

Je ne sais absolument rien dans les trucs de bas niveau, donc ce sera une question très novice. Veuillez excuser mon ignorance.

Le langage machine - la série de chiffres qui indiquent exactement à l'ordinateur physique quoi faire - est-il toujours binaire? C'est à dire. toujours composé de zéros un seul? Ou pourrait-il également être composé de nombres tels que 101, 242, 4, etc.?

22
Aviv Cohn

Tout dans un ordinateur (pour être précis, dans n'importe quel ordinateur contemporain typique) est binaire, à un certain niveau. "1s et 0s" est une abstraction, une idée que nous utilisons pour représenter une manière de distinguer deux valeurs. En RAM, cela signifie une tension plus élevée et plus basse. Sur le disque dur, cela signifie des états magnétiques distincts, etc. En utilisant la logique booléenne et un système numérique de base 2, une combinaison de 1 et de 0 peut représenter n'importe quel nombre, et d'autres choses (telles que des lettres, des images, des sons, etc.) peuvent être représentées sous forme de nombres.

Mais ce n'est pas ce que les gens veulent dire quand ils disent "code binaire". Cela a une signification spécifique pour les programmeurs: le code "binaire" est un code qui n'est pas sous forme de texte. Le code source existe sous forme de texte; il ressemble à un système hautement formalisé de symboles anglais et mathématiques. Mais le CPU ne comprend pas la notation anglaise ou mathématique; il comprend les chiffres. Ainsi, le compilateur traduit le code source en un flux de nombres qui représentent des instructions CPU qui ont la même signification sous-jacente que le code source. C'est ce qu'on appelle le "code machine", mais beaucoup de gens l'appellent "binaire".

47
Mason Wheeler

Jetons un coup d'œil à une instruction machine réelle. Supposons que nous ayons un ARM CPU et que nous voulons ajouter 143 à la valeur dans le registre 2, en plaçant le résultat dans le registre 1. Dans ARM Langage d'assemblage qui est écrit

ADD  R1, R2, #143

Cette instruction d'assemblage peut être encodée comme une seule instruction machine. La spécification de la façon dont cela est fait se trouve à la page physique 156 du ARM ARM , le Manuel de référence d'architecture de machine Acorn RISC nommé de manière amusante. Il est également nécessaire de regarder la définition de "l'opérande shifter", qui commence à la page physique 444.

 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
|    Cond   | 0  0  I  0  1  0  0  S|     Rn    |     Rd    |          shifter operand          |

Comme vous semblez déjà le comprendre, les instructions machine sont nombres, et sur l'ARM, ce sont des nombres d'une taille fixe: 32 bits, divisés en plusieurs champs. Pour encoder l'ADD ci-dessus, nous remplissons les champs comme ceci:

| cond | fmt | I | opcode | S | Rn | Rd | rot | imm |
|    E |  00 | 1 |  0100  | 0 | 2  | 1  | 0   | 143 |

("L'opérande shifter" a été divisé en "rot" et "imm" parce que je mets I = 1.) Maintenant, pour en faire un nombre unique de 32 bits, nous devons le développer en binaire, car la plupart des les champs ne sont pas des nombres de bits bien rangés:

 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
  1  1  1  0  0  0  1  0  1  0  0  0  0  0  1  0  0  0  0  1  0  0  0  0  1  0  0  0  1  1  1  1

Pour les humains, c'est un grand flou; hexadécimal est plus facile à comprendre pour nous:

1110  0010  1000  0010  0001  0000  1000  1111
   E     2     8     2     1     0     8     F

Et donc généralement, en communication avec d'autres humains, nous disons que "l'instruction machine" correspondant à ADD R1, R2, #143 est le nombre hexadécimal E282 108F. Nous pourrions dire également que c'est le décimal numéro 3.800.174.735, mais cela obscurcit le motif des champs plus que hex ne le fait. (Quelqu'un avec beaucoup de pratique de débogage sur le métal nu sur ARM serait capable de choisir le code de condition E, les registres source et de destination 2 et 1, l'opérande immédiat 8F = 143 sur E282 108F avec une relative facilité.)

Toutes les représentations ci-dessus codent la même instruction machine! Je n'ai changé que la façon dont je l'ai écrite.

En termes de "uns et zéros", si vous chargez un programme contenant cette instruction dans RAM sur un ordinateur réel, quelque part en mémoire le modèle de bits 1110 0010 1000 0010 0001 0000 1000 1111 apparaîtra ( éventuellement en arrière, à cause de endianness ). Mais c'est également valable pour dire que quelque part en mémoire le nombre hexadécimal E282 108F, ou l'instruction décodée ADD R1, R2, #143 apparaît. Les modèles de bits dans RAM n'ont aucune signification en eux-mêmes; la signification vient du contexte. Inversement, ce modèle de bits/nombre hexadécimal n'est pas nécessairement une instruction du tout! Il apparaîtrait également dans un programme qui a fait utilisation de l'entier 32 bits non signé 3 800 174 475 ou du nombre à virgule flottante IEEE simple précision -1.199634951 × 1021 as data.

25
zwol

Chaque fois que quelqu'un utilise l'expression "les uns et les zéros" dans la plupart des contextes, en particulier dans ce contexte, ils, à mon avis, dénaturent considérablement ce qui se passe et conduisent ainsi à la confusion.

L'ordinateur ne lit pas vraiment "les uns et les zéros" pas plus que lorsque vous lisez un livre, vous lisez "les lettres". Bien sûr, les deux sont strictement vrais, mais ces déclarations laissent de côté une information substantielle: la structure de chacune.

Dans le cas de l'anglais, les lettres sont structurées en mots, et les mots constituent des phrases, selon un ensemble de règles. L'ordre des lettres dans les mots et l'ordre des mots dans les phrases peuvent changer complètement le sens.

Un processus similaire se joue avec les ordinateurs et le langage machine. L'ordinateur examine les uns et les zéros en morceaux discrets, en octets et en groupes d'octets.

D'autres affiches ont mentionné diverses manières de coder les nombres sous forme de bits individuels. Il y a des entiers, des virgules flottantes, des chaînes de texte, etc., qui donnent une structure au flux de bits et d'octets.

En fin de compte, l'ordinateur examine conceptuellement des groupes de bits, donc il ne regarde que rarement "10101010", ses 101, 242 ou 4, etc. La signification de ces chiffres dépend de leur contexte dans la "phrase" donnée qu'ils font partie de.

10
whatsisname

Tous les numéros stockés dans la plupart des ordinateurs sont techniquement stockés sous forme binaire. Au niveau matériel, tout est représenté comme une série de signaux haute et basse tension. Les signaux haute tension sont des uns/valeurs vraies, les signaux basse tension sont des zéros/valeurs fausses. Ce sont les bits (abréviation de chiffres binaires) mentionnés lorsque l'on parle de machines 32 bits ou 64 bits. Le nombre (32,64) dans ce cas fait référence au nombre de bits pouvant être adressés hors de la mémoire à la fois.

Ainsi, dans la plupart des ordinateurs modernes, le code machine n'est que des valeurs normales stockées en mémoire, mais toute la mémoire est constituée de bits.

5
John Garrard

Presque tous les "ordinateurs" utilisent de nos jours la logique binaire. Cependant, le sens de "ordinateur" après la Seconde Guerre mondiale en est venu à désigner un dispositif informatique avec un stockage persistant et des programmes stockés, plutôt qu'un simple moteur de calcul comme une calculatrice.

Voici quelques exemples d'exceptions:

  • Il peut y avoir quelques systèmes logiques trinaires (ou plus) à billes impaires dans les laboratoires.
  • Il existe quelques calcul analogique systèmes sont utilisés.
  • Un exemple d'un futur système de calcul haute performance n'utilisant pas de logique binaire pourrait être le systèmes de recuit quantique D-Wave .
4
Scott Leadley

Le langage machine n'est pas un langage universel mais plutôt un langage strictement lié au CPU - le langage que le CPU comprend.

Vous pouvez concevoir un processeur qui a 42 états au lieu de 2 états pour le plus petit élément de mémoire. Le problème est que vous ne pouvez pas venir avec une implémentation suffisamment bonne pour un tel processeur. En fait, certains des premiers ordinateurs (y compris ENIAC) étaient ordinateurs décimaux qui utilisaient implicitement un langage machine décimal.

Le fait qu'il soit décimal ou binaire ou une autre valeur dépend du nombre d'états que le plus petit élément de mémoire (un bit) peut prendre; 2 n'a pas été choisi à des fins de conception de CPU mais plutôt limité par une implémentation électronique: un transistor fonctionne beaucoup mieux et plus rapidement avec seulement 2 niveaux de tension au lieu de 10 (ou tout autre nombre naturel supérieur à 2).

1
m3th0dman