es. quando si confrontano due interi come segue in un linguaggio simile a C:
if (3 > 2) {
// do something
}
Com'è il giudizio se 3 è maggiore di 2 (vero) o no (falso) fatto internamente?
Fino in fondo alla tana del coniglio, eh? OK, ci proverò.
Passaggio 1. Da C alla lingua della macchina
Il compilatore C trasforma il tuo confronto in opcode memorizzati nella lingua della macchina . Il linguaggio macchina è una serie di numeri che la CPU interpreta come istruzioni. In questo caso ci sarebbero due opcode: "sottrarre con carry" e "jump se carry". In altre parole, 2 viene sottratto da 3 in una istruzione e l'istruzione successiva verifica se è in overflow. Questi sarebbero preceduti da due istruzioni per caricare i numeri 2 e 3 in posizioni in cui possono essere confrontati.
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"
Ciascuno di questi ha una rappresentazione binaria; ad esempio, il codice per SUB
è 2D
hex, o 00101101
in binario.
Passaggio 2. Opcode a ALU
Gli opcode aritmetici come ADD
, SUB
, MUL
e DIV
eseguono calcoli matematici interi di base usando un ALU o Unità logica aritmetica integrata nella CPU. I numeri sono memorizzati in registri da alcuni opcode; altri opcode indicano al chip di chiamare l'ALU per fare matematica su qualsiasi cosa sia memorizzata nei registri al momento.
Nota: a questo punto siamo ben al di là di qualsiasi cosa che qualsiasi ingegnere del software si preoccupi se lavori con un 3GL come C.
Passaggio 3. L'ALU, mezzo-adder e full-adder
Sapevi che tutte le operazioni matematiche che conosci possono essere ridotte a una serie di operazioni NOR ? E questo è esattamente come funziona l'ALU.
L'ALU sa solo come lavorare con i numeri binari e può eseguire solo operazioni logiche come OR, NOT, AND e XOR. L'implementazione di addizione e sottrazione binaria viene eseguita con una serie di operazioni logiche disposte in un certo modo, in un sottosistema noto come addizionatore . Questi sottosistemi sono composti da una rete di "mezzi sommatori" che operano su due bit e determinano la loro somma a bit singolo e un flag di carry a singolo bit. Collegando questi insieme, l'ALU può eseguire operazioni su numeri con 8, 16, 32 bit ecc.
Eriguardoallasottrazione?Lasottrazioneèsoloun'altraformadiaggiunta:
A-B=A+(-B)
L'ALUcalcola-B
prendendoilB
. Una volta convertito in negativo, l'invio del valore al sommatore comporterà un'operazione di sottrazione.
Passaggio 4: passaggio finale: transistor on-chip
Le operazioni dei sommatori sono implementate usando una combinazione di componenti elettrici che interagiscono per creare "porte logiche", come quelle che si trovano in transitor-transistor logic o TTL, o in CMOS . Fai clic qui per alcuni esempi per vedere come sono cablati.
Su un chip, ovviamente, questi "circuiti" sono implementati in milioni di minuscoli bit di materiale conduttivo e non conduttivo, ma il principio è lo stesso di se fossero componenti di dimensioni complete su una breadboard. Guarda questo video che mostra tutti i transistor su un microchip attraverso l'obiettivo di un microscopio elettronico.
Alcune note aggiuntive:
Il codice che hai scritto verrebbe effettivamente precalcolato dal compilatore e non eseguito in fase di esecuzione, perché è composto esclusivamente da costanti.
Alcuni compilatori non compilano il codice macchina ma introducono ancora un altro livello, ad esempio bytecode Java o linguaggio intermedio .NET. Ma alla fine viene eseguito tutto tramite il linguaggio macchina.
Alcune operazioni matematiche non sono in realtà calcolate; vengono cercati in enormi tabelle su un'unità di elaborazione aritmetica o contengono una combinazione di ricerca, calcolo o interpolazione. Un esempio potrebbe essere la funzione per calcolare una radice quadrata . Le moderne CPU per PC hanno ciascuna un'unità di coprocessing in virgola mobile integrata in ciascun core della CPU.
Leggi altre domande sui tag c algorithms computer-science comparison