Par exemple, lorsque l'on compare deux entiers comme suit dans un langage de type C:
if (3 > 2) {
// do something
}
Comment le jugement si 3 est supérieur à 2 (vrai) ou non (faux) est-il rendu en interne?
Par exemple, lorsque l'on compare deux entiers comme suit dans un langage de type C:
if (3 > 2) {
// do something
}
Comment le jugement si 3 est supérieur à 2 (vrai) ou non (faux) est-il rendu en interne?
Réponses:
Tout le long du terrier du lapin, hein? OK, je vais essayer.
Étape 1. Du C au langage machine
Le compilateur C transforme votre comparaison en opcodes stockés en langage machine . Le langage machine est une série de nombres que le CPU interprète comme des instructions. Dans ce cas, il y aurait deux opcodes: "soustraire avec carry" et "sauter si transporter". En d'autres termes, 2 est soustrait de 3 dans une instruction, et l'instruction suivante vérifie si elle a débordé. Celles-ci seraient précédées de deux instructions pour charger les numéros 2 et 3 dans des emplacements où ils peuvent être comparés.
MOV AX, 3 ; Store 3 in register AX
MOV BX, 2 ; Store 2 in register BX
SUB AX, BX ; Subtract BX from AX
JC Label ; If the previous operation overflowed, continue processing at memory location "Label"
Chacun des éléments ci-dessus a une représentation binaire; par exemple, le code pour SUB
est 2D
hexadécimal ou 00101101
en binaire.
Étape 2. Opcodes vers ALU
Arithmétique opcodes aiment ADD
, SUB
, MUL
et DIV
réaliser des opérations mathématiques de base entier en utilisant une unité logique ALU ou Arithmétique intégré dans le CPU. Les nombres sont stockés dans des registres par certains opcodes; d'autres opcodes demandent à la puce d'appeler l'ALU pour faire des calculs sur tout ce qui est stocké dans les registres à l'époque.
Remarque: À ce stade, nous sommes bien au-delà de tout ce qui pourrait inquiéter un ingénieur logiciel s'il travaille avec un 3GL comme C.
Étape 3. L'ALU, demi-additionneur et additionneur complet
Saviez-vous que toutes les opérations mathématiques que vous connaissez peuvent être réduites à une série d'opérations NOR ? Et c'est exactement ainsi que fonctionne l'ALU.
L'ALU sait uniquement comment travailler avec des nombres binaires et ne peut effectuer que des opérations logiques comme OR, NOT, AND et XOR. La mise en œuvre de l'addition et de la soustraction binaires est accomplie avec une série d'opérations logiques disposées d'une certaine manière, dans un sous-système appelé additionneur . Ces sous-systèmes sont composés d'un réseau de "demi-additionneurs" qui fonctionnent sur deux bits et déterminent leur somme sur un seul bit et un drapeau de report sur un seul bit. En les enchaînant, l'ALU peut effectuer des opérations sur des nombres de 8, 16, 32 etc. bits.
Et la soustraction? La soustraction n'est qu'une autre forme d'addition:
A - B = A + (-B)
L'ALU calcule -B
en prenant le complément à deux de B
. Une fois qu'il est converti en négatif, soumettre la valeur à l'additionneur entraînera une opération de soustraction.
Étape 4: La dernière étape: transistors sur puce
Les opérations des additionneurs sont mises en œuvre en utilisant une combinaison de composants électriques qui interagissent pour créer des "portes logiques", telles que celles trouvées dans la logique transistor-transistor ou TTL, ou dans CMOS . Cliquez ici pour quelques exemples pour voir comment ceux-ci sont câblés.
Sur une puce, bien sûr, ces "circuits" sont implémentés dans des millions de minuscules morceaux de matériau conducteur et non conducteur, mais le principe est le même que s'ils étaient des composants de taille réelle sur une planche à pain. Regardez cette vidéo qui vous montre tous les transistors sur une puce à travers la lentille d'un microscope électronique.
Quelques notes supplémentaires:
Le code que vous avez écrit serait en fait précalculé par le compilateur et non exécuté au moment de l'exécution, car il est composé uniquement de constantes.
Certains compilateurs ne compilent pas en code machine mais introduisent une autre couche, comme le bytecode Java ou le langage intermédiaire .NET. Mais au final, tout est exécuté via le langage machine.
Certaines opérations mathématiques ne sont pas réellement calculées; ils sont recherchés dans des tables massives sur une unité de coprocessing arithmétique, ou contiennent une combinaison de recherche et de calcul ou d'interpolation. Un exemple serait la fonction pour calculer une racine carrée . Les processeurs PC modernes ont chacun une unité de coprocesseur à virgule flottante intégrée dans chaque cœur de processeur.
CMP
serait utilisé, non SUB
- mais là encore, c'est plus ou moins un "où SUB
le résultat est ignoré et seuls les indicateurs sont définis"
if
tout , passant directement au codagedo something
.