Par exemple. lors de la comparaison de 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?
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
hex ou 00101101
en binaire.
Étape 2. Opcodes vers ALU
Les opcodes arithmétiques comme ADD
, SUB
, MUL
et DIV
effectuent des mathématiques entières de base à l'aide d'un ALU ou Arithmetic Logic Unit construit dans le CPU. Les nombres sont stockés dans 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 GL comme C.
Étape 3. L'ALU, le demi-additionneur et l'additionneur complet
Saviez-vous que toutes les opérations mathématiques que vous connaissez peuvent être réduites à une série de 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 convertie en valeur négative, la soumission de 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 implémentées en utilisant une combinaison de composants électriques qui interagissent pour créer des "portes logiques", telles que celles trouvées dans logique transistor-transistor ou TTL, ou dans CMOS . Cliquez sur 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 micropuce à 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 Java bytecode ou 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.